DeerFlow
DeerFlow 防循环源码:调用归一化、指纹和有界状态
阅读并验证 Python 辅助函数,理解 200 行分桶、与顺序无关的调用指纹,以及插入顺序淘汰与 LRU 的差别。
你将学会
- 先统一供应方参数,再比较调用
- 保留有意义的变化,消除无关顺序
- 不启动智能体,也能验证一个明确边界
开始前需要
- 基础 Python、HTTP 和容器知识
- 拥有明确验收条件的自有任务
解释本章实现边界,并应用检查清单或隔离辅助函数练习。
先看结论
- 参数归一化消除传输格式差异。
- 指纹忽略排列,但保留重复次数。
- 按插入顺序淘汰不等于 LRU。
先统一供应方参数,再比较调用
_normalize_tool_call_args 直接接收字典,也会防御性解析 JSON 字符串。解析得到字典就作为普通参数;得到其他 JSON 值则保存稳定的回退字符串,非法 JSON 也不会使检测器直接崩溃。同一语义调用可能被不同供应方用不同传输形式表示,因此归一化是比较前的重要步骤。
_stable_tool_key 特别处理 read_file:转换并排序起止行号,将其限制为至少一,再按每 200 行分桶。同一路径的 1–199 行与 200–1 行都属于 0–0 桶,从 201 行开始则属于 1–1 桶。因此,小幅改变行号不一定能使重复读取被当成新工作。
保留有意义的变化,消除无关顺序
write_file 和 str_replace 使用完整参数,因为同一路径的内容变化可能是合理进展。其他工具优先使用路径、URL、查询、命令等显著字段。这些规则是启发式近似,不是语义证明:自定义工具被忽略的字段可能很重要,而分桶读取也可能合并有用但不同的请求。
_hash_tool_calls 排序归一化后的名称与键,序列化后取 MD5 的前十二个十六进制字符。调整批次顺序不会改变指纹,但增加一个重复调用会改变多重集合及其指纹。这种短标识用于重复追踪,既不是授权令牌,也不具备无碰撞的正确性保证。
不启动智能体,也能验证一个明确边界
只读探针先检查下载源码的精确哈希,再通过 Python AST 仅抽取三个已审查函数,并使用标准库执行。它验证了 JSON 归一化、行号分桶、写入内容敏感性、排列不变性和重复次数保留。另一个 BoundedDict 模块也被执行:更新键不会刷新插入顺序,加入 c 时淘汰的是 a,而不是 b。
BoundedDict 用于停止原因存储,与检测器线程历史的 LRU 策略不同。下面的 JavaScript 仅独立模拟整数行范围分桶,不依赖 DeerFlow。这个例子和 Python 辅助函数探针都没有执行完整中间件生命周期、沙箱、模型供应方或上游集成测试。
实施步骤
- 1
阅读固定提交的三个辅助函数。
- 2
比较跨越 200 行边界的读取范围。
- 3
分别检查内容变化、批次重排和重复调用。
- 4
把辅助函数通过与完整运行验证分开。
可复制示例
// 仅模拟整数行范围,不是上游 Python 运行时。
function readBucket(path, start = 1, end = start) {
const [lo, hi] = [start, end].sort((a, b) => a - b);
return `${path}:${Math.floor((Math.max(lo, 1) - 1) / 200)}-${Math.floor((Math.max(hi, 1) - 1) / 200)}`;
}
console.log([readBucket("a", 1, 199), readBucket("a", 200, 1), readBucket("a", 201)]);常见问题
JavaScript 例子就是 DeerFlow 原实现吗?
不是,它仅模拟整数行范围。另有带源码哈希校验的 Python 探针实际执行了所查辅助函数。
指纹相同能证明调用语义完全一致吗?
不能。显著字段和行号分桶有意近似重复行为,截断摘要也不是无碰撞标识。
资料来源
- README.md来源核查 2026-09-08
- LICENSE来源核查 2026-09-08
- backend/README.md来源核查 2026-09-08
- backend/pyproject.toml来源核查 2026-09-08
- backend/docs/middleware-execution-flow.md来源核查 2026-09-08
- backend/packages/harness/deerflow/agents/lead_agent/agent.py来源核查 2026-09-08
- backend/packages/harness/deerflow/agents/middlewares/loop_detection_middleware.py来源核查 2026-09-08
- backend/packages/harness/deerflow/agents/middlewares/_bounded_dict.py来源核查 2026-09-08
- backend/packages/harness/deerflow/config/loop_detection_config.py来源核查 2026-09-08
- backend/packages/harness/deerflow/sandbox/local/local_sandbox_provider.py来源核查 2026-09-08
- backend/app/gateway/auth_middleware.py来源核查 2026-09-08
- backend/app/gateway/csrf_middleware.py来源核查 2026-09-08
- docker/docker-compose.yaml来源核查 2026-09-08