Agent 工程对照
← 返回周报

2026-W42

Codex 新增只能观察、不能拦截的模型请求钩子;Pi 的 durable 运行时给反复崩溃的任务设了上限,连续 5 次就停下等人处理

本周落点

本周综述

本周三家不约而同在补同一块:循环里发生了什么,外部能不能看见。Codex 新增 PreModelRequest 与 PostModelRequest 两个钩子,包住每一次模型请求(含重试),带上模型、会话、回合和子代理信息,结束时报告完成、失败或取消以及 token 用量。Pi 把遥测做进 chord 的 Context:跨进程传播、span 链接、计数器与直方图,durable 这边暂时只加了 telemetry 选项类型,提交说明写明还没有埋点;同时 durable 的 onReport 改成带类型的来源(会话、任务、扩展、宿主回调等),出错时能说清是谁的代码出的错。openJiuwen 本周也有一条补全 GenAI 语义约定属性的 otel 提交,只读到标题,细节需下周确认。

展开完整综述

Codex 这两个钩子最值得注意的是它刻意不做的事:输出只记日志,不能否决请求,也不能改模型上下文。矩阵里 Codex 那一格写的是 11 个由配置声明、进程外执行的钩子事件;新加的两个在实现上就排除了控制流,观察和控制成了两类不同的事件。Pi 那一格的立场正好相反,BeforeProviderRequestEvent 的处理器可以返回结果改写请求。两种做法对应两种用户:Codex 的钩子面向最终用户配置,提交没有解释为何只给观察权,一种合理的解读是不想让任意外部命令改写模型请求;Pi 的钩子面向扩展开发者,改写本来就是用途之一。

同一周 Codex 还收紧了插件钩子的信任边界:审批从只看钩子声明改为绑定插件包内容的哈希,脚本一变就要重新审批,执行前在钩子超时内校验。钩子既然是进程外命令,审批的对象就应该是要执行的代码本身,而不是一段声明。

Pi 的 durable 包继续往「恢复失败时怎么停」推进。上周加上了按日志重放的 code mode,这周补了崩溃循环保护:每次崩溃中断的任务计数加一,任务自己提交新状态就清零,到 restartLimit(默认 5)就挂起为 blocked,等宿主调用 retryTask;另外用持久化的 sleeping 状态取代 runtime.sleep,截止时间扛得过重启,休眠期间不占用调用。能恢复只是第一步,恢复本身也会反复失败,需要一个停下来的条件。

按需暴露工具是另一条共同线索。Pi durable 新增 deferred 工具,模型在加载前看不到它们,配套与 coding agent 相同的 BM25 tool_search;加载只往工具声明末尾追加,规格里写明这样缓存前缀不会失效。openJiuwen 反方向打了个补丁:开启渐进式工具暴露时,团队协作工具强制直出,不能藏在 tool_search 后面,因为那是成员的主接口。Codex 加了默认关闭的 wake_on_agent_messages,让子代理在父代理给出最终答案后才完成时,消息也能唤醒空闲的根会话。DeepSeek Harness 本周 471 个提交,大半落在 computer use、Web 与桌面端,发到 0.2.1-rc.2;结构上的改动在实验性的 Agent Team:成员身份从初始任务里的一条提醒,改为每一步都由 runtime context 按当前角色重新生成,压缩和 fork 都不会再把它弄丢或弄错。

工程解读

Codex:模型请求前后的钩子,只能看,不能拦

改了什么
新增 PreModelRequest 和 PostModelRequest 两个钩子事件,每一次模型请求尝试都会触发,重试也算。输入包含会话 ID、回合 ID、工作目录、模型名,以及可选的子代理 ID 与类型;PostModelRequest 额外给出状态(完成、失败、取消)、错误信息和 token 用量。实现文件开头注明这是只观察的生命周期钩子,输出只记日志,不会被解释为控制流:钩子返回的控制指令会被忽略,不能否决请求,也不能改变模型上下文。同步的请求后钩子会在工具分发之前等它跑完,异步钩子则不阻塞流式工具分发。新事件同步进了配置、协议 schema、生成的客户端和 TUI 的钩子浏览器。
为什么改编辑推断
提交信息没有说明原因,正文只列了改动和测试。从实现看,它把每次请求的模型、结果和用量交给外部命令,而又明确禁止干预,推断目的是给计费、审计和故障排查一个稳定的观测点,同时不把模型请求这条关键路径交给用户配置的任意命令控制。
对开发者的影响
需要按回合统计 token、记录重试与失败的 Codex 用户,可以用这两个钩子接自己的日志或计费系统,不必再从 rollout 文件里反推;但不要指望用它改写请求或拦截调用,返回的控制指令会被忽略。同步的 PostModelRequest 钩子会推迟工具分发,耗时的上报应配成异步。自建 Harness 可以借鉴的是把观察型钩子和控制型钩子分成不同事件,观察型的输出在类型上就不进控制流。

Pi:durable 运行时给反复崩溃的任务设上限

改了什么
Harness 打开时,把仍处于 running 的任务视为被中断,写回 pending 并把 restarts 加一;任务自己提交的任何状态(新检查点、等待、休眠、结果)都算进展,计数清零,memo 和文档写入不算。计数达到 settings.restartLimit(默认 5,设为 Infinity 则永不挂起)时,任务挂起为 blocked,原因 restart_limit,在 inspect 和任务图里可见,wake 不再把它算作活跃,并通过 onReport 报告一次;Harness.retryTask 清零后重跑。随后的修正把优雅关闭排除在外:close 会把停下的任务写回 pending,只有崩溃才计数。同一组提交还加了 afterFailedRun 设置,决定一次以模型错误失败的运行后面排队的输入是保留、继续还是撤回。
为什么改编辑推断
提交信息没有说明原因,只列了改动。随提交入库的规格文档写明了动机:如果一项工作在下一个检查点之前就确定性地耗尽内存或 CPU 把进程弄崩,它会被一次次恢复、一次次崩溃,永远跑下去;有了上限,它在几次尝试后就会停下。
对开发者的影响
在 Durable Object 之类会自动重启的宿主上跑 Pi durable 的人,要处理 blocked 状态:在 onReport 里识别 restart_limit,决定何时调用 retryTask,否则挂起的任务不会自己恢复;长时间无检查点的任务更容易撞上上限,应拆出中间检查点。自建 Harness 的恢复机制可以借鉴「按无进展的连续重启计数、有进展即清零」这个口径,它区分了慢任务和死循环。

openJiuwen:渐进式工具暴露下,团队协作工具保持直出

改了什么
TeamToolRail 在把每张团队工具卡注册进 AbilityManager 之前,先把它的暴露方式声明为 DIRECT。原因在于开启渐进式工具暴露后,AbilityManager 会把既没声明暴露方式、也不在默认直出名单里的工具全部延后,要靠 tool_search 才能找到。这次改动只改未声明的卡,已显式声明暴露方式的卡保持原样。涉及的工具包括发消息、建任务、派生成员、查看任务等协作接口。
为什么改原文说明
提交正文写明了目的:让启用 progressive_tool 的成员仍能看到完整的协作接口,而不是通过 tool_search 去发现。代码注释进一步说明,这些工具是成员的主接口,藏到一次 tool_search 往返之后会破坏团队协议。
对开发者的影响
在 openJiuwen 里给团队成员开启渐进式工具暴露的人,不再需要手动把协作工具加进直出名单;如果自定义的团队工具确实想延后,要显式声明 exposure,否则会被强制直出。自建 Harness 做工具延后加载时可以借鉴这一点:按协议必须调用的工具应当始终可见,延后只适合按任务才需要的能力。
DeepSeek Harness子代理隔离 →

DeepSeek Harness:Team 成员身份改由必需的 runtime context 每步生成

改了什么
实验性 tool-agent-team 不再在 spawn_teammate 的初始任务前拼一段 system-reminder 声明「你是某某成员」,初始任务只保留传入的正文。改为在 Agent 作用域注册一条名为 team:identity 的 runtime context,设为 required,排序在子代理委派之后、进程相关信息之前。它每次从当前 Team membership 读出角色与名字,渲染成「你是 Lead」或「你是成员某某、Lead 叫 lead、怎么给 Lead 和其他成员发消息」。关闭可选 context 也去不掉它。角色变化时,Agent 循环在继承的历史之后追加一份完整的 runtime context 快照;内容没变就不追加。没有新增事件类型或日志迁移,旧的身份提醒留在历史里。
为什么改编辑推断
提交信息没有说明原因,也没有关联 PR。随提交入库的设计记录写明了问题:身份写在初始任务里,就只能靠普通历史保留,压缩可能把它删掉;从成员会话 fork 出来的独立 Lead 还会继承旧角色。记录也解释了为什么不放进 system prompt:各成员的 system 文本会因此不同,不支持在历史中更新 system 的路由可能改写继承下来的请求前缀。另写一套提醒保留与重新注入,又会和循环已有的 runtime context 恢复职责重复。
对开发者的影响
用 DeepSeek Agent Team 的开发者:成员身份不再出现在初始任务文本里,依赖解析那段 system-reminder 的脚本或测试要改为读 runtime context;每个成员多承担一份身份 token。自建多 Agent Harness 可以借鉴这个划分:共享的协作策略放 system prompt,保住各成员一致的缓存前缀;随成员而变、又必须扛过压缩与 fork 的状态,放进每步重算的上下文,而不是写进一次性的历史消息。
影响到的格子(4 条说明)
采集到的提交与发布
openJiuwen138 提交 · 0 release · 458 ★

值得注意的提交

  • a3677e7fix(harness): rebind cached context processors through the public update_model_context chain
  • f28ea9efix(swarm):修复解散组织后临时专家团不解散的问题
  • c79d73ffix(agent-teams): restrict spawn_passive_human to group chat
  • ce2aeddfix(sys_operation): decode streamed subprocess output with an incremental decoder
  • fbeaeee[mirror] openJiuwen-ai/agent-core#1856: Fix in-memory session release prefix matching
  • ab825d1feat(otel): complete GenAI semantic convention attributes
Codex214 提交 · 10 release · 130,214 ★

值得注意的提交

  • 7b44ac1Gate app-server WebSocket compression behind a feature flag (#54949)
  • 527c5deClose arg0 lock files before removing temporary directories (#54739)
  • 6b99197Remove obsolete protected-path monitoring from the Linux sandbox (#54445)
  • 348ef77Record per-tool incremental update and description size metrics (#54133)
  • ca2b076Add safe diagnostics to workspace routing configuration errors (#53805)
  • 12cca49Reject duplicate Host headers in the network proxy (#53506)
DeepSeek Harness471 提交 · 5 release · 256,197 ★

值得注意的提交

  • 32efe36revert: restore the bundled DeepSeek Flash display name
  • da6c167fix(account): 平滑过渡不同高度的通知卡片
  • 0ae278bfix(web): share terminal discovery per session
  • 14abe95feat(plugin-market-generator): record the source repository and parse options with commander
  • a6e9071fix(ui-chat): continue batch members from their current size
  • 29249a4fix(typert): distribute indexed constraints across unions
Pi131 提交 · 2 release · 116,784 ★

当周 release

值得注意的提交

  • e17e2e1fix(durable): release the second slow call when the first finished, not after 200 polls
  • 14ff455fix(env): make the read/bash differential test deterministic and meaningful
  • 4954d76feat: check the model catalog against the latest release before publishing (#11007)
  • b06c1f2feat(ai): use Chat Completions for the kimi-coding provider
  • 3daa202fix(coding-agent): keep codemode cancellation prompt and bounded
  • 7d75a0efix(chord): nodeLoader registers every facet root before importing any

每家最多列 6 条代表性提交,已去掉合并、版本号与纯文档提交。

观察名单

观察名单

这几个项目出现在周报里,但还不在对照矩阵中。

Claude Agent SDKAnthropic
13 提交 · 8,314 ★

Anthropic 把 Claude Code 的 Harness 能力下放为可编程 SDK,是「Harness 作为库」这条路线的参照系。

最近一次 release(不限当周):v0.2.170(2026-10-21)

同族的 anthropics/claude-agent-sdk-typescript 只有 examples/scripts/CHANGELOG,属发布仓,不单独采集。