学习笔记 · Obsidian

Deep Agents TypeScript:差异与定制

LangChainTypeScriptJavaScript

路由边界:/oss/javascript/deepagents 与 /harness 都规范跳转到本页 overview;它们不是额外的一套 API,但属于站内可点击入口。

结论先行

TypeScript 版与 Python 版共享同一套 Deep Agents 思想:在 LangChain Agent 与 LangGraph 之上预装文件工作区、上下文压缩、同步/异步子代理、技能、记忆和人机审批。真正需要区别对待的是 API 命名、可配置项、中间件组合语义和若干尚未对齐的能力。

TypeScript 最小入口是 deepagents 包的 createDeepAgent,配置对象采用 camelCase。文档中的代码与 JavaScript API Reference 应优先于同页残留的 Python 式 prose;当前 TypeScript 文档有多处 create_deep_agent、system_prompt、interrupt_on 等复制残留,不能照抄到代码里。

何时选 Deep Agents

需求更合适的抽象
少量工具、短对话、无需工作区LangChain createAgent
确定性分支、显式状态机、细粒度节点控制LangGraph
长任务、文件工作区、子代理隔离、自动压缩和治理Deep Agents

与 Claude Agent SDK 相比,Deep Agents 的主要取舍是解耦:模型、执行后端和部署目标可分别选择;可在沙箱内运行 Agent,也可让 Agent 在外部把远程沙箱当工具。代价是跨模型兼容与调参责任更多落在使用方。比较页本身注明草拟日期为 2026-04-16,产品选型时应重新核验竞品现状。

快速启动与 TypeScript 约定

  1. 安装 deepagents、langchain、@langchain/core,再安装所选模型与工具的集成包。
  2. 使用 createDeepAgent({ model, tools, systemPrompt }) 创建 Agent。
  3. 模型必须支持 tool calling;字符串通常采用 provider:model。
  4. 任务规划不是默认能力。需要 write_todos 时显式追加 todoListMiddleware()。
  5. 搜索可使用供应商原生工具,或 @langchain/tavily 等外部工具。

Google 的示例代码使用 google-genai:...,但部分 prose 写成 google_genai:...。以可运行示例和模型集成文档为准,不混用连字符与下划线。

createDeepAgent 配置地图

TypeScript 字段作用与 Python 的关键差异
model模型标识或模型实例相同概念
systemPrompt业务角色、目标和约束camelCase
tools领域工具与内置文件/委派工具并存
memory启动时加载的 AGENTS.md相同概念
skills渐进加载的技能目录相同概念
backend文件与执行环境TS 后端协议 V2 原生支持二进制
permissions内置文件工具路径规则当前只有 allow / deny
subagents同步或异步子代理规格字段同样使用 camelCase
middleware调用方附加中间件文档只保证追加,不保证按名称替换默认项
interruptOn工具级人机审批需 checkpointer 才能跨中断恢复
responseFormat主代理结构化结果结果位于 structuredResponse
contextSchema单次运行的只读上下文类型常用 Zod;向子代理传播

TypeScript 定制页没有列出 Python 的 stateSchema。不要从 Python 版推断 TypeScript 支持相同入口;需要自定义持久状态时先核对当前 JS API Reference 或直接使用 LangGraph。

默认中间件栈

裸栈

只有模型时,核心顺序可概括为:

  1. Filesystem middleware
  2. 同步 SubAgent middleware(默认 general-purpose 存在时)
  3. Summarization middleware
  4. PatchToolCalls middleware
  5. 支持供应商的提示缓存与 profile 附加能力

启用全部能力后的顺序

  1. Skills
  2. Filesystem + permissions
  3. 同步 SubAgent
  4. Summarization
  5. PatchToolCalls
  6. AsyncSubAgent
  7. 调用方 middleware
  8. Harness profile 的额外 middleware
  9. excludedTools 过滤
  10. Anthropic / Bedrock 提示缓存
  11. Memory
  12. Human-in-the-loop

顺序具有语义:PatchToolCalls 修复中断或取消留下的悬空工具调用;Memory 在系统提示最终组装阶段注入;HITL 必须看到最终工具集合。

TypeScript 的覆盖边界

Python 文档说明“同名中间件整体替换默认实例”,而 TypeScript 定制页只说明用户 middleware 会追加在 PatchToolCalls 之后,且“覆盖默认中间件”小节没有给出可用机制。因此:

  • 不要依赖名称碰撞替换默认中间件。
  • 需要移除工具时优先使用 harness profile 的 excludedTools。
  • 需要改变整体执行栈时,直接用 LangChain createAgent 组装 middleware,或核对当前 TypeScript API 后再实现。
  • 自定义 middleware hook 不应修改共享闭包变量;并发运行时使用 graph state 或并发安全存储。

Harness profiles

TypeScript 当前明确支持 harness profile,用于一次性表达供应商/模型相关的执行外壳差异:

  • baseSystemPrompt / systemPromptSuffix
  • toolDescriptionOverrides
  • excludedTools / excludedMiddleware
  • extraMiddleware
  • generalPurposeSubagent

extraMiddleware 可为静态数组或零参数工厂;工厂适合为每个 Agent 创建新实例。Filesystem 与 SubAgent 属于必要脚手架,不能通过 excludedMiddleware 删除。profile 可解析和序列化 YAML/JSON,但包含非空 middleware 实例时无法完整序列化。

TypeScript 没有 Python 的 entrypoint 插件注册方式;应用启动时直接调用注册 API。profiles 专页还明确说 provider profiles 与插件注册系统是 Python-only。与之冲突的是 models 页仍展示 ProviderProfile prose。当前应以更具体的 profiles 页与 API Reference 为准,不把 ProviderProfile 当作已确认的 TypeScript 能力。

模型选择原则

  • 简单检索与分类可用更快、更便宜的模型;长推理、代码与复杂工具编排选更强模型。
  • Agent 是否成功不只由通用 benchmark 决定,还取决于 tool calling、上下文长度、结构化输出和供应商限流。
  • models 页的评测表是一个时间点快照,不是永久排名;上线前用自己的任务集评估。
  • 提示缓存仅对支持的供应商生效,其他供应商应视为 no-op,而不是错误。

两个导航入口的真实边界

  • code-link 当前 307 跳转到 /oss/deepagents/code/overview。它只是 Deep Agents Code 的桥接入口;dcode 是基于 Python SDK 的独立终端产品,不是 TypeScript SDK 子模块。
  • changelog-js 当前 307 跳转到 /oss/javascript/releases/changelog。它是 JavaScript 生态全局 changelog,不是 Deep Agents 独有版本日志。

文档使用守则

当前 TypeScript 页面存在跨语言混排。遇到冲突时按以下证据优先级处理:

  1. TypeScript API Reference 与导出的类型。
  2. 同页 TypeScript 代码示例。
  3. TypeScript 专题页的明确限制说明。
  4. 通用 prose。
  5. 明显使用 snake_case、Python 类型或 Python 包版本的段落。

这不是风格问题,而是正确性问题:例如 Python 的 state_schema、middleware 同名替换、permission interrupt 模式和 provider profile 都不能直接移植到 TypeScript。