fix(agent): 审批暂停 - 暂停后不再接受新的模型步骤 (#675)

运行时在工具进入审批时调用 session.abort(),但中止是异步生效的,SDK 可能抢在它生效前再开一轮并请求 /model。服务端照常入队:多计一次费,返回的新工具调用顶掉待审批的调用,保存时以「approval does not match current call」的检查点校验失败,整轮中断,用户还没来得及审批。

三处防护:运行时在暂停后不再发模型请求;服务端在等审批期间拒绝模型步骤(不入队、不改状态);已因审批暂停的会话收尾报错不再判运行失败,由审批结论接管。
This commit is contained in:
jiabx
2026-10-05 13:56:07 +08:00
committed by GitHub
parent 222820f331
commit 00bad0589f
4 changed files with 128 additions and 0 deletions

View File

@@ -138,6 +138,14 @@ async function run() {
};
void (async () => {
stream.push({ type: "start", partial });
// 审批暂停时 session.abort() 是异步生效的,SDK 可能在它生效前就开下一轮。
// 这一轮不能发给服务端:运行正在等审批,再跑一步会多计一次费,
// 新的工具调用还会和待审批的调用对不上,让整轮以检查点校验失败收场。
if (pausedForApproval) {
stream.push({ type: "error", reason: "aborted", error: { ...partial, stopReason: "aborted", errorMessage: "paused for approval" } });
stream.end();
return;
}
try {
const purpose = activeCompaction?.phase === "summarizing" ? "compaction" : "conversation";
// Deliver lifecycle events/snapshots before scheduling the next request.