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。
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
progress({ message: msg }) 的别名,不是第二条通道(见 docs/feature/experiments/cli.md
「Attempt 阶段」)。超时失败时最近若干行会并入结果的 error 信息,方便定位卡在哪一步。
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)是当前隔离环境的句柄。CommandOptions 是 runCommand / runShell 的可选项:
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 },其它值报错;local:任何值都报错)。
本就全程 root 的 provider视作 no-op;完全无法换身份的 provider 可不支持(抛错)—— 但省略与
显式值的语义保持一致,不因 provider 而变。
timeoutMs
signal
ctx 与 t
ctx 是 adapter 侧看到的运行上下文。t 是评估用例作者看到的测试上下文。两者使用同一批运行数据,但职责不同。