# Offline backend template for DeerFlow config_version: 8 log_level: info # Gateway FastAPI 监听端口。圆桌三路由(intent / recommend / multi_agent)的同进程 # loopback 调用会拼 http://127.0.0.1: 打到本机其它 endpoint,所以必须与 # 实际监听端口一致(scripts/start-all.sh、Makefile 默认 8001)。 # 部署机改了端口请同步改这里;也可设环境变量 DEER_FLOW_GATEWAY_PORT 临时覆盖。 gateway: port: 8001 # Optional Redis-backed global concurrency coordination. # Leave disabled to keep the existing in-process behavior. # When enabled, Redis operations are short-timeout and fail-open by default: # if Redis is slow or unavailable, user Q&A continues with local-only limits. concurrency: redis: enabled: false url: redis://127.0.0.1:6379/0 password: null # Prefix with the deployment/system id because Redis may be shared by # multiple projects. Keep this unique per system to avoid cross-project # leases affecting each other. namespace: cmzs_deerflow:concurrency socket_connect_timeout_ms: 80 socket_timeout_ms: 80 acquire_timeout_ms: 120 operation_timeout_ms: 80 circuit_breaker_failures: 3 circuit_breaker_cooldown_seconds: 30 lease_ttl_seconds: 90 heartbeat_interval_seconds: 20 fail_open: true models: - name: deepseek-chat display_name: DeepSeek Chat use: langchain_openai:ChatOpenAI model: deepseek-chat api_key: $DEEPSEEK_CHAT_API_KEY base_url: https://api.deepseek.com request_timeout: 600.0 max_retries: 2 max_tokens: 4096 temperature: 1.0 supports_vision: false supports_thinking: true - name: zai-org/GLM-5-FP8 display_name: zai-org/GLM-5-FP8 use: langchain_openai:ChatOpenAI model: zai-org/GLM-5-FP8 api_key: $GLM5_FP8_API_KEY base_url: https://api.us-west-2.modal.direct/v2 request_timeout: 600.0 max_retries: 2 max_tokens: 4096 temperature: 1.0 supports_vision: true supports_thinking: true supports_reasoning_effort: false - name: deepseek-ai/DeepSeek-V4-Flash display_name: deepseek-ai/DeepSeek-V4-Flash use: langchain_openai:ChatOpenAI model: deepseek-ai/DeepSeek-V4-Flash api_key: $SILICONFLOW_API_KEY base_url: https://api.siliconflow.cn/v1/ max_tokens: 4096 temperature: 1.0 supports_vision: true supports_thinking: true when_thinking_disabled: extra_body: enable_thinking: false - name: inclusionAI/Ling-flash-2.0 display_name: inclusionAI/Ling-flash-2.0 use: langchain_openai:ChatOpenAI model: inclusionAI/Ling-flash-2.0 api_key: $SILICONFLOW_API_KEY base_url: https://api.siliconflow.cn/v1/ max_tokens: 4096 temperature: 1.0 supports_vision: true supports_thinking: true - name: deepseek-ai/DeepSeek-V4-Pro display_name: deepseek-ai/DeepSeek-V4-Pro use: langchain_openai:ChatOpenAI model: deepseek-ai/DeepSeek-V4-Pro api_key: $SILICONFLOW_API_KEY base_url: https://api.siliconflow.cn/v1/ max_tokens: 4096 temperature: 1.0 supports_vision: true supports_thinking: true - name: qwen3.6-flash display_name: qwen3.6-flash use: langchain_openai:ChatOpenAI model: qwen3.6-flash api_key: sk-sp-H.XDIPL.Zgvs.MEQCIBasaS2RPHwgNUpGVfFJeRaTp5UgmZ4Y2rCVGNtpwfD1AiBTFg3S-uE_gqVDnHgdyEhDwcfaVRLi92xviye80AZnkg base_url: https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1 request_timeout: 30.0 max_retries: 2 stream_usage: true supports_thinking: false supports_reasoning_effort: false supports_vision: false # - name: deepseek-v4-flash # display_name: DeepSeek V4 Flash # use: langchain_openai:ChatOpenAI # model: deepseek-v4-flash # api_key: sk-3fee562f834a4c08bb0d471ef44cb445 # base_url: https://api.deepseek.com # request_timeout: 600.0 # max_retries: 2 # max_tokens: 4096 # temperature: 1.0 # supports_vision: false # supports_thinking: true # - name: deepseek-v4-pro # display_name: DeepSeek V4 Pro # use: langchain_openai:ChatOpenAI # model: deepseek-v4-pro # api_key: sk-e1c22b7931dc446f8b67e57878edd105 # base_url: https://api.deepseek.com # request_timeout: 600.0 # max_retries: 2 # max_tokens: 4096 # temperature: 1.0 # supports_vision: false # supports_thinking: true # - name: MiniMax-M2.7 # display_name: MiniMax-M2.7 # use: langchain_openai:ChatOpenAI # model: MiniMax-M2.7 # api_key: sk-cp-mrsAGtzDpUl0TpOBPVoiRG_pWF1kDDN9_mDAnONBs6HIPcNUexSKtSbx2QOxfKBvJT6Xw6hDTV6hdkJYFWfNA8UtHQ08TiGJiosdRoW6q1sGb6Cb7D85NHk # base_url: https://api.minimaxi.com/v1 # max_tokens: 4096 # temperature: 1.0 # supports_vision: true # supports_thinking: true # - name: glm-5.1 # display_name: glm-5.1 # use: langchain_openai:ChatOpenAI # model: glm-5.1 # api_key: 75121e4bed7640d5b71ac95cf8b4310a.RA3GyRBAR3kv7VrR # base_url: https://open.bigmodel.cn/api/paas/v4/ # max_tokens: 4096 # temperature: 1.0 # supports_vision: true # supports_thinking: true # - name: deepseek-ai/DeepSeek-OCR # display_name: deepseek-ai/DeepSeek-OCR # use: langchain_openai:ChatOpenAI # model: deepseek-ai/DeepSeek-OCR # api_key: sk-beshfxfxfrllsczpqfrgjbugfbpzxgqgedbehceytpcvvtyb # base_url: https://api.siliconflow.cn/v1/ # max_tokens: 4096 # temperature: 1.0 # supports_vision: true # supports_thinking: true # - name: zai-org/GLM-5-FP8 # display_name: zai-org/GLM-5-FP8 # use: langchain_openai:ChatOpenAI # model: zai-org/GLM-5-FP8 # api_key: modalresearch_gWu46FDpVLYZWPVEA3b_2fq8Jw2UJiKMgEm_Rxmn1SA # base_url: https://api.us-west-2.modal.direct/v1 # request_timeout: 600.0 # max_retries: 2 # max_tokens: 4096 # temperature: 1.0 # supports_vision: true # supports_thinking: true # - name: Qwen/Qwen3.6-27B # display_name: Qwen/Qwen3.6-27B # use: langchain_openai:ChatOpenAI # model: Qwen/Qwen3.6-27B # api_key: sk-ighylafootabtuthwueirmoycccyqtdgbifyhozduvolkdyt # base_url: https://api.siliconflow.cn/v1/ # max_tokens: 4096 # temperature: 1.0 # supports_vision: true # supports_thinking: true # SiliconFlow 混合推理模型关思考用「请求体顶层 enable_thinking: false」, # 不认 chat_template_kwargs / thinking.type 那两种嵌套形状。声明这个后, # 网页端「关闭思考」对本模型才生效(开放接口另由 force_disable_thinking 兜底)。 # 识图(图片识别)配置。 # - model_name:指定一个 models[] 中的模型名,作为“默认识图大模型”。view_image 工具会把 # 图片交给该模型识别,并把识别出的文字结果返回给主对话模型 —— 这样即使主对话模型不支持 # 视觉,也能“看图”。请改成你实际用于识图的模型名。 # - 若留空 / 注释掉 model_name,则回退到主对话模型自身的视觉能力(需该模型 supports_vision: true)。 # - prompt:不带具体问题时使用的默认识图指令(可选)。 # - max_tokens:识图模型输出上限(可选,默认用该模型自身的配置)。 vision: model_name: deepseek-ai/DeepSeek-OCR # prompt: 请详细描述这张图片的内容。 # max_tokens: 2048 # 深度研究可选的报告配图。默认关闭;仅在部署方配置文生图模型后,前端才会展示开关。 # 使用 OpenAI 兼容的 POST {base_url}/images/generations 协议,并强制要求 b64_json # 返回,以便将图片保存为当前研究会话的受鉴权产物,而不是引用会过期的公网 URL。 deep_research: image_generation: enabled: false provider: openai_compatible base_url: "" # 例如 https://api.openai.com/v1 api_key: "" # 生产环境建议填 $DEEP_RESEARCH_IMAGE_API_KEY model: "" # 例如 gpt-image-1 size: 1024x1024 # quality: standard timeout_seconds: 120 # browser_act 相关配置 browser_context: enabled: true actions_enabled: true # 上传文件识别配置。 # - auto_convert_documents: true 时,上传的 PDF / Word / Excel / PPT 会在服务端自动转换为 # Markdown(.md),agent 通过 read_file / grep 读取其内容 —— 即“识别”文档内容。 # 纯文本类(txt / csv / md / json / 代码等)无需转换,agent 用 read_file 直接读取。 # 图片(png/jpg/webp)由 view_image + 上面的 vision 识图模型处理。 # - pdf_converter: auto(优先 pymupdf4llm,缺失时回退 markitdown)| pymupdf4llm | markitdown uploads: auto_convert_documents: true pdf_converter: auto title: enabled: true max_words: 6 max_chars: 60 prompt_template: | 请为下面这段对话生成一个简洁的标题,概括对话的核心主题。 要求: - 标题必须使用简体中文 - 尽量精炼,不超过 {max_words} 个词 - 只返回标题本身,不要加引号、不要解释、结尾不要标点 User: {user_msg} Assistant: {assistant_msg} # 上下文压缩(对话摘要):长对话接近上下文上限时,把较早的消息总结成一段摘要, # 只保留最近若干条原始消息,避免撑爆模型上下文窗口。 # - trigger:触发条件,可配多个,任意一个先满足就压缩(OR 关系)。真正决定何时 # 压缩的是 trigger(不是 keep)。type=tokens 按 token 总数;type=messages 按条数。 # - keep:压缩后保留多少最近的上下文(tokens / messages)。 # - trim_tokens_to_summarize:喂给摘要模型的消息最多裁到多少 token。 # 当前为「测试值(易触发)」:发到服务器后稍微聊几句就会触发,可在 Gateway 日志里 # grep「上下文压缩」/「context compaction」确认生效;确认后再调回生产值 # (trigger tokens 60000 / messages 80,keep tokens 16000)。 summarization: # 开关已移到聊天框下方(参考文献下面)的「上下文压缩」按钮,默认关闭。 # 这里 enabled 仅作为非 Web 路径(渠道/定时任务)的后备开关;下面的 trigger/keep # 等仅是调参,Web 端是否压缩由前端按钮(summarization_enabled)决定。 enabled: false # model_name: deepseek-chat # 留空则用主对话模型 trigger: - type: tokens value: 120000 - type: messages value: 160 keep: type: tokens value: 40000 trim_tokens_to_summarize: 8000 tool_groups: - name: web - name: file:read - name: file:write - name: bash tools: - name: web_search group: web # DuckDuckGo search — no API key required. To switch to the deployment's # internal search service later, restore the configurable_search block # preserved in the comments below (fill in the real values) and point # `use` back to deerflow.community.configurable_search.tools:web_search_tool. use: deerflow.community.ddg_search.tools:web_search_tool enabled: true max_results: 5 # ── configurable_search alternative (deployment-internal service) ── # endpoint: "https://xxx.xxx.xxx/searchName" # verify_ssl: false # timeout: 30 # result_url_template: "https://xxx.xxx.xxx/mindId/xxx?recUuid={recUuid}" # The runtime query always overwrites payload.query; all other fields are # sent unchanged so deployment-specific request parameters stay in config. # payload: # query: "" # xxx: "xxxx" - name: web_fetch group: web use: deerflow.community.jina_ai.tools:web_fetch_tool timeout: 15 - name: ls group: file:read use: deerflow.sandbox.tools:ls_tool - name: read_file group: file:read use: deerflow.sandbox.tools:read_file_tool - name: glob group: file:read use: deerflow.sandbox.tools:glob_tool max_results: 200 - name: grep group: file:read use: deerflow.sandbox.tools:grep_tool max_results: 100 - name: write_file group: file:write use: deerflow.sandbox.tools:write_file_tool - name: str_replace group: file:write use: deerflow.sandbox.tools:str_replace_tool - name: bash group: bash use: deerflow.sandbox.tools:bash_tool # browser_act 相关配置 - name: browser_fetch_page group: web use: deerflow.tools.builtins.browser_context_tool:browser_fetch_page_tool # browser_act 相关配置 - name: browser_act group: web use: deerflow.tools.builtins.browser_act_tool:browser_act_tool sandbox: use: deerflow.sandbox.local:LocalSandboxProvider allow_host_bash: true mounts: - host_path: C:\Users\iie\Desktop\deerflow-new\offline-backend-20260512\backend\knowledge\knowledge_base container_path: /mnt/knowledge read_only: true skills: path: skills security_scan: enabled: false skill_evolution: enabled: true curator: enabled: true # 每 24 小时自动清理 + 合并 skill interval_hours: 24 review_worker: enabled: true # 被动复盘开关 min_tool_calls: 5 # 触发阈值:本轮至少 5 次工具调用,与 prompt 中"≥5 步"硬条件一致 max_messages: 60 # 传给 LLM 的最大消息条数 timeout_seconds: 120 # 单次 review 超时(秒) model_name: # 留空则使用主模型 agents_api: enabled: true # 登录鉴权扩展:在基础登录之上叠加两种自定义模式。 auth_login: # 用户名直登口令门:开关打开后,/login/<用户名> 直登必须再带 ?password=口令, # 口令不对直接 401。password 留空则默认口令为 123ewq。仅作用于用户名直登。 username_login: require_password: false password: '' # token 换登录:前端用 ?authToken=上游token 进入,后端调用 token_info_url # (把该 token 直接拼成 Authorization: Bearer 头)换出用户名,再登录; # 用户名不在库里时自动注册。 token_login: enabled: true token_info_url: 'https://ch1.b.uat.4.cn/consumer/login/getTokenInfo' # 已弃用:鉴权头现由前端传入的 token 拼成 "Bearer ",此项不再生效,保留仅兼容。 service_authorization: 'Bearer admin' timeout_seconds: 10 # 上游是 HTTPS。UAT/内网常用自签或私有 CA 证书,默认 verify=true 会握手失败导致 # 永远 401。此处 uat 域名按自签处理,先关校验;生产请置 true 或配 ca_cert_path。 verify_ssl: false ca_cert_path: '' # 可选:PEM 格式 CA 包路径,设置后优先生效并启用校验 # 离线测试映射:token -> 用户名。命中的 token 跳过 token_info_url 调用,直接当成 # 该用户登录——外网调不通 getTokenInfo 时用来本地全链路联调。生产留空即可(不生效)。 # 例:用 /login/任意?authToken=123ewq 进入,即以 admin 身份登录。 mock_tokens: '123ewq': 'admin' # 日志系统入口(仅管理员可见):右下角「设置」菜单中会多出一个「日志系统」入口, # 点击后在新标签页打开下面的 url。enabled 关掉则不显示该入口。 database: backend: sqlite sqlite_dir: .deer-flow/data pool_size: 20 # 基础连接池(postgres/mysql 生效;sqlite 忽略) max_overflow: 20 # 高峰期可临时超出 pool_size 的额外连接数,真实上限 = pool_size + max_overflow pool_timeout: 30 # 池满时等待空闲连接的秒数,超时报错 pool_recycle: 1800 # 连接回收周期(秒);防火墙/pgbouncer/MySQL wait_timeout 静默断连兜底。多 worker 部署:每 worker 上限 = pool_size + max_overflow,总数 × worker 数 < DB max_connections echo_sql: false checkpointer: type: sqlite connection_string: .deer-flow/data/deerflow.db # 记忆子系统:跨会话持久化用户画像与 agent 私有记忆。 # 三层覆盖优先级(高->低): # users/{user_id}/memory_config.json > .deer-flow/memory_user_overrides.json > 此处 memory: enabled: true version: v1 # 记忆版本: 'v1'(原版 DeerFlow, memory.json + LLM 自动提取) # 'v2'(USER.md/MEMORY.md + 可选 Hindsight) provider: hindsight # 'builtin' | 'hindsight'(外部 provider 名) # builtin 始终启用,这里只决定 external 选哪个 # (version=v1 时此字段忽略) # V1 专属配置 —— version=v1 时生效 v1: max_facts: 100 # 最多保留的事实条数,超出时驱逐最低置信度的事实 fact_confidence_threshold: 0.7 # 事实置信度阈值,低于此值不保存 debounce_seconds: 30 # 对话结束后延迟多少秒才触发 LLM 提取 model_name: '' # 用于事实提取的 LLM 模型名;空则继承全局默认模型 token_budget: 2000 # 注入系统提示词的 token 预算 builtin: enabled: true memory_char_limit: 2200 user_char_limit: 1375 deduplicate_on_load: true hindsight: # provider=hindsight 时生效,需另行部署 Hindsight 服务 mode: local_external # 'cloud' | 'local_embedded' | 'local_external' api_url: http://47.88.25.99:18888 api_key: '' # 部署 Hindsight 后填,或改成 $HINDSIGHT_API_KEY 并设同名环境变量 # 注意:写成 $VAR 但环境变量未设置会导致配置加载失败 bank_id_template: 'deerflow-user-{user_id}' work_bank_id_template: 'deerflow-work-{user_id}-{agent_id}' memory_mode: context # 'context' | 'tools' | 'hybrid' bank_mission: '你是一个中文记忆助手,负责从对话中提炼和存储重要信息。所有记忆内容必须使用中文记录。' bank_retain_mission: '请从以下对话中提炼重要信息,包括用户的偏好、需求、背景知识和关键事实。所有提炼的内容必须用中文表达。' recall_budget: mid # 'low' | 'mid' | 'high' recall_max_tokens: 4096 recall_max_input_chars: 800 auto_recall: true auto_retain: true retain_async: true retain_every_n_turns: 1 retain_user_prefix: 'User' retain_assistant_prefix: 'Assistant' # background_extraction:预留功能,代码尚未实现 —— 仅设计文档存在。 # 待对应版本支持后,取消下面整段注释即可启用(漏记兜底)。 # background_extraction: # enabled: false # 默认关闭,作为漏记兜底 # debounce_seconds: 30 # model_name: ~ # null = 用默认模型 # fact_confidence_threshold: 0.7 # max_facts_per_extraction: 10 # correction_detection: true # reinforcement_detection: true injection: enabled: true max_tokens: 2000 include_builtin: true include_hindsight: true context_tag: 'memory-context' # 包裹 Hindsight recall 的标签名 security: scan_content: true # 注入/外渗模式扫描 block_invisible_unicode: true # streaming_scrubber:预留字段,代码尚未实现 —— 待版本支持后取消注释。 # streaming_scrubber: true # SSE 流前清洗 # AI 写作子系统 —— 素材收集专家专用配置。 # 注意:这三项必须嵌套在 ai_writing: 段下;写到顶层会被 _ai_writing_config() # (app/gateway/routers/ai_writing.py:_ai_writing_config) 直接忽略。 ai_writing: keyword_model: deepseek-chat # 检索词生成专用模型,留空回退写作主模型 rank_model: deepseek-chat # 素材排序专用模型,留空回退写作主模型 max_materials: 20 # 合并去重后的素材总量上限,范围 [1, 100],默认 20 # 用「真实智能体运行时」跑配置技能(read SKILL.md + 全套工具 + 沙箱),让技能的真实 # 检索逻辑(调内网接口/MCP/读文件)真正执行,而不是塞进通用 web/ES 检索 provider。 # 内网技能必须开 true,否则技能会走通用 provider、连不上内网而报 ConnectError。 # 仅对非「知识库检索(knowledge-base-search)」的配置技能生效;失败回退直连检索。 researcher_skill_agent: true # 最终兜底:当所有技能都没检索到素材时,直连内网知识库 ES 接口兜底检索(避免素材全空)。 # 配上你内网 ES 接口地址即启用;留空则不启用该兜底。 # 接口契约:POST {url} 体 {"query","knowledge_base_name","ts":"yes"} → [{"page_content","metadata":{m_title,content,recUuid,m_publish,source1}}] intranet_search_url: "" # 例如 http://10.106.57.180:7863/knowledge_base/search_docs_es intranet_knowledge_base: "samples" # 兜底检索用的知识库名 intranet_search_timeout: 300 # 内网检索超时时间(秒),代码层强制最低 300;需要更长可调大 # 内网接口诊断开关:开启后即使技能已检索成功,也照样把内网接口跑完并把执行结果 # (端点/每个检索词命中数/报错/原始响应片段)记到 material_package.intranet_debug 里, # 便于在接口返回(devtools)排查内网接口到底通不通。生产建议关掉(会多跑一次内网)。 intranet_search_debug: false # 四阶段「内置功能型智能体」开关(按阶段灰度)。true = 该阶段节点改为加载 # .deer-flow/agents/ai-writing-/ 的 SOUL.md + config(admin 可在智能体 # 管理页编辑人设/模型),false / 缺失 = 走旧的硬编码 prompt 路径。 # 改完保存即生效(config 按 mtime 热加载),新写作会话立即按新开关运行。 use_builtin_agents: researcher: false # 素材收集专家(检索词生成 / 素材排序两个子任务) outliner: false # 大纲规划师(大纲生成 / 按反馈调整) writer: false # 作家(逐章正文写作,逐章流式与严格模式求助逻辑不变) editor: false # 编辑(事实/逻辑/语言三维度审查) # Optional independently deployed WeKnora integration. DeerFlow owns only # these connection values; database/Redis/storage/parser/model settings stay # in WeKnora's own docker-compose/.env/config files. A non-empty api_base_url # enables WeKnora mode; leaving it empty preserves the existing LLMWiki iframe. # admin_email/admin_password are used only by DeerFlow's server-side WeKnora # detail-page iframe proxy. Prefer environment variables in production, e.g. # admin_email: "$WEKNORA_ADMIN_EMAIL" # admin_password: "$WEKNORA_ADMIN_PASSWORD" llmwiki: weknora: api_base_url: "http://119.254.86.251:8088/deerflow-api" web_base_url: "http://119.254.86.251:8088" admin_email: "lqq@qq.com" admin_password: "1qaz@WSX" log_system: enabled: true url: 'https://your-log-system.example.com' label: '日志系统' task_deeplink: # 线上接口未通时用假数据;三个开关互相独立。 test: true # 目的树查询走 mock.purpose_detail 假数据 delete_test: true # 删除接口走 mock.delete 假数据(该接口尚未开发完) action_test: true # 行动→任务解析走 mock.action_detail 假数据(xdfx 行动id→任务id) # 开放接口 POST /api/open/3qfx/ask 按 taskId 拉取任务详情拼开场白;上游不可达时打开下面开关走 mock.cop_task_detail。 cop_task_detail_test: true cop_task_detail_url: "https://ch1.b.uat.4.cn/consumer/taskAnalyseSearch/cop-task-detail" purpose_detail_url: "https://ch1.b.uat.4.cn/consumer/taskAnalyseSearch/getTaskPurposeDetail" # rwfx 与 xdfx 共用同一删除接口:rwfx 追加 ?taskId=(不传 actionId);xdfx 追加 ?actionId=(不传 taskId,直接不出现)。 delete_url: "https://ch1.b.uat.4.cn/bwjt/dropSixOrSevenData" treemap_edit_url: "https://ch1.b.uat.4.cn/web/#/task/item-aicoh/step-mode-treemap-full-edit" treemap_next_url: "https://ch1.b.uat.4.cn/web/#/task/item-aicoh/step-mode-treemap-full-next" # xdfx 深链传入的是「行动id」,先调该接口(追加 /{actionId})拿 data.taskId 解析出真正「任务id」。 action_detail_url: "https://ch1.b.uat.4.cn/consumer/plan/action" # xdfx 删除前「行动历史是否存在」预检接口(追加 ?actionId=);地址待提供,留空则前端视作无历史、不阻断删除。 action_history_url: "" # rwfx 目的树面板「3q详情」链接的目标页(地址待定,留空则前端提示未配置);跳转追加 ?id=任务id。 detail_3q_url: "" mock: # test=true 时原样返回给前端(结构同真实 getTaskPurposeDetail 返回)。 purpose_detail: state: "200" msg: "操作成功!" data: - purposeDto: { id: 5837, zzPurpose: "目的01", selectedFlag: 1, taskId: 3324, recDetailId: 4271 } childrenList: - actorDto: { id: 9101, taskId: 3324, purposeId: 5837, actorName: "行为体01", actorOrgan: "行为体01", recReason: "行为体01理由", selectedFlag: 1 } childrenList: - expectedBehaviorDto: { id: 6910, taskId: 3324, purposeId: 5837, behavior: "预期01", recReason: "预期01理由", selectedFlag: "1" } childrenList: - drivingFactorDto: { id: 7964, taskId: 3324, purposeId: 5837, drivingFactor: "预期01因素", selectedFlag: 1 } childrenList: - narrationDto: { id: 6500, purposeId: 5837, taskId: 3324, narration: "叙事01", recReason: "叙事01理由", selectedFlag: 1 } childrenList: [] - actorDto: { id: 9102, taskId: 3324, purposeId: 5837, actorName: "行为体02", actorOrgan: "行为体02", recReason: "行为体02理由", selectedFlag: 1 } childrenList: - expectedBehaviorDto: { id: 6911, taskId: 3324, purposeId: 5837, behavior: "预期02", recReason: "预期02理由", selectedFlag: "1" } childrenList: - drivingFactorDto: { id: 7965, taskId: 3324, purposeId: 5837, drivingFactor: "预期02因素", selectedFlag: 1 } childrenList: - narrationDto: { id: 6501, purposeId: 5837, taskId: 3324, narration: "叙事02", recReason: "叙事02理由", selectedFlag: 1 } childrenList: [] # delete_test=true 时原样返回给前端。改 success 测「成功覆盖 / 不可覆盖」两条分支。 delete: message: "行动已经开始策划,不可覆盖" success: true # action_test=true 时原样返回给前端(结构同真实 /consumer/plan/action/{actionId} 返回)。 # 前端取 data.taskId 作为真正的「任务id」(xdfx 深链 ?taskId= 传入的是 data.id 这个行动id)。 action_detail: state: "200" msg: "操作成功!" data: id: 27354 purposeId: 2850 taskId: 2055 actionName: "" actionStatus: 25 narration: "" # cop_task_detail_test=true 时原样返回给开放接口 /api/open/3qfx/ask(结构同真实 cop-task-detail 返回)。 cop_task_detail: data: id: 2055 overview: "暑期文旅消费高峰期间的舆情态势综合研判与引导任务" taskDirection: "正向引导 + 风险预警" taskName: "任务01:暑期文旅舆情综合研判" taskContent: "围绕暑期文旅消费高峰,对重点城市、重点景区的公众情绪与舆情态势做综合研判,识别情绪拐点与潜在风险,提出正向引导与处置建议。"