deer-flow/CHANGELOG_zh.md
Willem Jiang 26ba0b9e6a
doc(changelog): update the changelog with the latest status of 2.1.0 PRs (#4484)
* doc(changelog): update the change log files with latest PR status in mile-stone 2.1.0

* Added the chinese version changelog update
2026-07-27 11:00:48 +08:00

1169 lines
75 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 更新日志
本文件记录 DeerFlow 的所有重要变更。
格式参考 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/)
版本号遵循 [语义化版本规范](https://semver.org/lang/zh-CN/)。
[English](./CHANGELOG.md) | 中文
## [未发布]
本节累积面向 **2.1.0** 里程碑([里程碑 2](https://github.com/bytedance/deer-flow/milestone/2))的工作。
### ⚠ 不兼容变更Breaking Changes
- **沙箱:** E2B 现在将 `sandbox.replicas` 作为进程级容量上限来强制执行。默认的
`wait` 策略会等待 `acquire_timeout`随后令当前智能体回合失败。DeerFlow 不会自
动重试该回合。可使用 `burst` 配合 `burst_limit` 允许有限地超出额度多开 VM。`reject`
策略可在返回容量错误前先回收一个预热 VM。([#4391])
- **技能:** 包含 `SKILL.md` 的目录现在是一个运行时包边界。该包内嵌套的 `SKILL.md`
文件被视为支撑数据,不再注册为独立技能;若自定义目录结构较为特殊,需将可独立加
载的技能移到不带自身 `SKILL.md` 的命名空间目录下。([#4098])
- **记忆:** 记忆系统现已可插拔(`memory.manager_class` 选择后端;默认 `deermem`
自包含。DeerMem 私有配置从 `memory:` 顶层移入 `memory.backend_config``/memory/config`
响应(以及 `client.get_memory_config()`)的结构也发生了变化。([#4122])
- **记忆:** `/memory/config``client.get_memory_config()` 不再返回扁平的 DeerMem
字段(`storage_path``max_facts``debounce_seconds``token_counting``guaranteed_*`
`staleness_*` 等)。改为返回 `{enabled, mode, injection_enabled, manager_class,
backend_config}`,其中 `backend_config` 是一个由当前后端自行解释的不透明 dict
。记忆*数据*响应(`/memory``/memory/status` 的 data未变。读取旧扁平字段的
外部 API / SDK 客户端需改为读取 `backend_config`。([#4122])
- **记忆:** 自定义 `memory.storage_class` 发生迁移:旧的默认路径 `deerflow.agents.memory.storage.FileMemoryStorage`
已不存在(现为 `deerflow.agents.memory.backends.deermem.deermem.core.storage.FileMemoryStorage`
)。自定义 `MemoryStorage` 子类的 `__init__` 必须接受 `config`(此前为无参)。
损坏或过期的 `storage_class` 会记录错误并回退到 `FileMemoryStorage`(不会崩溃
)——请更新路径与签名以恢复使用。([#4122])
- **记忆:** `storage_path` 的语义由“文件路径”改为“根目录”。抽象化之前,绝对 `storage_path`
是共享的记忆文件(不按用户隔离),相对值则是 data base_dir 下的全局文件。现在
`storage_path`(无论绝对或相对)都是根目录;按用户的记忆存放在 `{storage_path}/users/{uid}/memory.json`
。若升级后仍保留旧的默认 `storage_path: memory.json`(一个相对文件名),会导致
按用户的记忆孤立,或在保存时触发 `NotADirectoryError`。因此旧版迁移会**带告警
丢弃以 `.json` 结尾的文件式 `storage_path` 值**,且当 `storage_path` 解析到一
个已存在的文件时工厂会**抛出异常**。如需自定义根目录,请将 `memory.backend_config.storage_path`
设置为一个目录。([#4122])
- **记忆:** 当 `memory.mode: tool` 搭配一个未实现 `search()` 的后端时,现在会在
Gateway 启动时由 `MemoryManager` 的不变量校验快速失败并抛出 `ValueError`,而不
是启动成功后在每次 `memory_search` 调用时静默返回空结果。两个内置后端都实现了
`search()`DeerMem 会检索,`noop` 返回 `[]`),因此仅影响未覆盖 `search()`
接入的自定义后端。这是有意为之——静默返回空比启动期报错更糟。修复方式:切换到 `mode:
middleware`,或覆盖 `search()`(并设置 `supports_search=True`)。([#4324])
### 新增
#### 智能体与运行时
- **中间件:** 新增 `TokenBudgetMiddleware`,强制单个 run 的 token 预算,在主智
能体与子智能体之间累加共享。([#3412])
- **中间件:** 结构化的工具结果元数据与工具进度状态机,让运行时对多步工具流拥有
一等可见性。([#3601])
- **上下文:** 每个 run 记录生效的记忆身份,并在摘要过程中持久化持久上下文(系统
消息、记忆与工具状态以结构化运行时元数据的形式发出压缩compaction不再
丢失这些信息。([#3556]、[#3887]、[#3906])
- **运行时:** 目标延续goal continuation允许 run 跨多个智能体回合朝目标继续
执行,并跟踪、限制 `continuation_count`。([#3858])
- **子智能体:** 系统维护的委派账本delegation ledger防止对在途任务重复委派
并设总委派上限以约束单个 run 的扇出。([#3877]、[#4115])
- **子智能体:** 在会话中持久化并展示子智能体的步骤历史。([#3845])
- **工具:** 结构化摘要取代预览中原始的超大工具输出。([#3377])
- **文件:** 文件工具引入确定性的“写前读”版本门控,避免覆盖并发编辑。([#3912])
- **网关:** 感知缓存的成本核算将 token 成本归因到缓存 / 未缓存路径Redis stream
桥接启用分布式事件流;并向用户暴露手动上下文压缩。([#3920]、[#3191]、[#3969])
- **运行时:** 双模式 checkpoint 存储(基于 LangGraph `DeltaChannel`)将长调研 /
编码 run 的会话存储从 O(N²) 降至近线性。([#4292])
- **智能体:** 配置声明的主智能体中间件,让部署方无需修改运行时链即可加入自定义
`AgentMiddleware` 类。([#3964])
- **智能体:** 按智能体的模型与生成设置(`temperature``max_tokens``thinking_enabled`
`reasoning_effort`)可覆盖共享的模型 profile。([#4347])
- **运行时:** 记录终态的 artifact 投递回执,使预期要 `present_files` 的 run 在
投递失败时不再误报成功。([#4365])
- **上传:** 通过 `list_uploaded_files` 工具懒加载历史文件,而非注入完整清单。([#4174])
#### 记忆
- **记忆:** 记忆合并consolidation合成碎片化的事实并通过 LLM 为每条事实分
配的 `expected_valid_days` / `staleFactsToExtend` 进行过期审查,剪除静默过期的
事实。([#3996]、[#3860]、[#4143])
- **记忆:** 保证注入纠正事实(并优雅降级),使用户的纠正始终能触达模型。([#3592])
- **记忆:** 精简可插拔的 `MemoryManager` 接口以方便后端接入——新后端不再需要实现
未被调用的抽象方法DeerMem 专有的 hook 注入也移出共享工厂。([#4326])
- **记忆:** 增量式按智能体作用域的 Markdown 事实存储,按智能体隔离事实,且更新
单条事实时无需重写或重建整个集合的索引。([#4279])
- **记忆:** 记忆消息处理新增会话水位watermark、无意义回合过滤与持久化队列
使抽取不再每回合都重新喂入完整会话。([#4447])
#### 技能
- **技能:** 原生 SkillScan阶段一在加载时静态分析技能包`describe_skill`
持延迟发现,模型按需获取技能 schema而非一开始就加载全部技能。([#3033]、[#3775])
- **技能:** 按用户的自定义技能隔离,并配合沙箱挂载。([#3889])
#### 模型与集成
- **社区工具:** 新增网络检索 / 抓取引擎——GroundRoute、Crawl4AI`web_fetch`)与
fastCRW provider——并新增 Browserless `web_capture` 截图工具和 Brave `image_search`
。([#3675]、[#3821]、[#3585]、[#3881]、[#3866])
- **MCP** MCP 工具调用支持按 server 的 `tool_call_timeout`,并提供路由提示引导
模型选用正确的 server。([#3843]、[#4004])
- **社区工具:** 将“智能体化浏览器控制”作为会话的一等能力——基于 Playwright 的浏
览器会话由智能体操作,用户可在工作区中观察或接管。([#4187])
- **社区工具:** Lark / 飞书 CLI 集成打包了运行时安装、官方 `lark-*` 技能包与交
互式授权流程,使该集成不再依赖手动环境配置。([#3971])
#### 渠道
- **渠道:** 把 IM 的 `channel_user_id``DEERFLOW_CHANNEL_USER_ID` 暴露给沙箱
命令。([#3926])
- **渠道:** 对同一会话的密集消息进行排队,并在批次间保留话题卡片预览。([#3988])
#### 认证与防护
- **认证:** 通用 OIDC / SSO 认证,并支持 Keycloak。([#3506])
- **护栏:** 已认证的运行时上下文在 `GuardrailRequest` 中暴露,安全干预以 run 事
件的形式持久化。([#3665]、[#3837])
- **认证:** “保持登录”选项,配合统一的会话 cookie 策略HTTPS 下使用持久化 `Secure`
cookie公网 HTTP 下使用会话 cookie。([#4255])
- **认证:** 部署方可关闭本地自注册,将新账号限制为仅通过 SSO / OIDC 开通。([#4311])
- **鉴权:** 内置 RBAC 鉴权 provider 与统一工厂,并在装配期(模型可见前移除工具
)与运行期(拒绝被禁用的调用)双重强制执行工具鉴权。([#4260]、[#4370])
#### 沙箱与 provisioner
- **沙箱:** 新增 E2B 与 BoxLitemicro-VM沙箱 providerBoxLite 自带预热池。([#3883]
、[#3940]、[#3951])
- **provisioner** ClusterIP Service 与按技能作用域的 PVC 挂载,并支持配置沙箱
容器端口。([#4016]、[#3928])
#### 前端
- **前端:** 支持对助手回合进行分支,以及针对引用追问的侧边对话。([#3950]、[#3934])
- **前端:** 支持重新生成最新回答。([#3637])
- **前端:** 引用来源证据面板、智能体 run 的工作区变更评审,以及可视化的 `ask_clarification`
卡片。([#3907]、[#3945]、[#3956])
- **前端:** 语音输入、方向键回溯 prompt 历史、输入框内容润色,以及“(思考了 N
秒)”思考时长标签。([#4036]、[#3718]、[#3986]、[#3627])
- **前端:** 用 `agents_api` 特性开关控制智能体 UI 的可见性,并在后端与 UI 中持
久化 AI 回合时长。([#3769]、[#3663])
- **前端:** 将斜杠技能slash-skill激活渲染为内联标签chip。([#3981])
- **前端:** 本地化的 AI 辅助声明。([#4374])
- **前端:** 支持置顶最近会话。([#4442])
- **前端:** 在输入框中校验 `/goal` 目标长度。([#4337])
#### 可观测性与工具
- **可观测性:** trace-id 关联与增强日志,以及通过 Monocle 实现的智能体可观测性
。([#3902]、[#4024])
- **工具:** 类 Hermes 的终端工作台(`deerflow` CLI基于 `DeerFlowClient`),以
及脱敏的社区支持包support-bundle生成器。([#3760]、[#3886])
- **安装向导:** 安装向导现在会询问 OpenAI 兼容的 gateway 模型是否支持 thinking
,并新增火山引擎 Coding Plan 快速安装路径。([#3428]、[#4141])
- **TUI** `clear` 命令。([#4306])
### 变更
- **沙箱:** Helm chart 现在默认将每个沙箱的 Service 设为 `ClusterIP` 而非 `NodePort`
,因此代码执行沙箱只能通过集群内 Service DNS`http://sandbox-<id>-svc.<ns>.svc.cluster.local`
)访问,不再绑定到每个节点(包括 GKE / EKS / AKS 上外部可达的)网卡。升级时现
有 chart 安装会从 NodePort 切到 ClusterIP。如需保留原有可达性外部探测命中 30xxx
端口,或 gateway 不在 K8s 的 Docker-Compose / 混合部署路径),请设置 `provisioner.sandboxServiceType:
NodePort`(必要时配合 `provisioner.nodeHost`。provisioner 本身不变(自 #4016
起已按模式感知)。([#4190])
- **技能:** 处于激活态的限制型技能若要委派给子智能体,必须在 `allowed-tools`
显式声明 `task`。只读发现基础设施(`tool_search``describe_skill`)仍可用,
但无法为被禁用的业务工具授予 schema 可见性或执行权限。([#4098])
- **记忆:** 抽象化之前位于顶层的 `memory.*` DeerMem 字段(`storage_path``max_facts`
`debounce_seconds``model_name``token_counting``staleness_*``consolidation_*`
等)在加载时会**带告警自动迁移到 `backend_config`**,因此升级不会静默地把自定
义配置回退为默认值(`model_name` -> `backend_config.model.model`)。将它们移到
`config.yaml``memory.backend_config` 下即可消除告警。([#4122])
- **记忆:** 新增 `memory.mode``middleware` | `tool``tool` 模式会注册供模
型直接调用的记忆工具(`memory_search`/`add`/`update`/`delete`),取代被动的逐
回合摘要。`manager_class` 解析改为快速失败(未知后端时抛出 `ValueError`,而非
静默回退)。([#4023])
- **中间件:** 声明式分层中间件构建器;`ThreadData` 现在先于 `Uploads` 运行。([#3809])
- **沙箱:** 宿主机到虚拟机的输出脱敏正则现在统一归属,消除重复的模式编译。([#4108])
- **文档:** `AGENTS.md` 成为智能体指引的权威来源,`CLAUDE.md` 通过 `@AGENTS.md`
导入;模块指南同步刷新。([#3770])
### 修复
- **运行时:** 会话元数据现在仅在 run 通过启动屏障后才切换为 `running`,待取消的
run 不再短暂呈现 `running` 状态worker 启动期间客户端可能观察到先前的会话状态
。([#4450])
- **运行时:** 通过原子化、感知租约的接管takeoverclaim 重新检查孤儿候选 run
,使扫描后的成功心跳仍保持 run 活跃,且仅有一个 reconciler 上报恢复。([#4424]
、[#4434])
- **技能:** `allowed-tools` 只作用于斜杠激活或实际加载的主智能体技能,避免被动
启用的技能与评测 fixture 从每个 run 中移除 MCP、网络、文件与委派工具。([#4095]
、[#4098]、[#4192])
- **模型:** 在所有 `BaseChatOpenAI` 子类(`VllmChatModel``MindIEChatModel``PatchedChatMiMo`
`PatchedChatStepFun``PatchedChatMiniMax`)上生效 `api_base`,而不只是 `ChatOpenAI`
/ `PatchedChatOpenAI`。此前这五个子类会静默丢弃配置的 endpoint随后以一个含义
不明的 `unexpected keyword argument 'api_base'` 让每次请求都失败;它们也未被纳
入未知配置 key 的告警。两者现在都基于 `issubclass(BaseChatOpenAI)` 判断。([#4146])
- **智能体:** 在 LLM 请求前合并 `SystemMessage`;保证工具运行后仍有可见响应;避
免在流结束前发起默认的 LLM 标题调用;为省略号预留空间以使本地标题遵守 `max_chars`
;并将工具输出尾部前移,使回退截断遵守 `max_chars`。([#3711]、[#4033]、[#3885]
、[#4052]、[#4017])
- **智能体:** 动态上下文的日期扫描跳过无日期的提醒;从不含 `config.yaml` 的智能
体目录加载 `SOUL.md``update_agent` 的旧版智能体守卫要求存在 `config.yaml`
并拒绝空的 `SOUL.md` 更新。([#3685]、[#4136]、[#4166]、[#4219])
- **中间件:** 为循环检测的工具频次计数器加窗口,避免长 run 误触;阻止标题中间件
流式输出 token修复“同内容列表耗尽时位置回退误取无关 todo”的问题`_apply`
`before_agent``_clear_run_state``_drain_pending_warnings` 之间持有 token
预算锁;丢弃孤立的 `ToolMessage` 以免严格型 provider 返回 400净化非法 tool-call
参数;并在 dangling 修复中从空的 tool-call 名称与畸形 tool-call id 恢复。([#4072]
、[#3566]、[#3709]、[#3714]、[#4080]、[#4193]、[#4008]、[#4246])
- **子智能体:** 继承 `LoopDetectionMiddleware` 与摘要中间件,使工具循环能被打断
、步骤能被捕获;将回合预算上限以 `MAX_TURNS_REACHED` 暴露并附带部分结果;在累
加式 `stop_reason` + `token_budget` 上统一护栏上限;压缩前注入持久上下文;保留
父 checkpoint 命名空间;在 general-purpose 系统 prompt 中禁用 `task` 工具flush
失败时重新缓冲子智能体事件以避免丢失步骤;并修复子智能体 `run_id``None`
丢失 `loop_capped` 停止原因的问题。([#3931]、[#4009]、[#3949]、[#3980]、[#4040]
、[#4215]、[#4161]、[#4082]、[#4059])
- **记忆:** 加固对 null / 空值边界情况的处理——跳过仅含空白的事实;在更新、检索
与剩余三处原始读取中规整 null 的 `confidence` / `source.confidence`;将显式 `null`
`backend_config` 值视为缺省;修复事实无 id 或事实列表为空时的 `KeyError` /
`UnboundLocalError`停止防抖更新队列的忙等busy-spin并在优雅关闭时刷写记
忆队列以防丢失。([#3719]、[#4074]、[#4076]、[#4034]、[#4217]、[#3993]、[#3992]
、[#4073]、[#4181])
- **运行:** 关闭 run 原子性中的多 worker 归属缺口;在租约续期于截止期前无法确认
时令本地执行快速失败,并在 peer 接管后对迟到的完成写入加围栏;多 worker 下将 cancel
降级为租约接管;让 `create_thread` 在插入竞态时仍幂等;从运行时上下文读取 `stop_reason`
;并将 run 时长持久化到 checkpoint 以供历史读取。([#4003]、[#4064]、[#4414]、[#3800]
、[#4188]、[#4118]、[#4431])
- **运行时:** 序列化 SQLite event-store 写入,避免按会话的序列号冲突;在 journal
中跳过隐藏的人类消息;并去掉 `_merge_stream_text` 中静默丢弃 delta 的行为。([#4077]
、[#3698]、[#4085])
- **网关:** 按真实 `event_type` 关联会话消息反馈;把 artifact 服务、gateway 上
传与 Discord 渠道中的阻塞文件 IO 移出事件循环;限制上传文件的上下文清单;并实
时追踪畸形的 Redis 重连 id。([#3651]、[#3551]、[#3935]、[#3927]、[#3917]、[#4012])
- **上传:** 在写入前先占位转换后的 Markdown 配套文件名使同词干stem的两个
可转换上传(或一个可转换上传加一个同词干 `.md` 上传)不再在同一请求内静默互相
覆盖。`uploads.auto_convert_documents` 开启时,配套 `.md` 会得到唯一名称(如 `a_1.md`
`POST /threads/{id}/uploads``DeerFlowClient.upload_files` 都会在 `markdown_file`
中返回实际文件名。([#4288])
- **配置:** 将为 null 的对象型配置节规整为默认值;在 store 与 sync checkpointer
中遵循统一数据库配置;并让旧版 DB 回填在已存在的表上补建缺失的 `Index` 对象。([#3573]
、[#3904]、[#3994]、[#4090])
- **模型:** 将 `stream_chunk_timeout` 默认值应用到所有 `BaseChatOpenAI` 子类;
并为 `ChatOpenAI``api_base` 规范化为 `base_url`,遇到未知配置 key 时给出告
警。([#4102]、[#3790])
- **MCP** 按 server 隔离工具发现失败;同步 session-pool 单例的生命周期;按配置
内容 + 路径(而非仅更新的 mtime失效工具缓存在加载时校验 MCP 工具名,使延迟
prompt 保持惰性;并按来源 server 路由工具,而非按名称前缀。([#3772]、[#3797]、
[#4124]、[#4154]、[#3812])
- **技能:** 斜杠技能每个 run 仅激活一次,而非每次模型调用都激活;补齐技能安装安
全扫描的覆盖缺口;在评审 CI 中识别被完全删除的技能包,并在 SkillScan 中把剩余
`requests` / `httpx` 方法识别为网络出口;在无参 skills prompt 段落复用已解
析的 app 配置;并支持不重启 Gateway 即可重新加载已挂载技能。([#4103]、[#3924]
、[#4169]、[#4130]、[#4160]、[#4264])
- **沙箱:** 为反向路径翻译与输出脱敏正则加上段边界;在 `read_file` / `str_replace`
中处理单边行范围与空文件;对齐 AIO bash 工作目录;在 Windows 的反向 resolve 包
含性检查中使用 `os.sep`;在 bash 命令中规范化 Windows 反斜杠路径;阻止 `glob`
/ `grep` / `ls` 暴露被禁用技能的文件;并在沙箱审计中允许合法的 heredoc 命令。([#4035]
、[#4053]、[#4078]、[#4079]、[#4051]、[#4058]、[#3869]、[#4096]、[#3786])
- **沙箱:** 同步沙箱 provider 单例的生命周期(含并发回归测试),并让 provisioner
中的 k8s 调用不阻塞事件循环。([#3730]、[#3941])
- **沙箱:** 将沙箱 artifact 挂载与渠道用户对齐;修复非 root / NFS 主机上的本地
开发(`make dev`);停止时回收 macOS 上的 nginx 进程;并修复 Docker 中生产环境
Postgres 的 UV-extras 检测。([#3729]、[#3590]、[#3828]、[#3897])
- **渠道:** 在解析渠道 provider 配置前先校验 provider对 GitHub webhook 重投递
去重,并丢弃冗余的 GitHub review-comment webhook 扇出;把斜杠技能白名单检查限
定在 run 的 owner 作用域;将飞书文件消息批量到一个会话,并以 bot @mention 前缀
分发飞书群命令;在 `/connect` 绑定码前接受前导 @mention,且不把裸 `connect`
作绑定命令;阻止飞书创建会话话题并限流卡片更新;让 UI 运行时渠道配置优先于 `config.yaml`
;修复 `bot_login` / `mention_login` 仅含空白时 `require_mention` 的门控;防护
企业微信中为 null 的引用字段;并将入站去重按聊天作用域的工作区建立 key使 Telegram
、飞书、微信与钉钉在默认(未绑定)配置下不再因重投递重复执行智能体,遇到瞬时失
败时释放去重 key 以便重投递仍可恢复。([#4100]、[#4104]、[#4131]、[#4129]、[#3753]
、[#4229]、[#4222]、[#4251]、[#3810]、[#3674]、[#4055]、[#4069]、[#4287])
- **前端:** 摘要过程中保留消息与持久上下文;流式期间保留 artifact 并稳定 artifact
路径;解析相对 artifact 图片路径;在 header 下拉中保留已展示的 artifact保持
孤立的工具消息可见;工具步骤期间展示助手文本;客户端导航时重置新会话;防止并发
提交导致流被取消;修复过期 run 的重连与取消处理;修复聊天公式渲染、单波浪线 markdown
、双重 reasoning 渲染、UTF-16 markdown 二进制分类与 Streamdown 中的 `<memory>`
标签;让最近会话行整体可点击;上传前校验附件上限并修复消息复制中上传文件元数据
;修复移动端工作区与可访问性阻塞、卡片工具消息 bug 以及侧边聊天工具栏 / 面板按
钮行为;拦截未解析的建议模板占位符;刷新通知权限;仅对已完成回合显示分支操作;
在自定义智能体聊天中启用重新生成;并为被中断的首回合 run 生成兜底标题。([#3826]
、[#3791]、[#4094]、[#4038]、[#3854]、[#3880]、[#4114]、[#3673]、[#3878]、[#3908]
、[#3557]、[#4245]、[#3870]、[#3966]、[#4209]、[#3733]、[#3900]、[#3944]、[#3740]
、[#3976]、[#3959]、[#3961]、[#3764]、[#3768]、[#4147]、[#3967]、[#3874]、[#3644])
- **TUI** `/quit` 退出前先中断活动 run。([#4235])
- **harness** 当大纲标题数恰好等于 `MAX_OUTLINE_ENTRIES` 时不再误判为被截断。([#3856])
- **追踪:** 把 Langfuse trace 元数据附加到目标评估器。([#4202])
- **上下文:** 修复 context-compress 的 bug。([#4065])
- **ThreadData** 修复 `runtime.context``None` 时的 `AttributeError`。([#3989])
- **goal** 修复 stand-down 期间 `continuation_count` 被重复递增的问题。([#4199])
- **熔断器:** 修复半开探测不可重试后熔断器卡死的问题。([#3991])
- **GitHub** `allow_authors` 登录名改为大小写不敏感匹配。([#4218])
- **社区工具:** `image_search` 现在返回全分辨率图片 URL。([#3990])
- **技能:** 把技能历史接口中的阻塞文件 IO 移出事件循环。([#3563])
- **技能:** SkillScan 不再把惰性求值的 PEP 695 类型别名误判为网络出口。([#4315])
- **追踪:** 从运行时上下文解析 Langfuse trace 的用户。([#3794])
- **护栏:** 将内部 owner 归因透传到护栏上下文。([#3839])
- **子智能体:** 子智能体上限与 `MIN_SUBAGENT_LIMIT` 保持一致地限幅。([#4081])
- **子智能体:** 加载按用户作用域的技能。([#4356])
- **MCP** 按 server 的 OAuth 预热改为失败即软降级,并持久化轮换后的 refresh token
。([#4084])
- **MCP** 忽略畸形的类路径文本。([#4456])
- **认证:** 邮箱账号改为大小写不敏感解析。([#4101])
- **认证:** 从 setup-status 超时中恢复。([#4371])
- **调度器:** 修复一个调度竞态,该竞态可能为同一个定时任务启动两个 run。([#4105])
- **渠道:** 缓冲并在 busy run 期间排空被排队的 GitHub 评论。([#4133])
- **渠道:** 在转换为 mrkdwn 前先转义 Slack 保留字符。([#4197])
- **渠道:** 飞书卡片 / reaction SDK 调用上检查 `response.success()`。([#4234])
- **渠道:** 丢弃不携带会话身份的入站钉钉消息。([#4316])
- **渠道:** 支持接收入站 Telegram 附件。([#4392])
- **记忆:** 合并后的事实从其来源继承 `expected_valid_days`。([#4225])
- **配置:** `_memory_config` 与 AppConfig 自动重载保持同步。([#4208])
- **Postgres** 用 `pool_recycle``command_timeout` 加固异步引擎,消除陈旧连
接导致的 504。([#4230])
- **harness** 为 `invoke_acp_agent` 增加超时,避免无限挂起。([#4238])
- **社区工具:** 在 `web_fetch`Browserless中暴露目标页的错误状态。([#4239])
- **沙箱:** 放宽 BoxLite / AIO 的租户哈希范围,并在回收时校验身份。([#4171])
- **沙箱:** `str_replace` 在任意文件上遇到空 `old_str` 时改为无操作。([#4256])
- **沙箱:** 序列化 E2B 的释放状态转换。([#4355])
- **沙箱:** 限制 E2B 输出同步的资源占用。([#4364])
- **沙箱:** 在 `after_agent` 中解包被 `Overwrite` 包裹的沙箱状态。([#4381])
- **沙箱:** 本地 AIO 流量绕过代理。([#4444])
- **模型:** 暴露因长度截断的模型响应,而非直接丢弃。([#4309])
- **流式:** 保持大文件生成过程的响应性。([#4354])
- **流式:** 把自定义事件暴露给 `astream_events`。([#4403])
- **流式:** 对回放历史中的缺口发出信号。([#4426])
- **摘要:** 使用 run 模型进行摘要,摘要 provider 失败时回退。([#4361])
- **运行时:** 模型调用后移除临时的图片上下文。([#4267])
- **运行时:** 阻止子图流式帧冒充根帧。([#4407])
- **运行时:** 拒绝不支持的 run 选项与流模式。([#4430])
- **运行时:** 序列化 checkpoint 写入与活动 run、线性化 delta 模式的 checkpoint
恢复,并接受 SDK 默认的 `stream_resumable=false`,以避免恢复竞态。([#4437]、[#4460]
、[#4468])
- **checkpoint** 解包对空 channel 的 `Overwrite` 首次写入。([#4383])
- **nginx** 允许超长聊天 prompt 通过 `/api/langgraph/`,不再直接返回 500。([#4277])
- **网关:** 当 header 已设置时,优先使用 `X-Trace-Id` 而非 `metadata.deerflow_trace_id`
。([#4283])
- **网关:** 为分支补种 run-events使继承的历史在分叉后仍然保留。([#4385])
- **网关:** 分支历史补种的 run id 按继承的回合作用域划分。([#4459])
- **前端:** 加固 artifact 与 markdown 渲染。([#4117])
- **前端:** 工作区变更评审中,把“符号链接替换文件”与“删除”区分开。([#4170])
- **前端:** 把工作区变更文本缓存生命周期中的阻塞文件 IO 移出事件循环。([#4268])
- **前端:** 对 artifact URL 的路径段进行编码。([#4278])
- **前端:** 厘清 run 时长的展示。([#4348])
- **前端:** 在分支会话中保留重新生成状态。([#4358])
- **前端:** reasoning-effort 未设置时默认展示为 Medium。([#4373])
- **前端:** 剥离并解析 `<current_uploads>` 上传上下文标签。([#4402])
- **前端:** 保持前导的孤立工具消息可见。([#4408])
- **前端:** 刷新后保持已完成子任务卡片的稳定。([#4432])
- **前端:** 通过 inline style 应用消息图片的 `maxWidth`。([#4446])
- **前端:** 恢复 artifact 与侧边面板的可调整大小。([#4469])
- **前端:** 允许非 localhost 主机访问 dev-server。([#4471])
- **内容安全:** 回填空的内容过滤响应,避免污染会话。([#4394])
- **工具:** 从 `list_uploaded_files` 的 schema 中排除注入的 runtime。([#4376])
### 性能优化
- **运行时:** 为 `MemoryRunStore``thread_id``MemoryRunEventStore` 事件按
`run_id` 建立索引,避免 O(n) 扫描。([#3562]、[#3686])
- **子智能体:** 通过 seen-id 集合对流式 AI 消息去重O(n²) -> O(n))。([#3687])
- **沙箱:** `LocalSandbox` 的路径改写正则与本地路径脱敏模式改为按实例缓存,不再
每次搜索命中都重新编译。([#3648]、[#3713])
- **消息:** 按组为工具调用结果建立索引。([#4411])
- **前端:** 流式渲染按帧预算合并,而非逐 chunk 渲染。([#4425])
- **前端:** 不再在每个流式 chunk 上重新推导消息内容。([#4441])
### 安全
- **提示词注入:** 新增输入净化中间件防御提示词注入,输入护栏中伪造的框架标签会
被拦截,系统上下文以 `SystemMessage` 注入以隔离角色。([#3662]、[#4155]、[#3661])
- **提示词注入:** 对渲染进模型 prompt 的不可信内容进行 HTML 转义——记忆事实与摘
要、`SOUL.md`、子智能体描述、技能元数据,以及记忆更新 prompt 中的会话块——并中
`web_capture` 工具结果中的提示词注入标签。([#4028]、[#4119]、[#4137]、[#4157]
、[#4162]、[#4099]、[#4060]、[#4097]、[#4128])
- **机密:** 从技能环境中清除继承来的密钥环境变量(`MYSQL_PWD``REDISCLI_AUTH`
、缩写形式的 `*_PASS` 与 Postgres 的 `PGPASSFILE`);请求作用域的密钥对斜杠激
活与自主调用的技能都会绑定。([#4018]、[#4026]、[#3871]、[#3938])
- **web_fetch** 针对自托管 provider 的 SSRF 防护。([#3942])
- **护栏:** 空的 allowlist 现在会拒绝所有工具而非放行fail open。([#4067])
- **鉴权:** 全局技能管理接口现在要求管理员权限;旧版 skills 挂载按用户可见性门
artifact 遵循受信任的 `owner-user-id` header受信任的鉴权主体透传到运行时
。([#3855]、[#3985]、[#3982]、[#4203])
- **认证:** 在 access-token 生命周期内持久化 `csrf_token` cookie。([#3872])
- **存储:** 不再在 checkpoint 状态中持久化 base64 图片数据。([#4140])
## [2.0.0] — 2026-06-15
DeerFlow 2.0 是围绕"超级智能体"框架的彻底重写,核心包含子智能体、持久化记忆、
沙箱执行以及可扩展的技能Skill/工具系统。本版本与 1.x 系列**没有共享代码**
原有的 Deep Research 框架仍在
[`main-1.x` 分支](https://github.com/bytedance/deer-flow/tree/main-1.x)上维护。
本次发布关闭了
[2.0.0 里程碑](https://github.com/bytedance/deer-flow/milestone/1)
自首个 2.0 里程碑标签以来累计合并 **180 个 Pull Request**
### ⚠ 不兼容变更Breaking Changes
- **harness** 从 `RunStore` 重新加载历史 run并持久化"已中断interrupted"
状态。run 的取消 / 多任务调度语义现在要求拥有该 run 的 worker 上具备可用的
RunStore跨 worker 的取消请求将返回 `409`,不再静默"伪成功"。([#2932])
### 新增
#### 智能体与运行时
- **智能体:** 自定义智能体支持自我更新,并按用户隔离 —— 智能体可在普通对话中
持久化对自身 `SOUL.md` / `config.yaml` 的修改。([#2713])
- **循环检测:** 支持配置开关,并可按工具维度覆盖触发频率。([#2586]、[#2711])
- **循环检测:** 警告注入延后执行,避免与工具调用生命周期错位。([#2752])
- **运行:** 将 `model_name` 从 gateway 请求一直透传到运行时与持久化层SQLite
存储)。([#2775])
- **子智能体:** 通过终态任务事件,把子智能体的 token 用量流式上报到 header。
([#2882])
- **记忆:** 新增 `memory.token_counting` 配置,支持在受限网络环境下禁用
tiktoken。([#3465])
- **建议:** AI 追问follow-up建议改为可选。([#3591])
#### 模型与集成
- **模型:** 新增 StepFun 推理模型适配器。([#3461])
- **社区工具:** 新增 Brave Search 网络检索工具。([#3528])
- **渠道:** Discord 增加"仅响应 mention"模式、话题路由thread routing以及
正在输入指示。([#2842])
- **IM** 新增"用户自有 IM 渠道连接"——用户可以在运营方配置的 bot 之上,绑定
自己的 Slack / Telegram / Discord / 飞书 / 钉钉 / 微信 / 企业微信 账号。
([#3487])
- **模型:** 新增 MiMo 推理内容reasoning content的补丁支持。([#3298])
- **模型:** 新增 MiniMax provider用于图像 / 视频 / 播客类技能,并新增"音乐
生成"技能。([#3437])
- **社区工具:** 新增 SearXNG 与 Browserless 的网络检索 / 抓取工具。([#3451])
- **社区工具:** 为 `image_search` 新增 Serper Google 图片 provider。([#3575])
- **渠道:** Telegram 智能体回复改为就地编辑占位消息的方式流式输出。([#3534])
#### 可观测性
- **追踪:** LangGraph 追踪名设置为 `lead_agent`(自定义智能体则使用其
`agent_name`),让 Langfuse / LangSmith 中的 trace 更清晰。([#3101])
- **前端:** 优化 token 用量的展示模式。([#2329])
- **默认值:** 默认开启 token 用量统计。([#2841])
- **默认值:** 提高默认的上下文摘要触发阈值。([#3174])
- **追踪:** 把子智能体的 span 归属到父线程的 Langfuse trace 上。([#3611])
#### 技能
- **技能:** 新增 `blocking-io-guard` 技能,用于阻塞 IO 排查与运行时锚点。
([#3503])
- **技能:** 新增面向维护者的 issue 与 PR 工作流技能。([#3554])
- **技能:** 增强维护者编排orchestrator的评审工作流。([#3606])
### 性能优化
- **harness** 把 thread 元数据过滤下推到 SQL不再在 Python 侧后过滤。
([#2865])
- **运行时:** 为 run 增加 `thread_id` 索引,避免 `RunManager` 中的 O(n) 扫描。
([#3499])
- **运行时:** 为 `MemoryRunEventStore` 中的消息建立索引,避免 O(n) 扫描。
([#3531])
- **持久化:** 按类缓存 `Base.to_dict` 的列反射结果。([#3654])
- **沙箱:** 加快 glob/grep 遍历中的 `should_ignore_name` 判断。([#3657])
### 安全
- **上传:** 拒绝指向符号链接的上传目标。([#2623])
- **上传:** 在 Windows 上支持基于符号链接保护的安全上传。([#2794])
- **MCP** 在 MCP 配置接口的响应中对敏感字段进行脱敏。([#2667])
- **MCP** 加固 MCP 配置接口对异常输入的处理。([#3425])
- **认证:** 拒绝跨站点cross-site的认证 POST 请求。([#2740])
- **网关:** 限制 skill artifact 预览的解压上限,避免被 zip-bomb 类构造滥用。
([#2963])
- **沙箱:** 仅在 aioDooD沙箱模式下挂载宿主机的 Docker socket。([#3517])
- **沙箱:** 默认不再 bind-mount 宿主机的 CLI 认证目录。([#3521])
### 修复
#### 运行时、网关与持久化
- **运行时:** rollback 恢复的 checkpoint 现在能够覆盖更新的 checkpoint。
([#2582])
- **运行时:** 持久化 run 的消息摘要。([#2850])
- **运行时:** 限制 `write_file` 执行失败时上报的观测信息长度,避免失败 trace
撑爆上下文。([#3133])
- **运行时:** 加锁保护同步单例的初始化与 reset 路径。([#3413])
- **运行时:** 为 run events 移除 PostgreSQL 上不必要的聚合
`FOR UPDATE`。([#2962])
- **运行:** gateway 重启后从持久化存储中恢复历史 run。([#2989])
- **网关:** threads 接口返回 ISO 8601 格式的时间戳。([#2599])
- **网关:** 对已经处于 interrupted 状态的 runcancel 接口幂等返回。
([#3058])
- **网关:** 将 `stream_existing_run` 拆分为按 HTTP 方法区分的多个路由,确保
OpenAPI `operationId` 唯一。([#3228])
- **事件:** 序列化结构化的 DB event 内容。([#2762])
- **持久化:** SQLite 后端的存储统一返回带时区的时间戳。([#3130])
- **持久化:** 复用 token 用量按模型分组的 SQL 表达式。([#2910])
- **运行:** 忽略已过期的 run reconnect 冲突。([#3284])
- **nginx** 把 CORS 策略下放到 gateway 的 allowlist避免双重应用。
([#2861])
- **持久化:** 修复运行时 journal 中 run 生命周期事件的记录。([#3470])
- **网关:** 在无状态statelessrun 接口上强制校验 thread 归属。([#3473])
- **运行时:** 通过 SSE values 事件把 interrupt 透传给 LangGraph SDK。([#3605])
- **序列化:** 从流式 values 事件中剥离 base64 图片数据。([#3631])
- **历史:** 从 REST 接口响应中剥离 base64 图片数据。([#3535])
- **网关:** token 用量归因到实际使用的模型。([#3658])
#### 智能体、子智能体与中间件
- **子智能体:** 让"子智能体超时"成为原子化的终态。([#2583])
- **子智能体:** 工具与中间件按 model 覆盖model override来构造。([#2641])
- **子智能体:** 把 `system_prompt` 与 skills 合并到单条 `SystemMessage`
([#2701])
- **子智能体:** 子智能体与父 run 的 checkpointer 隔离。([#3559])
- **智能体:** `update_agent``setup_agent` 一致,遵循 `runtime.context`
`user_id`。([#2867])
- **智能体:** 解决 `TodoMiddleware``todos` 通道的类型冲突。([#3200])
- **智能体:** 把自定义智能体路由中的阻塞文件 IO 移出事件循环。([#3457])
- **智能体:** 新智能体的 bootstrap 流程保持在用户作用域内。([#2784])
- **循环检测:** 注入 warn 时仍保持 tool-call 配对。([#2725])
- **中间件:** 同步原始 tool-call 元数据。([#2757])
- **中间件:** dangling 配对中间件正确处理非法 tool call。([#2891])
- **中间件:** 防止 todo 完成提醒消息泄漏到 IM 渠道。([#2907])
- **中间件:** 调用模型前先把 tool result 的相邻关系规范化。([#2939])
- **智能体:** `resolve_agent_dir` 要求存在 `config.yaml`,从而跳过仅含记忆的
目录。([#3481])
- **智能体:** 在 context / configurable 间同步 `agent_name`,并拒绝空的
soul。([#3553])
- **中间件:** 把 `UploadsMiddleware` 中的上传扫描移出事件循环。([#3311])
- **中间件:** 把记忆注入移出事件循环,避免 tiktoken 造成阻塞。([#3411])
- **中间件:** 针对非挂载型沙箱,把超限的工具输出外置到沙箱中。([#3417])
- **中间件:** 在中间件 state 中保留 sandbox reducer。([#3629])
- **子智能体:** general-purpose 的 `max_turns` 提升到 150默认超时提升到 30
分钟。([#3610])
#### 记忆与追踪
- **记忆:** 用常驻事件循环替换短生命周期的 `asyncio.run()`。([#2627])
- **记忆:** 队列化的 memory 更新按智能体维度隔离。([#2941])
- **记忆:** 解析被外层包裹的 memory 更新 JSON 响应。([#3252])
- **追踪:** 把 `session_id``user_id` 透传到 Langfuse trace。([#2944])
- **追踪:** 修复中文 memory trace 信息显示为 unicode 转义序列的问题。
([#3104])
#### 工具、沙箱与 MCP
- **MCP** 修复 MCP 配置中列表型变量的环境变量解析。([#2556])
- **模型:** Codex 的 token 用量记录到 `usage_metadata`。([#2585])
- **沙箱:** 在 `RemoteSandboxBackend` 中补上 `list_running`。([#2716])
- **沙箱:** Windows / Git Bash 下关闭 MSYS 路径转换。([#2766])
- **沙箱:** 沙箱就绪轮询不再阻塞事件循环。([#2822])
- **沙箱:** `Sandbox` API 边界统一遵守 `/mnt/user-data` 契约。([#2881])
- **沙箱:** Provisioner 的 PVC 数据按用户隔离。([#2973])
- **沙箱:** 合并幂等的沙箱状态更新。([#3518])
- **工具:** 引入 `Runtime` 类型别名,消除 Pydantic 序列化告警。([#2774])
- **工具:** 在重入式 `get_available_tools` 调用之间保留 `tool_search` 的提升
状态。([#2885])
- **harness** 为同步客户端封装仅异步可用的 config 工具。([#2878])
- **harness** 同步客户端可用所有原本仅异步的工具(统一封装)。([#2935])
- **工具检索:** 通过移除 ContextVar可靠地隐藏延迟加载的 MCP schema。
([#3342])
- **检索:** 修复 DDGS 的维基百科区域处理。([#3423])
- **web_fetch** 在受限网络环境下为 Jina reader 支持代理。([#3430])
- **沙箱:** 通过 `Command` 持久化懒加载获取到的沙箱状态。([#3464])
- **沙箱:** 修复 AIO 沙箱缓存被陈旧复用的问题。([#3494])
- **沙箱:** 在使用全新 id 重试前先创建 shell session。([#3577])
- **沙箱:** 不再把字符串字面量路径片段误判为不安全的绝对路径。([#3623])
- **沙箱:** `read_file` 命中二进制文件时返回可操作的提示信息。([#3624])
- **MCP** 让 stdio MCP 产出的文件可通过虚拟沙箱路径解析。([#3600])
- **MCP** 在设置页的工具列表上展示"需要管理员权限"的状态。([#3533])
- **MCP** 新增工具缓存重置接口。([#3602])
- **上传:** 修复上传文件大小的接口契约。([#3408])
#### 技能与渠道
- **技能:** 强制校验 `allowed-tools` 元数据。([#2626])
- **技能:** 在各聊天渠道下加固 `/skill` 斜杠激活。([#3466])
- **技能:** 修复自定义 skill 安装时的权限问题。([#3241])
- **渠道:** Gateway 的命令请求需要鉴权。([#2742])
- **技能:** SKILL.md 出现 YAML 错误时,展示出错行号与引号提示。([#3335])
- **技能:** 把技能压缩包的安装移出事件循环。([#3505])
- **渠道:** 提取回复时忽略隐藏的控制消息。([#3270])
- **渠道:** 渠道重启时重新加载配置。([#3514])
- **渠道:** 暴露企业微信WeComWebSocket 连接失败的信息。([#3526])
- **渠道:** Discord 上传完成后关闭文件句柄。([#3561])
- **渠道:** 用户自有 IM 消息要求绑定身份。([#3578])
- **渠道:** IM 文件与辅助命令限定在 owner 作用域内。([#3579])
- **渠道:** 以运行时的 provider 状态为权威来源。([#3580])
- **渠道:** 加固运行时凭证管理接口。([#3581])
- **渠道:** 让渠道连接流程可确定deterministic。([#3582])
- **渠道:** 集中各渠道共享的重试辅助逻辑。([#3583])
- **渠道:** 增加运行态的防护约束operational guardrails。([#3584])
- **渠道:** 按相等性equality退订渠道监听器。([#3608])
#### 认证
- **认证:** 用缓存响应替换 setup-status 接口的 429 限流。([#2915])
- **认证:** 自动生成的 JWT secret 持久化保存,重启后仍可用。([#2933])
- **认证:** 对齐"认证禁用auth-disabled"模式与 mock 历史加载行为。
([#3471])
#### 前端
- **前端:** 在 prod 模式下恢复 `getGatewayConfig``localhost` 兜底。
([#2718])
- **聊天:** 修复新会话第一条用户消息被吞掉的问题。([#2731])
- **前端:** header 总计 token 数采用后端线程级 token 用量。([#2800])
- **前端:** 异步 chat submit 完成后再清空输入框。([#2940])
- **前端:** 修复登录页闪烁与 ResizeObserver 死循环。([#2954])
- **前端:** 对恢复出的会话消息去重。([#2958])
- **前端:** 避免乐观渲染产生重复的用户消息。([#3002])
- **前端:** 流式中的 assistant 消息不再展示复制按钮。([#3176])
- **前端:** 新建 thread 后立即在侧边栏显示。([#3283])
- **前端:** 新建会话的 thread 消息相互隔离。([#3508])
- **前端:** 限制深层嵌套列表的缩进,避免渲染崩溃。([#3393]、[#3570])
- **token 用量:** token 用量按 message id 去重聚合。([#2770])
- **前端:** 剪贴板复制回退到 Streamdown。([#3397])
- **前端:** 移除用 Backspace 删除 prompt 附件的快捷键。([#3410])
- **前端:** 把记忆设置的工具栏重排为两行。([#3433])
- **建议:** 解析追问问题前先剥离内联的 `<think>` 推理内容。([#3435])
- **前端:** 追问建议被禁用时不再发起请求。([#3599])
- **前端:** 工作区会话列表在超过 50 个 thread 后分页加载。([#3485])
- **前端:** 避免长串不可断行文本导致用户消息气泡溢出。([#3488])
- **前端:** SSR 鉴权探测无法连通 gateway 时仍保持工作区可交互。([#3495])
- **前端:** 用户消息按纯文本渲染并限制引用blockquote嵌套层级。
([#3502])
- **前端:** 删除后重置当前激活的会话。([#3519])
- **前端:** 优化移动端工作区布局。([#3646])
- **前端:** 多段multi-partAI 消息渲染完整内容。([#3649])
#### 构建、部署、脚本与配置
- **打包:** 新增 `postgres` extra 以支持 store / checkpointer并完善安装
说明。([#2584])
- **harness** 运行时路径以项目根目录为基准解析。([#2642])
- **Docker** 让 nginx 在每次请求时再解析 upstream 名称。([#2717])
- **Docker** 把 Gateway 默认改为单 worker避免多 worker 模式下出现异常。
([#3475])
- **脚本:** `make dev` 重启时保留 `uv` extras。([#2767]、[#2754])
- **脚本:** 停止时清理本地 nginx。([#3005])
- **部署:** 没有 `python3`secret 生成回退到 `python` / `openssl`
([#3074])
- **配置:** 让 reload boundary 在代码层面可发现。([#3144]、[#3153])
- **replay-e2e** 重放 fixture 按调用方与会话作为 key。([#3453])
- **安装向导:** 更新 LLM provider 向导的默认值。([#3421])
- **配置:** 把 `config.yaml` 中为 null 的列表字段归一为空列表。([#3434])
- **脚本:** gateway reload 时排除运行时状态目录。([#3426])
- **脚本:** 在 uvicorn 的 reload-exclude 生效前先创建 backend/sandbox 目录。
([#3460])
- **脚本:** 修复 `make start-daemon` 之后无法用 `make stop` 正确停止
next-server 的问题。([#3498])
- **Makefile** 修复 per-commit hooks 的安装。([#3569])
- **replay-e2e** 重放匹配改为按会话,而非使用当前系统 prompt。([#3436])
### 变更
- **provider重构** 各 provider 间共享 assistant payload 的回放匹配逻辑。
([#3307])
- **lead-agent重构** 把 `build_middlewares` 改为 public去掉最后一个跨
模块的私有导入。([#3458])
- **todo重构** 移除未使用的完成提醒计数器。([#3530])
### 文档
- 补充 blocking-IO 检测的使用与维护说明。([#3233])
- 清理文档中残留的"独立 LangGraph 服务器"相关内容。([#3301])
- 在 PR 模板与 CONTRIBUTING 中补充 AI 辅助声明。([#3398])
- 补充自定义 AIO 沙箱镜像的文档。([#3548])
### 内部改进
- **开发:** 新增 async / thread 边界检测器。([#2936])
- **运行时:** 增加 lifecycle 端到端测试覆盖。([#2946])
- **Windows** 后端 Makefile 各 target 加入 `PYTHONIOENCODING`
`PYTHONUTF8`。([#3069])
- **blocking-io** 检测器以"显式失败fail-loud"方式解析仓库根目录,并提供
共享 CLI 入口。([#3512])
- **运行时:** 为 `JsonlRunEventStore` 的异步 IO 增加 Blockbuster 运行时锚点。
([#3313])
- **CI** 统一 PR / issue 打标签逻辑,修复 reviewing 任务的崩溃与标签抖动。
([#3455])
[2.0.0]: https://github.com/bytedance/deer-flow/releases/tag/v2.0.0
[#2329]: https://github.com/bytedance/deer-flow/pull/2329
[#2556]: https://github.com/bytedance/deer-flow/pull/2556
[#2582]: https://github.com/bytedance/deer-flow/pull/2582
[#2583]: https://github.com/bytedance/deer-flow/pull/2583
[#2584]: https://github.com/bytedance/deer-flow/pull/2584
[#2585]: https://github.com/bytedance/deer-flow/pull/2585
[#2586]: https://github.com/bytedance/deer-flow/pull/2586
[#2599]: https://github.com/bytedance/deer-flow/pull/2599
[#2623]: https://github.com/bytedance/deer-flow/pull/2623
[#2626]: https://github.com/bytedance/deer-flow/pull/2626
[#2627]: https://github.com/bytedance/deer-flow/pull/2627
[#2641]: https://github.com/bytedance/deer-flow/pull/2641
[#2642]: https://github.com/bytedance/deer-flow/pull/2642
[#2667]: https://github.com/bytedance/deer-flow/pull/2667
[#2701]: https://github.com/bytedance/deer-flow/pull/2701
[#2711]: https://github.com/bytedance/deer-flow/pull/2711
[#2713]: https://github.com/bytedance/deer-flow/pull/2713
[#2716]: https://github.com/bytedance/deer-flow/pull/2716
[#2717]: https://github.com/bytedance/deer-flow/pull/2717
[#2718]: https://github.com/bytedance/deer-flow/pull/2718
[#2725]: https://github.com/bytedance/deer-flow/pull/2725
[#2731]: https://github.com/bytedance/deer-flow/pull/2731
[#2740]: https://github.com/bytedance/deer-flow/pull/2740
[#2742]: https://github.com/bytedance/deer-flow/pull/2742
[#2752]: https://github.com/bytedance/deer-flow/pull/2752
[#2754]: https://github.com/bytedance/deer-flow/pull/2754
[#2757]: https://github.com/bytedance/deer-flow/pull/2757
[#2762]: https://github.com/bytedance/deer-flow/pull/2762
[#2766]: https://github.com/bytedance/deer-flow/pull/2766
[#2767]: https://github.com/bytedance/deer-flow/pull/2767
[#2770]: https://github.com/bytedance/deer-flow/pull/2770
[#2774]: https://github.com/bytedance/deer-flow/pull/2774
[#2775]: https://github.com/bytedance/deer-flow/pull/2775
[#2784]: https://github.com/bytedance/deer-flow/pull/2784
[#2794]: https://github.com/bytedance/deer-flow/pull/2794
[#2800]: https://github.com/bytedance/deer-flow/pull/2800
[#2822]: https://github.com/bytedance/deer-flow/pull/2822
[#2841]: https://github.com/bytedance/deer-flow/pull/2841
[#2842]: https://github.com/bytedance/deer-flow/pull/2842
[#2850]: https://github.com/bytedance/deer-flow/pull/2850
[#2861]: https://github.com/bytedance/deer-flow/pull/2861
[#2865]: https://github.com/bytedance/deer-flow/pull/2865
[#2867]: https://github.com/bytedance/deer-flow/pull/2867
[#2878]: https://github.com/bytedance/deer-flow/pull/2878
[#2881]: https://github.com/bytedance/deer-flow/pull/2881
[#2882]: https://github.com/bytedance/deer-flow/pull/2882
[#2885]: https://github.com/bytedance/deer-flow/pull/2885
[#2891]: https://github.com/bytedance/deer-flow/pull/2891
[#2907]: https://github.com/bytedance/deer-flow/pull/2907
[#2910]: https://github.com/bytedance/deer-flow/pull/2910
[#2915]: https://github.com/bytedance/deer-flow/pull/2915
[#2932]: https://github.com/bytedance/deer-flow/pull/2932
[#2933]: https://github.com/bytedance/deer-flow/pull/2933
[#2935]: https://github.com/bytedance/deer-flow/pull/2935
[#2936]: https://github.com/bytedance/deer-flow/pull/2936
[#2939]: https://github.com/bytedance/deer-flow/pull/2939
[#2940]: https://github.com/bytedance/deer-flow/pull/2940
[#2941]: https://github.com/bytedance/deer-flow/pull/2941
[#2944]: https://github.com/bytedance/deer-flow/pull/2944
[#2946]: https://github.com/bytedance/deer-flow/pull/2946
[#2954]: https://github.com/bytedance/deer-flow/pull/2954
[#2958]: https://github.com/bytedance/deer-flow/pull/2958
[#2962]: https://github.com/bytedance/deer-flow/pull/2962
[#2963]: https://github.com/bytedance/deer-flow/pull/2963
[#2973]: https://github.com/bytedance/deer-flow/pull/2973
[#2989]: https://github.com/bytedance/deer-flow/pull/2989
[#3002]: https://github.com/bytedance/deer-flow/pull/3002
[#3005]: https://github.com/bytedance/deer-flow/pull/3005
[#3033]: https://github.com/bytedance/deer-flow/pull/3033
[#3058]: https://github.com/bytedance/deer-flow/pull/3058
[#3069]: https://github.com/bytedance/deer-flow/pull/3069
[#3074]: https://github.com/bytedance/deer-flow/pull/3074
[#3101]: https://github.com/bytedance/deer-flow/pull/3101
[#3104]: https://github.com/bytedance/deer-flow/pull/3104
[#3130]: https://github.com/bytedance/deer-flow/pull/3130
[#3133]: https://github.com/bytedance/deer-flow/pull/3133
[#3144]: https://github.com/bytedance/deer-flow/pull/3144
[#3153]: https://github.com/bytedance/deer-flow/pull/3153
[#3174]: https://github.com/bytedance/deer-flow/pull/3174
[#3176]: https://github.com/bytedance/deer-flow/pull/3176
[#3191]: https://github.com/bytedance/deer-flow/pull/3191
[#3200]: https://github.com/bytedance/deer-flow/pull/3200
[#3228]: https://github.com/bytedance/deer-flow/pull/3228
[#3233]: https://github.com/bytedance/deer-flow/pull/3233
[#3241]: https://github.com/bytedance/deer-flow/pull/3241
[#3252]: https://github.com/bytedance/deer-flow/pull/3252
[#3270]: https://github.com/bytedance/deer-flow/pull/3270
[#3283]: https://github.com/bytedance/deer-flow/pull/3283
[#3284]: https://github.com/bytedance/deer-flow/pull/3284
[#3298]: https://github.com/bytedance/deer-flow/pull/3298
[#3301]: https://github.com/bytedance/deer-flow/pull/3301
[#3307]: https://github.com/bytedance/deer-flow/pull/3307
[#3311]: https://github.com/bytedance/deer-flow/pull/3311
[#3313]: https://github.com/bytedance/deer-flow/pull/3313
[#3335]: https://github.com/bytedance/deer-flow/pull/3335
[#3342]: https://github.com/bytedance/deer-flow/pull/3342
[#3377]: https://github.com/bytedance/deer-flow/pull/3377
[#3393]: https://github.com/bytedance/deer-flow/pull/3393
[#3397]: https://github.com/bytedance/deer-flow/pull/3397
[#3398]: https://github.com/bytedance/deer-flow/pull/3398
[#3408]: https://github.com/bytedance/deer-flow/pull/3408
[#3410]: https://github.com/bytedance/deer-flow/pull/3410
[#3411]: https://github.com/bytedance/deer-flow/pull/3411
[#3412]: https://github.com/bytedance/deer-flow/pull/3412
[#3413]: https://github.com/bytedance/deer-flow/pull/3413
[#3417]: https://github.com/bytedance/deer-flow/pull/3417
[#3421]: https://github.com/bytedance/deer-flow/pull/3421
[#3423]: https://github.com/bytedance/deer-flow/pull/3423
[#3425]: https://github.com/bytedance/deer-flow/pull/3425
[#3426]: https://github.com/bytedance/deer-flow/pull/3426
[#3428]: https://github.com/bytedance/deer-flow/pull/3428
[#3430]: https://github.com/bytedance/deer-flow/pull/3430
[#3433]: https://github.com/bytedance/deer-flow/pull/3433
[#3434]: https://github.com/bytedance/deer-flow/pull/3434
[#3435]: https://github.com/bytedance/deer-flow/pull/3435
[#3436]: https://github.com/bytedance/deer-flow/pull/3436
[#3437]: https://github.com/bytedance/deer-flow/pull/3437
[#3451]: https://github.com/bytedance/deer-flow/pull/3451
[#3453]: https://github.com/bytedance/deer-flow/pull/3453
[#3455]: https://github.com/bytedance/deer-flow/pull/3455
[#3457]: https://github.com/bytedance/deer-flow/pull/3457
[#3458]: https://github.com/bytedance/deer-flow/pull/3458
[#3460]: https://github.com/bytedance/deer-flow/pull/3460
[#3461]: https://github.com/bytedance/deer-flow/pull/3461
[#3464]: https://github.com/bytedance/deer-flow/pull/3464
[#3465]: https://github.com/bytedance/deer-flow/pull/3465
[#3466]: https://github.com/bytedance/deer-flow/pull/3466
[#3470]: https://github.com/bytedance/deer-flow/pull/3470
[#3471]: https://github.com/bytedance/deer-flow/pull/3471
[#3473]: https://github.com/bytedance/deer-flow/pull/3473
[#3475]: https://github.com/bytedance/deer-flow/pull/3475
[#3481]: https://github.com/bytedance/deer-flow/pull/3481
[#3485]: https://github.com/bytedance/deer-flow/pull/3485
[#3487]: https://github.com/bytedance/deer-flow/pull/3487
[#3488]: https://github.com/bytedance/deer-flow/pull/3488
[#3494]: https://github.com/bytedance/deer-flow/pull/3494
[#3495]: https://github.com/bytedance/deer-flow/pull/3495
[#3498]: https://github.com/bytedance/deer-flow/pull/3498
[#3499]: https://github.com/bytedance/deer-flow/pull/3499
[#3502]: https://github.com/bytedance/deer-flow/pull/3502
[#3503]: https://github.com/bytedance/deer-flow/pull/3503
[#3505]: https://github.com/bytedance/deer-flow/pull/3505
[#3506]: https://github.com/bytedance/deer-flow/pull/3506
[#3508]: https://github.com/bytedance/deer-flow/pull/3508
[#3512]: https://github.com/bytedance/deer-flow/pull/3512
[#3514]: https://github.com/bytedance/deer-flow/pull/3514
[#3517]: https://github.com/bytedance/deer-flow/pull/3517
[#3518]: https://github.com/bytedance/deer-flow/pull/3518
[#3519]: https://github.com/bytedance/deer-flow/pull/3519
[#3521]: https://github.com/bytedance/deer-flow/pull/3521
[#3526]: https://github.com/bytedance/deer-flow/pull/3526
[#3528]: https://github.com/bytedance/deer-flow/pull/3528
[#3530]: https://github.com/bytedance/deer-flow/pull/3530
[#3531]: https://github.com/bytedance/deer-flow/pull/3531
[#3533]: https://github.com/bytedance/deer-flow/pull/3533
[#3534]: https://github.com/bytedance/deer-flow/pull/3534
[#3535]: https://github.com/bytedance/deer-flow/pull/3535
[#3548]: https://github.com/bytedance/deer-flow/pull/3548
[#3551]: https://github.com/bytedance/deer-flow/pull/3551
[#3553]: https://github.com/bytedance/deer-flow/pull/3553
[#3554]: https://github.com/bytedance/deer-flow/pull/3554
[#3556]: https://github.com/bytedance/deer-flow/pull/3556
[#3557]: https://github.com/bytedance/deer-flow/pull/3557
[#3559]: https://github.com/bytedance/deer-flow/pull/3559
[#3561]: https://github.com/bytedance/deer-flow/pull/3561
[#3562]: https://github.com/bytedance/deer-flow/pull/3562
[#3563]: https://github.com/bytedance/deer-flow/pull/3563
[#3566]: https://github.com/bytedance/deer-flow/pull/3566
[#3569]: https://github.com/bytedance/deer-flow/pull/3569
[#3570]: https://github.com/bytedance/deer-flow/pull/3570
[#3573]: https://github.com/bytedance/deer-flow/pull/3573
[#3575]: https://github.com/bytedance/deer-flow/pull/3575
[#3577]: https://github.com/bytedance/deer-flow/pull/3577
[#3578]: https://github.com/bytedance/deer-flow/pull/3578
[#3579]: https://github.com/bytedance/deer-flow/pull/3579
[#3580]: https://github.com/bytedance/deer-flow/pull/3580
[#3581]: https://github.com/bytedance/deer-flow/pull/3581
[#3582]: https://github.com/bytedance/deer-flow/pull/3582
[#3583]: https://github.com/bytedance/deer-flow/pull/3583
[#3584]: https://github.com/bytedance/deer-flow/pull/3584
[#3585]: https://github.com/bytedance/deer-flow/pull/3585
[#3590]: https://github.com/bytedance/deer-flow/pull/3590
[#3591]: https://github.com/bytedance/deer-flow/pull/3591
[#3592]: https://github.com/bytedance/deer-flow/pull/3592
[#3599]: https://github.com/bytedance/deer-flow/pull/3599
[#3600]: https://github.com/bytedance/deer-flow/pull/3600
[#3601]: https://github.com/bytedance/deer-flow/pull/3601
[#3602]: https://github.com/bytedance/deer-flow/pull/3602
[#3605]: https://github.com/bytedance/deer-flow/pull/3605
[#3606]: https://github.com/bytedance/deer-flow/pull/3606
[#3608]: https://github.com/bytedance/deer-flow/pull/3608
[#3610]: https://github.com/bytedance/deer-flow/pull/3610
[#3611]: https://github.com/bytedance/deer-flow/pull/3611
[#3623]: https://github.com/bytedance/deer-flow/pull/3623
[#3624]: https://github.com/bytedance/deer-flow/pull/3624
[#3627]: https://github.com/bytedance/deer-flow/pull/3627
[#3629]: https://github.com/bytedance/deer-flow/pull/3629
[#3631]: https://github.com/bytedance/deer-flow/pull/3631
[#3637]: https://github.com/bytedance/deer-flow/pull/3637
[#3644]: https://github.com/bytedance/deer-flow/pull/3644
[#3646]: https://github.com/bytedance/deer-flow/pull/3646
[#3648]: https://github.com/bytedance/deer-flow/pull/3648
[#3649]: https://github.com/bytedance/deer-flow/pull/3649
[#3651]: https://github.com/bytedance/deer-flow/pull/3651
[#3654]: https://github.com/bytedance/deer-flow/pull/3654
[#3657]: https://github.com/bytedance/deer-flow/pull/3657
[#3658]: https://github.com/bytedance/deer-flow/pull/3658
[#3661]: https://github.com/bytedance/deer-flow/pull/3661
[#3662]: https://github.com/bytedance/deer-flow/pull/3662
[#3663]: https://github.com/bytedance/deer-flow/pull/3663
[#3665]: https://github.com/bytedance/deer-flow/pull/3665
[#3673]: https://github.com/bytedance/deer-flow/pull/3673
[#3674]: https://github.com/bytedance/deer-flow/pull/3674
[#3675]: https://github.com/bytedance/deer-flow/pull/3675
[#3685]: https://github.com/bytedance/deer-flow/pull/3685
[#3686]: https://github.com/bytedance/deer-flow/pull/3686
[#3687]: https://github.com/bytedance/deer-flow/pull/3687
[#3698]: https://github.com/bytedance/deer-flow/pull/3698
[#3709]: https://github.com/bytedance/deer-flow/pull/3709
[#3711]: https://github.com/bytedance/deer-flow/pull/3711
[#3713]: https://github.com/bytedance/deer-flow/pull/3713
[#3714]: https://github.com/bytedance/deer-flow/pull/3714
[#3718]: https://github.com/bytedance/deer-flow/pull/3718
[#3719]: https://github.com/bytedance/deer-flow/pull/3719
[#3729]: https://github.com/bytedance/deer-flow/pull/3729
[#3730]: https://github.com/bytedance/deer-flow/pull/3730
[#3733]: https://github.com/bytedance/deer-flow/pull/3733
[#3740]: https://github.com/bytedance/deer-flow/pull/3740
[#3753]: https://github.com/bytedance/deer-flow/pull/3753
[#3760]: https://github.com/bytedance/deer-flow/pull/3760
[#3764]: https://github.com/bytedance/deer-flow/pull/3764
[#3768]: https://github.com/bytedance/deer-flow/pull/3768
[#3769]: https://github.com/bytedance/deer-flow/pull/3769
[#3770]: https://github.com/bytedance/deer-flow/pull/3770
[#3772]: https://github.com/bytedance/deer-flow/pull/3772
[#3775]: https://github.com/bytedance/deer-flow/pull/3775
[#3786]: https://github.com/bytedance/deer-flow/pull/3786
[#3790]: https://github.com/bytedance/deer-flow/pull/3790
[#3791]: https://github.com/bytedance/deer-flow/pull/3791
[#3794]: https://github.com/bytedance/deer-flow/pull/3794
[#3797]: https://github.com/bytedance/deer-flow/pull/3797
[#3800]: https://github.com/bytedance/deer-flow/pull/3800
[#3809]: https://github.com/bytedance/deer-flow/pull/3809
[#3810]: https://github.com/bytedance/deer-flow/pull/3810
[#3812]: https://github.com/bytedance/deer-flow/pull/3812
[#3821]: https://github.com/bytedance/deer-flow/pull/3821
[#3826]: https://github.com/bytedance/deer-flow/pull/3826
[#3828]: https://github.com/bytedance/deer-flow/pull/3828
[#3837]: https://github.com/bytedance/deer-flow/pull/3837
[#3839]: https://github.com/bytedance/deer-flow/pull/3839
[#3843]: https://github.com/bytedance/deer-flow/pull/3843
[#3845]: https://github.com/bytedance/deer-flow/pull/3845
[#3854]: https://github.com/bytedance/deer-flow/pull/3854
[#3855]: https://github.com/bytedance/deer-flow/pull/3855
[#3856]: https://github.com/bytedance/deer-flow/pull/3856
[#3858]: https://github.com/bytedance/deer-flow/pull/3858
[#3860]: https://github.com/bytedance/deer-flow/pull/3860
[#3866]: https://github.com/bytedance/deer-flow/pull/3866
[#3869]: https://github.com/bytedance/deer-flow/pull/3869
[#3870]: https://github.com/bytedance/deer-flow/pull/3870
[#3871]: https://github.com/bytedance/deer-flow/pull/3871
[#3872]: https://github.com/bytedance/deer-flow/pull/3872
[#3874]: https://github.com/bytedance/deer-flow/pull/3874
[#3877]: https://github.com/bytedance/deer-flow/pull/3877
[#3878]: https://github.com/bytedance/deer-flow/pull/3878
[#3880]: https://github.com/bytedance/deer-flow/pull/3880
[#3881]: https://github.com/bytedance/deer-flow/pull/3881
[#3883]: https://github.com/bytedance/deer-flow/pull/3883
[#3885]: https://github.com/bytedance/deer-flow/pull/3885
[#3886]: https://github.com/bytedance/deer-flow/pull/3886
[#3887]: https://github.com/bytedance/deer-flow/pull/3887
[#3889]: https://github.com/bytedance/deer-flow/pull/3889
[#3897]: https://github.com/bytedance/deer-flow/pull/3897
[#3900]: https://github.com/bytedance/deer-flow/pull/3900
[#3902]: https://github.com/bytedance/deer-flow/pull/3902
[#3904]: https://github.com/bytedance/deer-flow/pull/3904
[#3906]: https://github.com/bytedance/deer-flow/pull/3906
[#3907]: https://github.com/bytedance/deer-flow/pull/3907
[#3908]: https://github.com/bytedance/deer-flow/pull/3908
[#3912]: https://github.com/bytedance/deer-flow/pull/3912
[#3917]: https://github.com/bytedance/deer-flow/pull/3917
[#3920]: https://github.com/bytedance/deer-flow/pull/3920
[#3924]: https://github.com/bytedance/deer-flow/pull/3924
[#3926]: https://github.com/bytedance/deer-flow/pull/3926
[#3927]: https://github.com/bytedance/deer-flow/pull/3927
[#3928]: https://github.com/bytedance/deer-flow/pull/3928
[#3931]: https://github.com/bytedance/deer-flow/pull/3931
[#3934]: https://github.com/bytedance/deer-flow/pull/3934
[#3935]: https://github.com/bytedance/deer-flow/pull/3935
[#3938]: https://github.com/bytedance/deer-flow/pull/3938
[#3940]: https://github.com/bytedance/deer-flow/pull/3940
[#3941]: https://github.com/bytedance/deer-flow/pull/3941
[#3942]: https://github.com/bytedance/deer-flow/pull/3942
[#3944]: https://github.com/bytedance/deer-flow/pull/3944
[#3945]: https://github.com/bytedance/deer-flow/pull/3945
[#3949]: https://github.com/bytedance/deer-flow/pull/3949
[#3950]: https://github.com/bytedance/deer-flow/pull/3950
[#3951]: https://github.com/bytedance/deer-flow/pull/3951
[#3956]: https://github.com/bytedance/deer-flow/pull/3956
[#3959]: https://github.com/bytedance/deer-flow/pull/3959
[#3961]: https://github.com/bytedance/deer-flow/pull/3961
[#3964]: https://github.com/bytedance/deer-flow/pull/3964
[#3966]: https://github.com/bytedance/deer-flow/pull/3966
[#3967]: https://github.com/bytedance/deer-flow/pull/3967
[#3969]: https://github.com/bytedance/deer-flow/pull/3969
[#3971]: https://github.com/bytedance/deer-flow/pull/3971
[#3976]: https://github.com/bytedance/deer-flow/pull/3976
[#3980]: https://github.com/bytedance/deer-flow/pull/3980
[#3981]: https://github.com/bytedance/deer-flow/pull/3981
[#3982]: https://github.com/bytedance/deer-flow/pull/3982
[#3985]: https://github.com/bytedance/deer-flow/pull/3985
[#3986]: https://github.com/bytedance/deer-flow/pull/3986
[#3988]: https://github.com/bytedance/deer-flow/pull/3988
[#3989]: https://github.com/bytedance/deer-flow/pull/3989
[#3990]: https://github.com/bytedance/deer-flow/pull/3990
[#3991]: https://github.com/bytedance/deer-flow/pull/3991
[#3992]: https://github.com/bytedance/deer-flow/pull/3992
[#3993]: https://github.com/bytedance/deer-flow/pull/3993
[#3994]: https://github.com/bytedance/deer-flow/pull/3994
[#3996]: https://github.com/bytedance/deer-flow/pull/3996
[#4003]: https://github.com/bytedance/deer-flow/pull/4003
[#4004]: https://github.com/bytedance/deer-flow/pull/4004
[#4008]: https://github.com/bytedance/deer-flow/pull/4008
[#4009]: https://github.com/bytedance/deer-flow/pull/4009
[#4012]: https://github.com/bytedance/deer-flow/pull/4012
[#4016]: https://github.com/bytedance/deer-flow/pull/4016
[#4017]: https://github.com/bytedance/deer-flow/pull/4017
[#4018]: https://github.com/bytedance/deer-flow/pull/4018
[#4023]: https://github.com/bytedance/deer-flow/pull/4023
[#4024]: https://github.com/bytedance/deer-flow/pull/4024
[#4026]: https://github.com/bytedance/deer-flow/pull/4026
[#4028]: https://github.com/bytedance/deer-flow/pull/4028
[#4033]: https://github.com/bytedance/deer-flow/pull/4033
[#4034]: https://github.com/bytedance/deer-flow/pull/4034
[#4035]: https://github.com/bytedance/deer-flow/pull/4035
[#4036]: https://github.com/bytedance/deer-flow/pull/4036
[#4038]: https://github.com/bytedance/deer-flow/pull/4038
[#4040]: https://github.com/bytedance/deer-flow/pull/4040
[#4051]: https://github.com/bytedance/deer-flow/pull/4051
[#4052]: https://github.com/bytedance/deer-flow/pull/4052
[#4053]: https://github.com/bytedance/deer-flow/pull/4053
[#4055]: https://github.com/bytedance/deer-flow/pull/4055
[#4058]: https://github.com/bytedance/deer-flow/pull/4058
[#4059]: https://github.com/bytedance/deer-flow/pull/4059
[#4060]: https://github.com/bytedance/deer-flow/pull/4060
[#4064]: https://github.com/bytedance/deer-flow/pull/4064
[#4065]: https://github.com/bytedance/deer-flow/pull/4065
[#4067]: https://github.com/bytedance/deer-flow/pull/4067
[#4069]: https://github.com/bytedance/deer-flow/pull/4069
[#4072]: https://github.com/bytedance/deer-flow/pull/4072
[#4073]: https://github.com/bytedance/deer-flow/pull/4073
[#4074]: https://github.com/bytedance/deer-flow/pull/4074
[#4076]: https://github.com/bytedance/deer-flow/pull/4076
[#4077]: https://github.com/bytedance/deer-flow/pull/4077
[#4078]: https://github.com/bytedance/deer-flow/pull/4078
[#4079]: https://github.com/bytedance/deer-flow/pull/4079
[#4080]: https://github.com/bytedance/deer-flow/pull/4080
[#4081]: https://github.com/bytedance/deer-flow/pull/4081
[#4082]: https://github.com/bytedance/deer-flow/pull/4082
[#4084]: https://github.com/bytedance/deer-flow/pull/4084
[#4085]: https://github.com/bytedance/deer-flow/pull/4085
[#4090]: https://github.com/bytedance/deer-flow/pull/4090
[#4094]: https://github.com/bytedance/deer-flow/pull/4094
[#4095]: https://github.com/bytedance/deer-flow/issues/4095
[#4096]: https://github.com/bytedance/deer-flow/pull/4096
[#4097]: https://github.com/bytedance/deer-flow/pull/4097
[#4098]: https://github.com/bytedance/deer-flow/pull/4098
[#4099]: https://github.com/bytedance/deer-flow/pull/4099
[#4100]: https://github.com/bytedance/deer-flow/pull/4100
[#4101]: https://github.com/bytedance/deer-flow/pull/4101
[#4102]: https://github.com/bytedance/deer-flow/pull/4102
[#4103]: https://github.com/bytedance/deer-flow/pull/4103
[#4104]: https://github.com/bytedance/deer-flow/pull/4104
[#4105]: https://github.com/bytedance/deer-flow/pull/4105
[#4108]: https://github.com/bytedance/deer-flow/pull/4108
[#4114]: https://github.com/bytedance/deer-flow/pull/4114
[#4115]: https://github.com/bytedance/deer-flow/pull/4115
[#4117]: https://github.com/bytedance/deer-flow/pull/4117
[#4118]: https://github.com/bytedance/deer-flow/pull/4118
[#4119]: https://github.com/bytedance/deer-flow/pull/4119
[#4122]: https://github.com/bytedance/deer-flow/pull/4122
[#4124]: https://github.com/bytedance/deer-flow/pull/4124
[#4128]: https://github.com/bytedance/deer-flow/pull/4128
[#4129]: https://github.com/bytedance/deer-flow/pull/4129
[#4130]: https://github.com/bytedance/deer-flow/pull/4130
[#4131]: https://github.com/bytedance/deer-flow/pull/4131
[#4133]: https://github.com/bytedance/deer-flow/pull/4133
[#4136]: https://github.com/bytedance/deer-flow/pull/4136
[#4137]: https://github.com/bytedance/deer-flow/pull/4137
[#4140]: https://github.com/bytedance/deer-flow/pull/4140
[#4141]: https://github.com/bytedance/deer-flow/pull/4141
[#4143]: https://github.com/bytedance/deer-flow/pull/4143
[#4146]: https://github.com/bytedance/deer-flow/pull/4146
[#4147]: https://github.com/bytedance/deer-flow/pull/4147
[#4154]: https://github.com/bytedance/deer-flow/pull/4154
[#4155]: https://github.com/bytedance/deer-flow/pull/4155
[#4157]: https://github.com/bytedance/deer-flow/pull/4157
[#4160]: https://github.com/bytedance/deer-flow/pull/4160
[#4161]: https://github.com/bytedance/deer-flow/pull/4161
[#4162]: https://github.com/bytedance/deer-flow/pull/4162
[#4166]: https://github.com/bytedance/deer-flow/pull/4166
[#4169]: https://github.com/bytedance/deer-flow/pull/4169
[#4170]: https://github.com/bytedance/deer-flow/pull/4170
[#4171]: https://github.com/bytedance/deer-flow/pull/4171
[#4174]: https://github.com/bytedance/deer-flow/pull/4174
[#4181]: https://github.com/bytedance/deer-flow/pull/4181
[#4187]: https://github.com/bytedance/deer-flow/pull/4187
[#4188]: https://github.com/bytedance/deer-flow/pull/4188
[#4190]: https://github.com/bytedance/deer-flow/pull/4190
[#4192]: https://github.com/bytedance/deer-flow/issues/4192
[#4193]: https://github.com/bytedance/deer-flow/pull/4193
[#4197]: https://github.com/bytedance/deer-flow/pull/4197
[#4199]: https://github.com/bytedance/deer-flow/pull/4199
[#4202]: https://github.com/bytedance/deer-flow/pull/4202
[#4203]: https://github.com/bytedance/deer-flow/pull/4203
[#4208]: https://github.com/bytedance/deer-flow/pull/4208
[#4209]: https://github.com/bytedance/deer-flow/pull/4209
[#4215]: https://github.com/bytedance/deer-flow/pull/4215
[#4217]: https://github.com/bytedance/deer-flow/pull/4217
[#4218]: https://github.com/bytedance/deer-flow/pull/4218
[#4219]: https://github.com/bytedance/deer-flow/pull/4219
[#4222]: https://github.com/bytedance/deer-flow/pull/4222
[#4225]: https://github.com/bytedance/deer-flow/pull/4225
[#4229]: https://github.com/bytedance/deer-flow/pull/4229
[#4230]: https://github.com/bytedance/deer-flow/pull/4230
[#4234]: https://github.com/bytedance/deer-flow/pull/4234
[#4235]: https://github.com/bytedance/deer-flow/pull/4235
[#4238]: https://github.com/bytedance/deer-flow/pull/4238
[#4239]: https://github.com/bytedance/deer-flow/pull/4239
[#4245]: https://github.com/bytedance/deer-flow/pull/4245
[#4246]: https://github.com/bytedance/deer-flow/pull/4246
[#4251]: https://github.com/bytedance/deer-flow/pull/4251
[#4255]: https://github.com/bytedance/deer-flow/pull/4255
[#4256]: https://github.com/bytedance/deer-flow/pull/4256
[#4260]: https://github.com/bytedance/deer-flow/pull/4260
[#4264]: https://github.com/bytedance/deer-flow/pull/4264
[#4267]: https://github.com/bytedance/deer-flow/pull/4267
[#4268]: https://github.com/bytedance/deer-flow/pull/4268
[#4277]: https://github.com/bytedance/deer-flow/pull/4277
[#4278]: https://github.com/bytedance/deer-flow/pull/4278
[#4279]: https://github.com/bytedance/deer-flow/pull/4279
[#4283]: https://github.com/bytedance/deer-flow/pull/4283
[#4287]: https://github.com/bytedance/deer-flow/pull/4287
[#4288]: https://github.com/bytedance/deer-flow/pull/4288
[#4292]: https://github.com/bytedance/deer-flow/pull/4292
[#4306]: https://github.com/bytedance/deer-flow/pull/4306
[#4309]: https://github.com/bytedance/deer-flow/pull/4309
[#4311]: https://github.com/bytedance/deer-flow/pull/4311
[#4315]: https://github.com/bytedance/deer-flow/pull/4315
[#4316]: https://github.com/bytedance/deer-flow/pull/4316
[#4324]: https://github.com/bytedance/deer-flow/issues/4324
[#4326]: https://github.com/bytedance/deer-flow/pull/4326
[#4337]: https://github.com/bytedance/deer-flow/pull/4337
[#4347]: https://github.com/bytedance/deer-flow/pull/4347
[#4348]: https://github.com/bytedance/deer-flow/pull/4348
[#4354]: https://github.com/bytedance/deer-flow/pull/4354
[#4355]: https://github.com/bytedance/deer-flow/pull/4355
[#4356]: https://github.com/bytedance/deer-flow/pull/4356
[#4358]: https://github.com/bytedance/deer-flow/pull/4358
[#4361]: https://github.com/bytedance/deer-flow/pull/4361
[#4364]: https://github.com/bytedance/deer-flow/pull/4364
[#4365]: https://github.com/bytedance/deer-flow/pull/4365
[#4370]: https://github.com/bytedance/deer-flow/pull/4370
[#4371]: https://github.com/bytedance/deer-flow/pull/4371
[#4373]: https://github.com/bytedance/deer-flow/pull/4373
[#4374]: https://github.com/bytedance/deer-flow/pull/4374
[#4376]: https://github.com/bytedance/deer-flow/pull/4376
[#4381]: https://github.com/bytedance/deer-flow/pull/4381
[#4383]: https://github.com/bytedance/deer-flow/pull/4383
[#4385]: https://github.com/bytedance/deer-flow/pull/4385
[#4391]: https://github.com/bytedance/deer-flow/pull/4391
[#4392]: https://github.com/bytedance/deer-flow/pull/4392
[#4394]: https://github.com/bytedance/deer-flow/pull/4394
[#4402]: https://github.com/bytedance/deer-flow/pull/4402
[#4403]: https://github.com/bytedance/deer-flow/pull/4403
[#4407]: https://github.com/bytedance/deer-flow/pull/4407
[#4408]: https://github.com/bytedance/deer-flow/pull/4408
[#4411]: https://github.com/bytedance/deer-flow/pull/4411
[#4414]: https://github.com/bytedance/deer-flow/issues/4414
[#4424]: https://github.com/bytedance/deer-flow/issues/4424
[#4425]: https://github.com/bytedance/deer-flow/pull/4425
[#4426]: https://github.com/bytedance/deer-flow/pull/4426
[#4430]: https://github.com/bytedance/deer-flow/pull/4430
[#4431]: https://github.com/bytedance/deer-flow/pull/4431
[#4432]: https://github.com/bytedance/deer-flow/pull/4432
[#4434]: https://github.com/bytedance/deer-flow/pull/4434
[#4437]: https://github.com/bytedance/deer-flow/pull/4437
[#4441]: https://github.com/bytedance/deer-flow/pull/4441
[#4442]: https://github.com/bytedance/deer-flow/pull/4442
[#4444]: https://github.com/bytedance/deer-flow/pull/4444
[#4446]: https://github.com/bytedance/deer-flow/pull/4446
[#4447]: https://github.com/bytedance/deer-flow/pull/4447
[#4450]: https://github.com/bytedance/deer-flow/pull/4450
[#4456]: https://github.com/bytedance/deer-flow/pull/4456
[#4459]: https://github.com/bytedance/deer-flow/pull/4459
[#4460]: https://github.com/bytedance/deer-flow/pull/4460
[#4468]: https://github.com/bytedance/deer-flow/pull/4468
[#4469]: https://github.com/bytedance/deer-flow/pull/4469
[#4471]: https://github.com/bytedance/deer-flow/pull/4471