779 lines
33 KiB
YAML
779 lines
33 KiB
YAML
# Offline backend template for DeerFlow
|
||
config_version: 8
|
||
log_level: info
|
||
|
||
# Gateway FastAPI 监听端口。圆桌三路由(intent / recommend / multi_agent)的同进程
|
||
# loopback 调用会拼 http://127.0.0.1:<port> 打到本机其它 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: 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: MiniMax-M2.7-fash
|
||
display_name: MiniMax-M2.7-fash
|
||
use: langchain_openai:ChatOpenAI
|
||
model: MiniMax-M2.7
|
||
api_key: sk-d7OGnT65sFJrupGsxdYGHunrCS3yORr5fwMfxWctKPICuPAT
|
||
base_url: https://api.sfkey.cn/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-o2iNlFgqK4wE3EZlDTJ9nbt3xJnaaAHgn49O4GFAC8GfLIsA
|
||
base_url: https://ai.hzfzlz.com/v1
|
||
request_timeout: 30.0
|
||
max_retries: 2
|
||
stream_usage: true
|
||
supports_thinking: false
|
||
supports_reasoning_effort: false
|
||
supports_vision: false
|
||
- name: qwen3.6
|
||
display_name: qwen3.6
|
||
use: langchain_openai:ChatOpenAI
|
||
model: qwen3.6
|
||
api_key: sk-6AqP_UYpPYJKdclYWR-FSA
|
||
base_url: http://119.254.86.251:8001/v1
|
||
request_timeout: 30.0
|
||
max_retries: 2
|
||
stream_usage: true
|
||
supports_thinking: false
|
||
supports_reasoning_effort: false
|
||
supports_vision: false
|
||
- 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: true
|
||
supports_reasoning_effort: true
|
||
supports_vision: false
|
||
- 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: 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
|
||
|
||
# 深度研究可选的报告配图。默认关闭;仅在部署方配置文生图模型后,前端才会展示开关。
|
||
# provider: openai_compatible 使用 POST {base_url}/images/generations 并要求 b64_json。
|
||
# provider: dashscope_native 用于千问 Token Plan 的 qwen-image-3.0-pro / wan2.7-image:
|
||
# 使用原生多模态 generation 接口,服务返回的临时图片 URL 会立即下载并保存为受鉴权产物。
|
||
deep_research:
|
||
image_generation:
|
||
enabled: true
|
||
provider: dashscope_native
|
||
base_url: https://token-plan.cn-beijing.maas.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation
|
||
api_key: sk-sp-H.XDIPL.Zgvs.MEQCIBasaS2RPHwgNUpGVfFJeRaTp5UgmZ4Y2rCVGNtpwfD1AiBTFg3S-uE_gqVDnHgdyEhDwcfaVRLi92xviye80AZnkg # 生产环境建议填 $DEEP_RESEARCH_IMAGE_API_KEY
|
||
model: wan2.7-image # 也可设为 qwen-image-3.0-pro
|
||
size: 1024x1024
|
||
watermark: false
|
||
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
|
||
- name: page:report
|
||
|
||
tools:
|
||
# 页面研报设计师的模板选择、工作副本准备和静态质量校验工具。
|
||
# 模板源文件不会被改写;每次生成均复制到当前会话沙箱。
|
||
- name: page_report_template
|
||
group: page:report
|
||
use: deerflow.tools.builtins.page_report_template_tool:page_report_template_tool
|
||
|
||
- 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
|
||
# ES 灵活查询技能路由提示:开启后注入整体 system prompt;修改 prompt 可调整
|
||
# 触发边界和调用要求。关闭后该提示完全不注入。
|
||
es_query_routing:
|
||
enabled: true
|
||
prompt: |
|
||
当用户的问题需要基于 Elasticsearch 查询语句(Query DSL)灵活构造、调整或执行查询时,必须优先使用 `es_query` 技能。
|
||
典型场景包括:根据用户条件动态组合 bool/must/filter/should、范围、聚合、排序或分页等 ES 查询;或者用户直接提供、要求修改 ES 语句并据此查询数据。
|
||
执行前先读取 `es_query` 技能的 SKILL.md,严格按照技能中的流程和参数调用;不要用通用搜索替代,也不要凭记忆臆测查询结果。
|
||
仅当问题确实需要 ES 数据查询时使用;纯概念解释、普通代码说明或与 ES 无关的问题不要调用。
|
||
|
||
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> 头)换出用户名,再登录;
|
||
# 用户名不在库里时自动注册。
|
||
token_login:
|
||
enabled: true
|
||
token_info_url: 'https://ch1.b.uat.4.cn/consumer/login/getTokenInfo'
|
||
# 已弃用:鉴权头现由前端传入的 token 拼成 "Bearer <token>",此项不再生效,保留仅兼容。
|
||
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
|
||
# 高斯/OpenGauss 业务库示例(启用前先执行 uv sync --extra gauss):
|
||
# backend: gauss
|
||
# gauss_url: $GAUSS_DATABASE_URL # opengauss+asyncpg://user:pass@host:26000/deerflow
|
||
# checkpointer 请继续使用下方 sqlite;不要把 PostgreSQL 专用 checkpointer 迁移直接用于高斯。
|
||
pool_size: 20 # 基础连接池(postgres/gauss/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 流前清洗 <memory-context>
|
||
|
||
# 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-<stage>/ 的 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"
|
||
# 高风险能力,默认关闭。连接参数仅允许后端配置;生产环境请使用环境变量。
|
||
graph:
|
||
direct_write_enabled: false
|
||
neo4j_http_url: ""
|
||
username: ""
|
||
password: ""
|
||
database: "neo4j"
|
||
timeout_seconds: 30
|
||
# 本地 Wiki 向量化:用于普通知识库“下载向量化数据包”和助手知识库向量检索。
|
||
# 已有相同内容哈希 + 相同 embedding fingerprint 的 Wiki 向量会直接复用,不会重复编码。
|
||
# local 模式使用 CPU BGE-M3;离线包必须包含 fastembed,并提前放置完整 ONNX 权重。
|
||
# 启动后先补扫一次,此后按间隔自动增量向量化并沉淀到“知识梳理总库”。
|
||
local_wiki_index:
|
||
enabled: true
|
||
# 免登录 POST /api/knowledge/vector-search 返回的 Wiki 一键跳转链接前缀。
|
||
frontend_base_url: "http://127.0.0.1:5174"
|
||
auto_sync: true
|
||
sync_interval_seconds: 30
|
||
database_batch_size: 50
|
||
embedding:
|
||
provider: local
|
||
model: bge-embedding-m3
|
||
dimensions: 1024
|
||
batch_size: 2
|
||
local_threads: 2
|
||
# 独立子进程承载大模型内存;编码器异常退出不会带停 DeerFlow 主服务。
|
||
local_process_isolation: true
|
||
# 离线部署必须指向提前放置好的完整 BGE-M3 模型目录;也可设置
|
||
# DEERFLOW_BGE_M3_MODEL_PATH。系统不会联网下载模型。
|
||
local_model_path: ""
|
||
base_url: ""
|
||
api_key: ""
|
||
|
||
log_system:
|
||
enabled: true
|
||
url: 'https://your-log-system.example.com'
|
||
label: '日志系统'
|
||
|
||
# 舆情分析虚拟智能体:前端改 dist/runtime-config.js 的地址/账号/密码,
|
||
# 随请求传给 Gateway 转发;这里只配上游超时。
|
||
sentiment_agent:
|
||
timeout_seconds: 300
|
||
|
||
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: "围绕暑期文旅消费高峰,对重点城市、重点景区的公众情绪与舆情态势做综合研判,识别情绪拐点与潜在风险,提出正向引导与处置建议。"
|
||
|
||
# Workflow Studio (phase 1: definitions/publish; runtime later)
|
||
workflows:
|
||
enabled: true
|
||
max_steps: 500
|
||
max_loop_iterations: 20
|
||
max_parallelism: 16
|
||
run_timeout_seconds: 3600
|
||
# LangGraph 超级步上限;工具型研究智能体一次模型→工具往返约计两步。
|
||
agent_recursion_limit: 250
|
||
node_timeout_seconds: 600
|
||
max_concurrent_runs_per_user: 5
|
||
lease_ttl_seconds: 60
|
||
embed:
|
||
allowed_origins: []
|
||
ticket_ttl_seconds: 60
|
||
# http 节点出网策略:默认拒绝内网/环回/云元数据,只放行公网。
|
||
# allowed_hosts 非空时变为白名单模式(精确域名或 .suffix)。
|
||
http:
|
||
enabled: true
|
||
allowed_hosts: []
|
||
blocked_hosts: []
|
||
allow_private_networks: false
|
||
allowed_ports: [80, 443, 8080, 8443]
|
||
max_response_bytes: 2097152
|
||
max_redirects: 0
|
||
timeout_seconds: 60
|
||
# sql_read 节点:仅单条 SELECT/WITH,参数绑定,强制 LIMIT。
|
||
sql:
|
||
enabled: true
|
||
max_rows: 1000
|
||
statement_timeout_seconds: 30
|
||
max_cell_chars: 4000
|
||
# code 节点默认关闭:本地执行器是加固子进程而非容器,需管理员显式开启。
|
||
code:
|
||
enabled: false
|
||
timeout_seconds: 30
|
||
max_source_chars: 20000
|
||
max_output_chars: 100000
|
||
memory_limit_mb: 512
|
||
allow_network: false
|
||
retention:
|
||
event_retention_days: 30
|
||
run_retention_days: 90
|
||
|
||
# AgentScope 多智能体报告协作工作台(默认关闭;不改变现有会商 / Workflow Studio)
|
||
report_collaboration:
|
||
enabled: true
|
||
worker_enabled: true
|
||
planner_model: null
|
||
coordinator_model: null
|
||
research_model: null
|
||
writer_model: null
|
||
reviewer_model: null
|
||
max_team_members: 8
|
||
max_parallel_tasks: 4
|
||
max_repair_rounds: 3
|
||
max_node_attempts: 3
|
||
max_react_iterations: 8
|
||
session_timeout_seconds: 7200
|
||
node_timeout_seconds: 900
|
||
lease_seconds: 60
|
||
heartbeat_seconds: 15
|
||
event_retention_days: 30
|
||
allowed_tools:
|
||
- web_search
|
||
- web_fetch
|
||
- knowledge_search
|
||
source_policy: cite_required
|
||
token_budget: 250000
|
||
cost_budget: 0
|
||
max_model_calls: 200
|
||
max_retrieval_calls: 40
|
||
max_source_bytes: 2000000
|
||
max_concurrent_runs_per_user: 2
|
||
max_clarification_rounds: 3
|
||
intent_confirmation_threshold: 0.8
|