Skip to content

fix(agent): 带副作用工具成功后才发同步 send,中途发言按下标记账,老名原生调用按 send 处理 - #1235

Merged
SuInk merged 1 commit into
mainfrom
fix/send-interim-risks
Oct 27, 2026
Merged

SuInk merged 1 commit into
mainfrom
fix/send-interim-risks

Conversation

@SuInk

@SuInk SuInk commented Oct 27, 2026

Copy link
Copy Markdown
Owner

修复「say 和 agent_finalize 合并成 send,空正文即不说话」(#1223)里记下的三个已知风险。

Why

#1223 把 say 合进 send 后,和工具同一步发来的 send 会作为中途发言立刻发出。这带来三个问题:

  1. send 先于带副作用的工具发出。 模型同一步发「定好了」和建提醒的调用时,这句先发进群;提醒随后失败,群里留下的就是一句假话。中途发言不过收尾审核,没有补救的机会。
  2. 供应商回空调用 ID 时记账串号。 interimDone 按 call.ID 记账,ID 为空时 send 和工具撞在同一个键上:工具的结果会被回成「已经发出去了」,并行检索的结果也可能互相覆盖。
  3. 老名原生调用白费一轮修复。 模型照老历史用原生调用发 agent_finalize 或 say 时,这两个名字已不在工具列表里,会被当成不存在的工具,白花一轮修复。

改了什么

  • send 发出的时机:同一步其余调用全是检索类(web_search、browser_render、tool_search)时,send 照旧立刻发出,「我去查一下」要赶在慢检索之前。带别的工具时先执行工具,成功了才发。工具失败或被拦时这句不发,模型收到的调用结果是「这句没有发出:同一步的 X 失败了」,并标为错误。没配 Interim 时行为不变。
  • 按下标记账:中途发言和并行检索的结果都改按调用在本步里的下标记账,不再用 call.ID。
  • 老名改名:模型返回后(规划步和收尾步都算),先把原生 agent_finalize、say 改名成 send,前提是注册表里没有同名工具。老收尾的 silent=true 当成空 text,即不说话;say 的参数本来就是 text。
  • 同步更新了 docs/interim-messages.md。

影响

  • 用户:「定好了」这类话不会再在操作失败时先发出去。
  • 带副作用工具的同步 send 会晚到工具执行完才发。检索类不受影响。
  • 开发者:sendInterim 改为接收下标列表、返回 map[int]string;appendToolRepair 的参数类型随之改变。

验证

  • 新增 model/agent/finalize_interim_test.go,共四个用例:
    • 副作用工具失败时不发、成功时排在工具之后发;
    • 检索时先发;
    • 空 ID 下结果不串;
    • 老名原生调用不花修复轮,老 silent=true 不说话。
  • 退回修复前的 runner.go 时,其中三个用例失败(检索先发的用例本来就是现有行为)。
  • scripts/test-serial.sh ./model/agent ./model/assistant:-race 和 TZ=UTC 两遍都通过。期间 TestReplyTurnSendsInterimThenFinal 暴露 tool_search 也应算检索,已补上。
  • gofmt、git diff --check、check-public-repo.sh 都通过。

修 #1223 记下的三个风险:同一步 send 先于带副作用的工具发出,工具失败时「定好了」已经发进群;
供应商回空调用 ID 时中途发言的结果串到同一步的工具上;照老历史发来的原生 agent_finalize、say
调用被当成不存在的工具,白花一轮修复。
@SuInk
SuInk force-pushed the fix/send-interim-risks branch from 4fc8ce1 to 6256966 Compare October 27, 2026 16:26
@SuInk
SuInk merged commit 23d5771 into main Oct 27, 2026
14 checks passed
@SuInk
SuInk deleted the fix/send-interim-risks branch October 27, 2026 16:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant