agent.send(input, ctx)。
defineAgent
用于 direct agent 接入:
defineAgent 产出的 Agent.kind 恒为 "direct"(内部判别字段,不用你声明)。t 上没有需要声明才解锁的能力位——t.sandbox 这类文件系统断言只在 defineSandboxAgent 构造的 Agent(kind: "sandbox")上才有。其余由 send 实际返回的事件和 ctx.session 的使用决定,详见能力位参考。字段全集见下方「Agent 与 Adapter Context 字段」。
direct agent 示例
input(TurnInput)
string
当前
t.send(...) 传入的文本。readonly InputFile[] | undefined
本轮附带的文件(图片等)。不支持多模态的 adapter 可以忽略它。
readonly InputResponse[] | undefined
仅回答轮(
t.respond / t.respondAll)出现:逐请求的结构化回答,按 requestId 对位。defineSandboxAgent
用于 coding agent CLI。产出的 Agent.kind 恒为 "sandbox"——t.sandbox、t.sandbox.fileChanged() 等文件系统断言只在这类 agent 上解锁。字段全集同样见下方「Agent 与 Adapter Context 字段」的 SandboxAgentDef。ctx.sandbox(Sandbox 接口)的完整方法见再下方「Sandbox 接口」。
注册
Agent 与 Adapter Context 字段
defineAgent(DirectAgentDef)、defineSandboxAgent(SandboxAgentDef)的构造参数,
以及两者的 send(input, ctx) 都会拿到的 ctx(AgentContext):
DirectAgentDef
name
Agent.name——不是注册表查找 key,只用于展示、结果归属与去重指纹。
evidenceCoverage
completeEvidenceCoverage。
setup
tracing
spanMapper
send
classifySendFailure
Agent.classifySendFailure。
teardown
setup 时点才执行(setup 抛错不豁免),
在 finally 里跑一次。
SandboxAgentDef
name
Agent.name——不是注册表查找 key,只用于展示、结果归属与去重指纹。
evidenceCoverage
completeEvidenceCoverage。
sandbox
ensure
installers
agent.ensure 点名缺失的精确 identity。工厂会把省略规范化成空数组。
setup
agent.ensure。运行器在 Sandbox
备好(layer prepare/ensure/baseline 之后)、第一次 send 前调用一次,不返回值。
tracing
spanMapper
send
classifySendFailure
Agent.classifySendFailure。
teardown
setup 时点才执行(setup 抛错不豁免),
在 finally 里跑一次。
AgentContext
signal
fetch)以提前
优雅退出,但这不是唯一的硬边界——即便 adapter 完全忽略它,运行器也会用
Effect.timeoutTo 兜底强制收尾(停 Sandbox 容器)。
model
model 字段。sandbox 型 agent 通常在 setup 里用它写配置,direct 型通常在 send 里用它选模型。
reasoningEffort
flags
flags 字段原样透传,内容和结构完全由 experiment 作者自定义
(如 { webResearch: true }、{ systemPrompt: "..." })。adapter 按自己的约定
读取其中的字段;框架本身不解释、不校验它的内容。命名特意避开 CLI 解析出的
flag(跑法层面的 —timeout/—budget 等),两者是不相关的概念。
experimentId
runWho / AgentRun.experimentId 同源);不经
experiment 跑(如脱离 CLI、直接构造 AgentRun 的场景)时为 undefined。典型用途:
SandboxLayer command 按实验隔离跨 attempt 的基础设施内容,或 adapter 按实验切换鉴权 / 路由。
与 flags(实验条件的
具体取值)是两个维度——这里只是「跑的是哪个实验」的稳定标识,不携带条件内容。
evalId
evalGroup
attempt
session
telemetry
tracing 块 / config 的 telemetry 存在):
本次运行的 OTLP traces 接收信息(endpoint + env-based 导出 env)。
怎么把它交给 CLI 由 agent 的 tracing 块声明:env-based 的把 ctx.telemetry.env
spread 进 send;file-based 的在 tracing.configure 里写配置。远程 HTTP 接入的 send
只需要把 headers spread 进请求头(每轮一个新 traceparent);端点是启动期配置
(defineConfig({ telemetry: { port } }))固定的,不从这里传。
progress
agent/ci 不逐条打印,也不进最终结果;不要每个 token/delta 都调用。
runner 按当前回调所处的生命周期阶段(agent.setup / agent.run / agent.teardown)归因,
调用方不能冒充其它阶段(见 docs/feature/experiments/library.md)。
diagnostic
dedupeKey 去重。
即使 level 为 “error” 也不改变 Turn.status / verdict——无法继续时抛异常。
log
ctx.session(AgentSession)是一条会话线的状态槽:同一条会话线的每次 send 拿到同一个 ctx.session,新会话线(评估用例第一轮 / t.newSession() 之后)拿到一个全新的。存取器:
id?: string/capture(id): void—— 会话续接·服务端记历史时用:id是本线记过的会话 id(新线是undefined),capture记回传的 id(只在还没记过时落地)。createSessionSlot<T>(name)—— 在 Adapter 模块作用域创建一个 typed slot。slot 按 symbol 身份隔离。get(slot)/set(slot, value)—— 存取客户端历史或 Adapter 私有状态。take(slot)—— 读取并删除 HITL 停轮现场,一次消费。
Sandbox 接口
Sandbox 型 agent 的ctx.sandbox(Sandbox)是当前隔离环境的句柄。Sandbox 继承 SandboxOperations 与 SandboxTransferOperations,下方按声明接口列出全部成员。CommandOptions 是 runCommand / runShell 的可选项:
SandboxOperations
workdir
cwd/targetDir 时也落到这里。
runCommand
args 作为独立 argv 传递、不经 shell 解释(无 &&、管道、通配符展开)。
只想跑一个可执行文件、参数来自外部输入、担心注入时优先用它。
runShell
&&、管道、$()、重定向等。
需要拼多条命令或做条件判断时用它。
runCommandOrThrow
runCommand 一样执行单个命令,但非零退出时抛出 SandboxCommandExitError。错误消息附带
有界、已清理和脱敏的 stderr 尾部;stderr 为空时回退 stdout。完整输出保留在异常的
result 字段中。成功结果的 exitCode 在类型上固定为 0。
runShellOrThrow
runShell 一样执行 shell 脚本,但非零退出时抛出 SandboxCommandExitError。错误摘要、
完整输出和成功结果的语义与 runCommandOrThrow 相同。
readText
writeText
readBytes
writeBytes
pathExists
SandboxTransferOperations
upload
uploadFile
uploadDirectory
downloadFile
downloadDirectory
Sandbox
stop
sandboxId
otlpHost
string:Sandbox 内可通过该 hostname 访问宿主 receiver。null:provider 不承诺宿主回连;runner 尝试在 Sandbox 内启动 attempt-scope receiver。 这不保证 tracing 成功;镜像缺少 receiver 所需运行时时只记录 supplemental diagnostic。defineConfig({ telemetry: { host } })可在作者已经提供受控 tunnel 时显式覆盖。
appendLog
docker logs /
Docker UI 的 Logs 标签页能实时看到 agent 逐轮活动。docker provider 实现,其它可省略。
CommandOptions
sensitiveValues
env
PATH 是 Sandbox
受管变量,各 provider 保留自己算出的 PATH,不保证能被这里覆盖;需要扩展 PATH 用
Sandbox factory 的 pathPrepend(见 docs/feature/sandbox/library.md「PATH:受管变量与
pathPrepend」)。
cwd
Sandbox.workdir。相对路径按 workdir 解析,绝对路径原样使用。
stream
docker logs / Docker UI 的 Logs
标签页能实时看到它)。给 agent 命令(codex exec / bub run / claude)开它,就能在容器
日志里看到 agent 的【原始输出】。provider 各自实现(docker:tee 到 PID1 tail 的文件;
不支持的 provider 忽略)—— 日志怎么浮现是 provider 的事,adapter 只声明意图。
onStdout
CommandResult 里。provider 不支持真流时,至少会在命令结束后按完整
stdout 调用一次,不能静默丢掉。
onStderr
onStdout 的 stderr 对应物;完整 stderr 仍保留在 CommandResult。
user
USER、
Compose service user:、E2B template 默认用户,见
docs/feature/sandbox/library.md「执行身份」)。
语义跨 provider 一致,各 provider 映射到自己的原生机制(docker:exec --user;E2B:
{ user };Vercel:只认 "root",映射 { sudo: true },其它值报错)。
本就全程 root 的 provider 视作 no-op;完全无法换身份的 provider 可不支持(抛错)——但省略与
显式值的语义保持一致,不因 provider 而变。
timeoutMs
signal
ctx 与 t
ctx 是 adapter 侧看到的运行上下文。t 是评估用例作者看到的测试上下文。两者使用同一批运行数据,但职责不同。