资讯详情

【Agent】DeerFlow:长程任务执行Runtime 的沙箱与状态管理拆解

📅 2026/10/12 15:34:09 | 华诺云谱 👁 阅读
【Agent】DeerFlow:长程任务执行Runtime 的沙箱与状态管理拆解
1. 长程任务为什么总在第 7 步崩掉先说一个我踩过的坑用普通 Agent 跑「调研 写代码 出报告」这种链路前 5 步都挺顺到第 7 步左右开始出问题——模型忘了前面生成过哪个文件把已经跑通的脚本又重写一遍或者干脆把中间结果丢了最后交付一段「看起来努力过」的文字。这不是模型笨是它缺一套能扛住长任务的运行时。DeerFlow 就是冲着这个问题来的。它是一个面向长程任务的 Agent Runtime把「规划 → 调度 → 执行 → 观察 → 修正 → 记忆 → 产出」这条链路补齐成可执行、可恢复、可交付的底座。你可以把它理解成给大模型配了一个带文件系统、带沙箱、带长期记忆、带任务调度的工作台而不是只给它一个对话框。它适合谁适合那些想让 Agent 真正「动手干活」的人——比如让 Agent 自己写脚本、跑数据、生成图表、最后产出 md/docx/pptx 文件而不是只给你一段建议。也适合被「上下文膨胀 任务中断」折磨过的开发者因为 DeerFlow 的沙箱隔离和状态持久化正是针对这两个痛点设计的。这篇我会拆三块沙箱怎么隔离执行、状态怎么持久化、以及怎么用 TaoToken 统一 Key/API 通道把模型调用接进去最后跑一条 20 步以上的任务链观察状态恢复表现。全程给可复制的配置片段不空谈。2. DeerFlow Runtime 的沙箱隔离与状态持久化拆解DeerFlow 的架构可以拆成几层但真正决定长程任务能不能跑稳的是 Sandbox 和 Memory 这两块。前者解决「模型能说不能做」后者解决「做着做着就丢信息」。先看 Sandbox。很多 Agent demo 最大的问题是模型只能生成代码文本跑不跑得起来它不管。DeerFlow 的 sandbox 是一个隔离执行环境Agent 可以在里面创建文件、运行代码、读输出、调试报错、生成图表、保存中间产物。关键在「隔离」两个字——代码在沙箱里跑不会污染宿主机也不会因为一次失败把整个任务链带崩。你可以把它想成一个一次性的工作台脏活累活都在里面干干完把产物拿出来。再看状态持久化。长任务里最容易出问题的地方是上下文越来越乱模型不知道自己做到哪一步。DeerFlow 的做法不是把所有东西硬塞进 prompt而是通过 Middleware Chain 做运行时注入——每一步模型看到的不是一坨原始对话历史而是被整理过的、对当前决策有用的信息当前工作目录、文件上下文、记忆信息、sandbox 状态、工具列表、skill 信息、上下文压缩结果、任务执行状态。这里有个设计我觉得挺聪明Skill 的渐进式加载。它不会一上来把所有 skill 全文塞进 prompt而是先只注入 name/description/location模型判断 query 和哪个 skill 匹配后再用 read_file 去读对应的 SKILL.md。参考代码在deer-flow/backend/packages/harness/deerflow/agents/lead_agent/prompt.py核心逻辑是lru_cache(maxsize32) def _get_cached_skills_prompt_section( skill_signature: tuple[tuple[str, str, str, str], ...], available_skills_key: tuple[str, ...] | None, container_base_path: str, skill_evolution_section: str, ) - str: filtered [ (name, description, category, location) for name, description, category, location in skill_signature if available_skills_key is None or name in available_skills_key ] skills_list if filtered: skill_items \n.join( f skill\n f name{name}/name\n f description{description} {_skill_mutability_label(category)}/description\n f location{location}/location\n f /skill for name, description, category, location in filtered ) skills_list favailable_skills\n{skill_items}\n/available_skills return fskill_system You have access to skills that provide optimized workflows for specific tasks. **Progressive Loading Pattern:** 1. When a user query matches a skills use case, immediately call read_file on the skills main file 2. Read and understand the skills workflow and instructions 3. The skill file contains references to external resources under the same folder 4. Load referenced resources only when needed during execution 5. Follow the skills instructions precisely **Skills are located at:** {container_base_path} {skill_evolution_section} {skills_list} /skill_system注意这里加了 LRU 缓存避免重复拼 prompt同时用allowed-tools做工具权限过滤skill 能绑哪些工具是受约束的。这套「Prompt 摘要路由 文件渐进加载 工具权限过滤」的组合是控制上下文膨胀的关键。Memory 这块DeerFlow 把它作为基础组件保存任务状态、中间结论和历史经验。没有 memoryAgent 每一步都只靠当前上下文很容易忘记用户最初要求、忘记前面生成过什么、重复做已完成的步骤、跨会话无法接续。有了它任务中断后可以恢复而不是从头再来。把这几层串起来看Lead Agent 做总控Planner 拆任务Subagents 分工执行Sandbox 负责动手Memory 负责记状态Message Gateway 管 Agent 间通信和状态同步。这套结构更接近真实工作流——不是一个人从头干到尾而是项目经理协调多个执行者中间产物有地方存失败了能恢复。3. 可复制的 Runtime 配置与 TaoToken 接入片段这一节给能直接抄的配置。先说模型调用通道——DeerFlow 的模型调用需要 Base URL、API Key、Model ID 三件套我用 TaoToken 统一管理好处是一个 Key 走通所有模型调用不用在多个平台之间来回切。TaoToken 的 API 地址是https://taotoken.net/api官网在https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content。先去控制台建 Key地址是https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentruntime_configutm_campaignrewriteKey 管理页在https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentruntime_configutm_campaignrewrite。拿到 Key 后写进 DeerFlow 的运行时配置。假设你用 JSON 格式的 settings{ model: { provider: openai-compatible, base_url: https://taotoken.net/api, api_key: sk-你的TaoToken密钥, model_id: claude-sonnet-4-5, max_tokens: 8192, temperature: 0.3 }, runtime: { sandbox: { enabled: true, workdir: /workspace/deerflow, timeout_seconds: 300, persist_artifacts: true }, memory: { enabled: true, backend: file, path: /workspace/deerflow/memory, max_context_tokens: 120000 }, middleware: { context_compression: true, skill_progressive_loading: true } } }如果你用 TOML 风格部分 DeerFlow 版本支持等价写法[model] provider openai-compatible base_url https://taotoken.net/api api_key sk-你的TaoToken密钥 model_id claude-sonnet-4-5 max_tokens 8192 temperature 0.3 [runtime.sandbox] enabled true workdir /workspace/deerflow timeout_seconds 300 persist_artifacts true [runtime.memory] enabled true backend file path /workspace/deerflow/memory max_context_tokens 120000三件套对应关系要记牢Base URL 填https://taotoken.net/apiAPI Key 填控制台生成的sk-开头密钥Model ID 填你要用的模型标识比如claude-sonnet-4-5或gpt-4o。这三个任何一个填错都会在验证阶段报错下一节会讲怎么排查。如果你用 Claude Code 做辅助开发配置在~/.claude/settings.json{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-你的TaoToken密钥, ANTHROPIC_MODEL: claude-sonnet-4-5 } }Codex 用户则改~/.codex/auth.json{ OPENAI_BASE_URL: https://taotoken.net/api, OPENAI_API_KEY: sk-你的TaoToken密钥 }Cline 的 MCP 配置里把 provider 的 base URL 指向 TaoTokenKey 填同一个Model ID 按需选。这样无论你用哪个客户端模型调用都走同一条通道Key 统一管理换模型只改 Model ID。配置写完后先别急着跑长任务用一条最小请求验证通道通不通。下一节给验证步骤。4. 验证请求与 20 步任务链回放配置写完第一步是验证模型通道。用 curl 发一条最小请求curl -X POST https://taotoken.net/api/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer sk-你的TaoToken密钥 \ -d { model: claude-sonnet-4-5, messages: [{role: user, content: 回复 OK 两个字母}], max_tokens: 16 }正常返回里会有choices[0].message.content内容是OK。如果这一步就报错先别往下走去第 5 节对照排查。通道通了之后跑一条长程任务链。我用的测试任务是让 Agent 调研「Python 异步编程常见陷阱」写一段复现脚本跑出结果生成一份 markdown 报告。这条链路天然超过 20 步搜索资料、整理要点、写脚本、执行、读输出、发现报错、改脚本、再执行、生成报告、检查格式……正好用来观察状态恢复。启动命令假设 DeerFlow 已装好cd /workspace/deerflow python -m deerflow.run \ --task 调研 Python 异步编程常见陷阱写复现脚本并跑出结果生成 markdown 报告 \ --config ./settings.json \ --max-steps 30 \ --checkpoint-interval 5--checkpoint-interval 5是关键每 5 步存一次状态。跑到第 12 步左右我手动 CtrlC 中断然后恢复python -m deerflow.run \ --resume /workspace/deerflow/memory/checkpoint_latest.json \ --config ./settings.json恢复后观察两点一是 Agent 有没有从第 12 步继续而不是从第 1 步重来二是前面生成的中间文件比如已写好的脚本、已抓取的资料还在不在。实测下来只要 memory 的persist_artifacts开着恢复后 Agent 能接着用之前的产物不会重复劳动。成功结果长这样任务跑完/workspace/deerflow/artifacts/下出现report.md、repro.py、output.txt三个文件report.md 里有完整的调研结论和脚本运行结果。整个链路 23 步中途中断一次恢复后继续跑完状态没丢。如果你想让 Agent 在恢复后还能记住「上次为什么中断」可以在 memory 配置里加save_failure_reason: true这样恢复时模型能看到上次的失败上下文避免重蹈覆辙。5. 常见报错排查401、local proxy failed、reading choices长任务跑不起来八成是配置或通道问题。这一节对照真实报错给排查路径。401 Unauthorized最常见。原因通常是 API Key 填错、Key 过期、或者 Base URL 写成了带路径的完整地址。检查三点Key 是不是sk-开头且没多余空格Base URL 是不是https://taotoken.net/api不要在后面加/v1客户端会自动拼Key 有没有在控制台被禁用。如果用的是 Claude Code检查ANTHROPIC_API_KEY和ANTHROPIC_BASE_URL是否都设了。local proxy failed / connection refused这个报错通常出现在客户端试图走本地代理但代理没起来。检查你的环境变量里有没有残留的HTTP_PROXY/HTTPS_PROXY指向一个不存在的本地端口。清掉这些变量再试unset HTTP_PROXY HTTPS_PROXY http_proxy https_proxy另外确认 Base URL 是https://taotoken.net/api而不是http://协议写错也会连不上。reading choices of undefined这个报错说明请求发出去了但返回结构里没有choices字段。常见原因是 Model ID 填错——比如填了一个 TaoToken 不支持的模型名返回的是错误对象而不是标准 completion 结构。去模型对话页https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contenterror_choicesutm_campaignrewrite确认你要用的 Model ID 拼写然后回配置里改对。OAuth / token expired如果你用的是需要 OAuth 的客户端比如某些 Claude Code 版本报这个错说明 token 刷新失败。最稳的办法是改用 API Key 方式在settings.json里直接填ANTHROPIC_API_KEY绕开 OAuth 流程。沙箱超时如果任务卡在某一步不动看日志是不是 sandbox 执行超时。默认timeout_seconds是 300跑大数据量脚本可能不够调到 600 或 900。同时确认workdir目录有写权限。状态恢复后重复执行如果恢复后 Agent 从第 1 步重来检查checkpoint_interval是不是设得太大比如 20导致中断时还没存 checkpoint。调小到 5 或 3牺牲一点性能换恢复粒度。排查顺序建议先 curl 验证通道 → 再检查配置文件三件套 → 再看客户端环境变量 → 最后看沙箱和 memory 配置。大部分问题在前两步就能定位。6. 把长程任务跑稳的关键习惯最后说几个实操习惯不是总结是能直接用的。第一Model ID 别写死在一个地方。用环境变量或配置中心管理换模型时只改一处。TaoToken 的好处就在这——Base URL 和 Key 不变只换 Model ID 就能在 Claude、GPT 之间切长任务里不同阶段甚至可以用不同模型规划用强模型执行用快模型。第二checkpoint 间隔别贪大。5 步一存是甜点既不会太频繁拖慢速度中断时最多丢 5 步。跑特别长的任务可以调到 3。第三沙箱的persist_artifacts一定开着。这是状态恢复能接上的前提关掉的话恢复后中间产物全丢等于白跑。第四Skill 的allowed-tools要收紧。给 skill 绑太多工具模型容易乱调绑太少又干不了活。按 skill 的实际职责给最小权限集。第五长任务跑之前先用小任务验证通道和配置。别一上来就跑 30 步先跑个 3 步的确认模型调用、沙箱执行、状态保存都正常再上长链路。这套组合跑下来20 步以上的任务链基本能稳住中断恢复也不会丢状态。剩下的就是按你的具体场景调 skill 和 memory 策略了。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑