LangChain发布deepagents上下文模式:子代理可继承主管代理完整对话
deepagents新增fork与isolated两种上下文模式,fork模式让子代理继承主管代理对话历史,利用提示缓存减少重复工具调用,适用于延续既有工作或执掌记忆的子代理;isolated模式则保持独立判断。
AI解读:deepagents的上下文模式解决的是多代理系统中上下文共享的取舍问题:子代理默认在全新上下文中启动,虽然隔离了上下文、但会重复主管已完成的文件读取等操作,既慢又费钱。新增的fork模式让子代�理直接继承主管的完整对话,配合提示缓存能减少重复工作,适合执行已诊断问题的修复这类延续性任务;isolated模式则适合需要独立评审的工作,避免子代理被主管的判断带偏。对开发者来说,选择哪种模式取决于子代理是延续主管的工作还是独立评估,这直接关系到成本、速度和输出质量。目前这些功能已随deepagents框架提供,用户可试用并通过GitHub issues反馈,但官方尚未公布两种模式在不同场景下的性能对比数据。
LangChain官方博客宣布,其多代理框架deepagents最新版本引入上下文模式(context modes),支持 "isolated" 和 "fork" 两种取值,用于定义子代理可以从主管代理处接收哪些上下文。开发者可通过Python的 `uv add deepagents` 或TypeScript的 `pnpm i deepagents` 安装体验,反馈渠道包括GitHub issues、论坛及社交媒体。
fork模式是本次新增功能:子代理不会以空白上下文启动,而是继承主管代理的完整状态,包括对话历史。LangChain称,这种模式下提示缓存(prompt caching)仍然生效,在子代理需要详细上下文时,可节省重复的工具调用和上下文收集,从而更快、更便宜。
两种模式的区别与适用场景
isolated模式是deepagents中子代理的默认及既有行为:子代理以全新上下文窗口启动,仅接收主管代理指定的任务描述。博客原文指出,这是实现上下文隔离的方式,主管代理通常只接收子代理的任务结果,中间推理过程不会进入其上下文窗口。
fork模式的具体机制:主管代理生成一个调用子代理的工具调用,其中包含任务描述;子代理接收主管代理的完整状态(含对话历史),系统会切除末尾的工具调用,并将任务描述格式化为用户消息,附上固定前言说明其角色;子代理结束后,主管代理将其最终消息作为对初始工具调用的响应接收。
博客通过两个常见模式帮助开发者决策:worker(延续主管工作的代理)适合用fork,例如主管已定位错误并追踪到某函数后,子代理可直接基于调查进展实现和测试修复;verifier(独立评估者)适合用isolated,例如检查代码差异的正确性、向后兼容性和测试覆盖时,继承主管的推理反而可能锚定评估。
- worker示例代码:const fixerSubagent: SubAgent = { mode: "fork", name: "fixer", description: "Use when a problem has already been diagnosed and the remaining work is to implement and test the fix", systemPrompt: "...", }
- verifier示例代码:const reviewerSubagent: SubAgent = { mode: "isolated", name: "reviewer", description: "Use after an implementation is complete and needs an independent review", systemPrompt: "...", }
四种场景的推荐设置
博客给出了四种任务模式下推荐的上下文模式:研究者代理(researcher)在问题可独立存在时使用isolated,例如查询API在 1.2 与 1.3 版本间的变化并链接发布说明,这有助于多个研究者并行且各自聚焦问题;记忆代理(memory agent)则使用fork,因为对话本身是其分析对象,fork可让其分析完整交互,决定哪些决策、事实或偏好值得存档,无需主管在任务中复述。
博客称,上下文模式是与工具、中间件等并列的子代理特化手段之一。记忆代理示例还展示了对子代理文件系统权限的限制:默认拒绝所有写操作,仅允许对AGENTS.md和docs目录的读取,以约束其编辑范围。
- 研究者代理示例:const researcherSubagent: SubAgent = { mode: "isolated", name: "researcher", description: "Use to investigate a self-contained question and return a condensed, well-sourced answer", tools: [search_engine], }
- 记忆代理示例:const memorizerSubagent: SubAgent = { mode: "fork", name: "memorizer", description: "Use when the conversation contains durable decisions, facts, or preferences worth saving to memory", permissions: [ { operations: ["write"], paths: ["/**"], mode: "deny" }, { operations: ["read"], paths: ["/AGENTS.md", "/docs/**"], mode: "allow" } ] }