Agent Sandbox Registry

agent-sandbox

2026-10-13 差分分组(相对 Python abx 0.2.0)

无英文版

.agents/evidence/verify/2026-10-13-differential-zh.md

2026-10-13 差分分组(相对 Python abx 0.2.0)

Oracle:/tmp/venv-orig/bin/abx(Python abx 0.2.0)。对照日志在 /tmp/diff-fast/,本文件不改那五份日志。

套件 日志里的 DIFF 组1 保留 组2 该补
sandbox_cmds 73 73 0
sandbox_subcmds 28 28 0
config_cmds 116 3 113
template_cmds 30(另有 2 条 FIXED,已一致,不是 DIFF) 30 0
mcp_toolerr 已展开块 175 175(见下:12 块的 suggestion 文案按组2已改,错误码仍属组1) 文案,不另计条目
合计已展开 422 309 113

mcp_toolerr 收尾写的是 486 differences / 5256 comparisons。日志只展开 175 块,未展开 311 条。带 first 6 shown 的 11 个模式合计 388 条、日志里各 7 块(6 条调用 + 1 条 stub),隐藏 311 条;其余 25 个模式没有截断说明,块数 98,与 486 - 388 一致。隐藏条与同一模式里已展开的块是同一类差异,下面按模式归组,没有逐条虚构未打印的调用名。

组2修的是行为,不是把 Node 改回 0.2.0 的旧表面。--model 不删。E2B_API_KEY / api_url / AccessKey 不恢复。无效 API key 保持 E1001,不改成 E2000。

E2000 与 E1001

文档和当前 Python 错误码表都把无效 API key 定为 E1001,创建失败的基类才是 E2000:

旧 abx 0.2.0 把平台 HTTP 401 印成 [E2000] Invalid API key(退出码 1),或直接抛 httpx 原文。这是 KI-006 要修的误分类。Node 报 E1001、退出码 3,与文档一致。条件「文档和 Python 错误码表规定无效 key 是 E2000」不成立,不把 Node 改回 E2000。

这些条目因此留在组1。日志里的 suggestion 仍是旧句 Check your E2B_API_KEY environment variable or pass api_key parameter.,那一句按组2改掉,错误码不动。

1. 合理,保留

Node 多出来的能力,或已经批准、不应为了字节级对齐 0.2.0 而撤回的修正。

sandbox_cmds(73)

--model 与未知选项提示(5):

平台 401 → E1001(8,KI-006;suggestion 文案见组2):

文件传输按 envd 错误码(14,KI-005):旧版笼统 E5000 / E1000 / E2002,Node 为 E4000 / E4001 / E4002。

平台 404 → E2009(7,KI-005):

自然语言创建(35):差异是 --model / 被拒绝的模型 qwen3-coder-plus 提示,和/或 Node 拒绝「commands.py 在 import 时调用 serve()/start()」(E2007)。这是生成结果校验,不是漏掉的旧行为。其中只差模型提示的 11 条:

其余 24 条同时有 serve()/start() 拒绝(旧版写成了模板或走到了别的错误,Node 工作区为空):

run 只把请求体 envVars 改成 envs(4,KI-001):

sandbox_subcmds(28)

空目录列文件(3,KI-007):缺失目录不再装成空列表。files list empty、files list empty json、files list empty quiet:旧版退出码 0、stdout「Directory is empty」,Node 退出码 4、E4001,并多一次 Stat。

这是批准的修正。没有写入 SDK-defect allow-list。 允许名单的匹配要求「退出码 0→4 + 空目录文案 + 多出来的 Stat」。10 月 12 日这份日志是这个形状;当天之后再跑 sandbox_subcmds.mjs --only "files list empty" 时,Node 不再读取 E2B_API_URL,请求没进 stub,先以 E1001 失败。若把这 3 个 id 写进 sdk_defect_ids.json,完整一轮会判 STALE。E2B_API_URL 不恢复。sdk_defect_ids.json 不新增。

文件 / 进程错误码(KI-002 / KI-004 / KI-005 / KI-006):

config_cmds 里留下的 3 条

template_cmds(30)

已一致、只需去掉 known 标记(不是 DIFF):search bad yaml、install invalid yaml。

mcp_toolerr

已展开 175 块,按内容:

内容 已展开块数 归组
401 工具结果:旧版 E2000 或 httpx 401 原文,Node E1001 + 旧 suggestion 12 错误码组1;suggestion 组2,已改
argument of type 'int'/'float' is not iterable(sandbox_id 为 7 或 5.0) 59 组1。":" in sandbox_id 的类型行为保持,不把数字再拼进 URL
仅 initialize 版本 0.2.0 对 0.3.0 25 组1
字符串 id 的 404 → E2009 15 组1,KI-005
envd 文件工具 → E4000 / E4001 / E3006,不再是 httpx 原文 30 组1,KI-005 / KI-004
stub 请求序号或路径不一致(数字 id 提前失败,或 POST /sandboxes 对 GET /sandboxes/7) 34 组1,是上面两类的请求日志

12 条 401 工具结果:

未展开的 311 条按 FAIL 行跟同一模式:

2. 该补(已改代码)

损坏的 config.toml 刷屏(100)

友好警告之外,同一份坏文件被按键重读,多次打印 WARNING: Failed to load ... config.toml(分层加载器每次解析都打,legacy 加载器再打,桥接前还有一条带时间戳的 [WARNING])。

已改:

这 100 条:

复核(对照 oracle,只跑相关 --only,不改日志):

dotenv 警告刷屏、且缺少 WARNING: 前缀(13)

Node 按键重读 .env,同一行解析失败打很多次;桥接安装前的 lastResort 没有 WARNING: 前缀。

已改 cli/src/utils/_dotenv.ts:dotenv.main 自带 %(levelname)s: %(message)s,且 propagate = false;同一路径 + 行号只警告一次。

这 13 条:

复核后不再刷屏,也有了 WARNING: 前缀。和旧 CLI 仍不是字节级相同,这是预期:

MCP / CLI 401 的 suggestion 仍写旧键名

InvalidAPIKeyError 的默认 suggestion 从 Check your E2B_API_KEY environment variable or pass api_key parameter. 改为:

Check your ABX_SANDBOX_API_KEY environment variable or pass sandbox_api_key.

与现有 authentication 指南同一句(没有多余的 “parameter”)。MCP _formatToolError 和 CLI 都抄这个类字段,所以 401 的 CLI 与 MCP 一起改。错误码仍是 E1001。

落点:

日志里带旧句、但错误码决策属于组1的条目:上面的 sandbox 8 条 401、process list platform 401、template list 401 / info 401、以及 MCP 已展开的 12 条 401 工具结果(未展开的 401 模式里,字符串 id 的调用同样带这句)。

3. 明确不改回去的东西

改动与测试

回归(附近已有测试文件里加了两条):

本轮执行:

npx vitest run tests/test_cli/test_config_toml_transport.test.ts tests/test_models/test_errors.test.ts

2 个文件、45 条测试通过。

此前对照 oracle 的局部 harness(未重跑整份 mcp,486 条太大):

更宽的 vitest(conformance / 错误类导出)里,原先就有的失败没有当成这次的回归去修:SandboxNotFoundError 不在旧 oracle 类清单里;若干 resolution/migration 用例仍期望已删除的 E2B_API_KEY 别名。那些别名按「一个键一个名字」保持删除。