一、Claude Code — Dynamic Workflows

Dynamic Workflows 让 Claude 动态编写编排脚本,在单次 session 中调度数十到数百个并行 subagent,并在结果交给用户之前自动完成验证。它专门针对"太大、太复杂、一次过不了"的任务而设计。

核心机制:

当 workflow 启动后,Claude 根据 prompt 动态规划、拆解子任务,并将工作扇出到并行运行的多个 subagent。各 subagent 从独立角度攻克问题,另有对抗型 agent 专门尝试推翻其结论,整个流程持续迭代直到答案收敛。进度实时保存,中断后从断点续跑而不是重头开始。

两种启动方式:直接对 Claude 说"Create a workflow",或在 effort 菜单开启 ultracode 设置让 Claude 自行判断何时启用。

典型场景:全代码库 bug 排查与安全审计、大规模框架迁移(跨数千个文件)、以及对正确性要求极高的关键工作(多套独立方案 + 对抗验证)。

真实案例:Bun 将约 75 万行代码从 Zig 移植到 Rust,99.8% 原有测试通过,从第一个 commit 到合并只用了 11 天,全程由 dynamic workflows 驱动:一批 agent 并行转写文件,每个文件配两个 reviewer,修复循环持续跑到编译和测试全过为止。


二、LangGraph Deep Agents — Interpreters

Interpreter 给 agent 提供一个可编程的工作空间,让它在其中探索数据、协调工具调用,并把中间结果挡在模型上下文之外。Agent 写代码表达意图,内存中的运行时执行这段代码并只把相关结果返回给模型。

与 sandbox 的区别:sandbox 是对外部环境执行操作(运行命令、安装依赖、修改文件),而 interpreter 是在 agent 循环内部行动:组合工具、保持状态、决定什么信息应该返回给模型。

适用场景(选择判断矩阵):

需求用什么
一两个简单外部调用普通 tool calling
需要循环、分支、重试或聚合结果的小程序Interpreter
从代码中发起多个 tool 调用Interpreter + 程序化 tool calling
跨线程可复用的辅助函数Interpreter + Interpreter Skills
Shell 命令、包安装、完整 OS 文件系统Sandboxes

安装与初始化:

pip install -U "deepagents[quickjs]"
from deepagents import create_deep_agent
from langchain_quickjs import CodeInterpreterMiddleware

agent = create_deep_agent(
    model="openai:gpt-5.4",
    middleware=[CodeInterpreterMiddleware()],
)

middleware 会向 agent 添加一个 eval 工具,在持久化 QuickJS 上下文中运行 TypeScript,捕获 console.log,并返回最后一个表达式的值。

程序化 Tool Calling(PTC):

PTC 把选定的 agent tool 暴露在 interpreter 的全局 tools 命名空间下,让 agent 可以用代码在循环、分支、重试或并行批次中调用工具,而不是让模型一次发一个 tool call 再等结果。中间的 tool 结果可以在 interpreter 里过滤或聚合,只有最终结果回到模型上下文,这在多工具多步骤流程中更节省 token。

agent = create_deep_agent(
    model="openai:gpt-5.4",
    middleware=[CodeInterpreterMiddleware(ptc=["task"])],
)

在 interpreter 里并行调度 subagent:

const topics = ["retrieval", "memory", "evaluation"];

const reports = await Promise.all(
  topics.map((topic) =>
    tools.task({
      description: `Research ${topic} and return three concise findings.`,
      subagent_type: "general-purpose",
    }),
  ),
);

reports.join("\n\n");

状态快照与时间旅行:

interpreter 状态(全局变量、函数、已导入模块)在每次 agent run 结束后被序列化快照,下次 run 时恢复。配合 LangGraph 的 checkpointer,可以回到任意历史时间点——恢复图的 checkpoint 同时恢复对应的 interpreter 状态,适合调试和回放。


三、Interpreter Skills

Interpreter Skills 的核心就是把 skill 目录下的 JS/TS 脚本文件注册为可 import 的模块,agent 在 interpreter 里写 await import("@/skills/<name>") 就能调用里面的函数。

普通 skill 给 agent 提供指令和上下文;Interpreter skill 额外给 agent 提供可导入的函数,让它在 interpreter 代码中直接调用。这样就可以把领域特定的逻辑打包一次,变成 agent 工作空间里的确定性构建块——不再让模型每次都重新"发明"一个解析器、评分器、规范化器或聚合函数,而是直接 import 一个经过测试的辅助函数,与工具、subagent 和运行时状态组合使用。

适合做成 Interpreter Skill 的代码需满足:在多个 prompt、agent 或项目间可复用;足够确定性,每次行为一致;细节太多不适合放在模型上下文里;在更大的工作流中有用(比如给搜索结果评分、规范化 API 响应、验证记录、分组行、把数据转换成报告格式)。

文件结构:

skills/
└── order-helpers/
    ├── SKILL.md        ← 元数据 + 使用说明
    └── index.ts        ← 实际可导入的代码

SKILL.md 的关键字段:module: index.ts——这个字段标记它是一个 interpreter skill,指向脚本文件。

---
name: order-helpers
description: Helper functions for normalizing and grouping order records.
module: index.ts          ← 必须有这个字段
---

# order-helpers

Import these utilities into the REPL:

```typescript
const { groupByStatus } = await import("@/skills/order-helpers");
groupByStatus(...);```

index.ts 的内容(正经的 TypeScript,不是说明文字):

interface Order {
  id: string;
  status: string;
}

export function groupByStatus(orders: Order[]) {
  return orders.reduce((acc, order) => {
    acc[order.status] = acc[order.status] ?? [];
    acc[order.status].push(order);
    return acc;
  }, {});
}

配置 agent 时,CodeInterpreterMiddleware 必须传入 skills_backend 参数,让它知道从哪里加载 skill 模块:

from deepagents import create_deep_agent
from deepagents.backends import StateBackend
from langchain_quickjs import CodeInterpreterMiddleware

backend = StateBackend()

agent = create_deep_agent(
    model="openai:gpt-5.4",
    backend=backend,
    skills=["/skills/"],                                          # 告诉 agent 去哪扫描 SKILL.md
    middleware=[CodeInterpreterMiddleware(skills_backend=backend)], # 同一个 backend
)

Agent 在 interpreter 里这样调用:

const { groupByStatus } = await import("@/skills/order-helpers");

const grouped = groupByStatus(orders);
grouped;

SKILL.md 里的 module 字段是让一个 skill 变为可导入的关键——没有这个字段,它就只是普通 skill(提供指令文本),不能被 interpreter import。


三者的关系总结

在这里插入图片描述

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐