fix(agent): 审批暂停 - 暂停后不再接受新的模型步骤 (#675)
运行时在工具进入审批时调用 session.abort(),但中止是异步生效的,SDK 可能抢在它生效前再开一轮并请求 /model。服务端照常入队:多计一次费,返回的新工具调用顶掉待审批的调用,保存时以「approval does not match current call」的检查点校验失败,整轮中断,用户还没来得及审批。 三处防护:运行时在暂停后不再发模型请求;服务端在等审批期间拒绝模型步骤(不入队、不改状态);已因审批暂停的会话收尾报错不再判运行失败,由审批结论接管。
This commit is contained in:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user