Appearance
Interpreters 与动态子 Agent
Beta 能力:Interpreters 与 Dynamic subagents 的 API、生命周期和安全语义仍可能变化。基础 quickstart 不依赖它们;启用前应重新核对当前发行包、官方文档和源码。
普通 Agent 一次产生一个 tool call。Interpreter 为 Agent 提供一个内存中的 JavaScript 工作区, 使模型可以用循环、分支和 Promise.all 组合多个已允许工具或 subagent 调用,再把精炼结果返回 消息上下文。
Interpreter 解决什么问题
- 对大量结构化结果做排序、过滤、聚合和去重。
- 用程序控制多个允许工具的调用顺序。
- 并行分派多个独立 subagent,而不是让模型逐次发出
task。 - 把临时计算变量留在 runtime 中,减少 messages 膨胀。
前端类比
可以把它类比为一个受限 Web Worker:主 Agent 把计算逻辑交给独立 JavaScript runtime,worker 只能使用显式桥接的能力,并把结果回传。
Deep Agents 原生语义:当前 Python 集成使用 QuickJS runtime,并向模型增加 eval 工具。 它默认没有宿主 filesystem、network、shell 或可靠时钟;只有 middleware 显式桥接的工具和 task 才能越过 runtime 边界。
安装与最小配置
Python 0.6.12 可以通过 Deep Agents extra 安装与该发行线匹配的 QuickJS 集成:
bash
pip install "deepagents[quickjs]==0.6.12"配置 CodeInterpreterMiddleware:
python
import os
from deepagents import create_deep_agent
from langchain_quickjs import CodeInterpreterMiddleware
agent = create_deep_agent(
model=os.environ["DEEPAGENTS_MODEL"],
middleware=[
CodeInterpreterMiddleware(
memory_limit=64 * 1024 * 1024,
timeout=5.0,
max_ptc_calls=32,
capture_console=True,
ptc=None,
)
],
)
# PTC bridge 是异步 host function,使用 ainvoke
result = await agent.ainvoke(
{"messages": [{"role": "user", "content": "用 JavaScript 汇总一组数字"}]}
)ptc=None 表示程序化工具调用关闭。即使 Agent 本身拥有业务工具,也不会自动把所有工具暴露给 QuickJS。
Programmatic Tool Calling
只向 interpreter 开放确实需要的工具:
python
CodeInterpreterMiddleware(ptc=["search_docs"])也可以传入具体 tool 对象。名称 allowlist 便于配置,但 tool 对象更容易在代码审查中确认实际 实现。还应限制 max_ptc_calls、单次 timeout、内存和输出长度。
Interpreter 中的概念形状如下:
js
const queries = ['state backend', 'store backend', 'composite backend']
const results = []
for (const query of queries) {
results.push(await tools.search_docs({ query }))
}
results.map(({ title, url }) => ({ title, url }))tools.search_docs 只有在 PTC allowlist 中才存在。它不是浏览器全局网络 API。
动态分派 subagents
当主 Agent 已配置命名 subagents,interpreter 可以暴露 task(...) 桥接。模型可以用 JavaScript 循环、条件与并发批量构造委派:
js
const topics = ['版本策略', '安全边界', '部署选项']
const reports = await Promise.all(
topics.map((topic) =>
task({
subagent_type: 'researcher',
description: `研究 ${topic}`,
prompt: `只使用已提供的官方资料,输出 ${topic} 的要点和来源。`,
})
)
)
reports这仍然不是“动态创建任意 Agent”。可用的 subagent_type 来自主 Agent 已配置的 subagent specs; 应用应限制类型、工具、模型、并发数和总任务数。
最重要的审批限制
PTC bridge 和 interpreter 内的动态 task 不一定经过普通模型 tool-call 路径,因此不能假设 interrupt_on 会逐次暂停这些内部调用。安全策略必须同时落实在:
- PTC allowlist 和 subagent allowlist。
- 每个业务工具自身的认证与授权。
- sandbox 的 filesystem、network 与凭据边界。
- 调用次数、并发、timeout、内存和输出限制。
- interpreter 启用前的上层审批,而不是只依赖桥接内部逐次审批。
何时不要使用
- 只有一两个工具调用,普通 Agent loop 已足够。
- 任务必须在每次外部调用前强制人工批准。
- 团队尚未建立工具授权和 sandbox 边界。
- 需要浏览器 DOM、Node.js 模块、网络或宿主 shell,却误以为 QuickJS 默认具备这些能力。
Python 与 TypeScript 差异
两个 SDK 的官方文档都提供 interpreter 与 dynamic subagent 概念,但 Python 以 langchain-quickjs middleware 为主线,TypeScript 的 runtime、导入路径和配置命名应以对应 版本文档为准。不要把 Python CodeInterpreterMiddleware 导入直接翻译成 TS 类名。