Run Grace Call(最后一次调用机会)
wesgine Run 在预算用尽时允许模型进行一次"Grace Call",让 Agent 有机会给出最终响应而不是突然中断。
设计动机
Run 的预算(MaxTurns、MaxTokens、IterationBudget)用尽时,如果 Agent 正在工具调用循环中,直接终止会导致:
- 用户看到没有回复的对话
- Agent 来不及总结已完成的工作
- 前端显示不明确的终止状态
Grace Call 机制
预算到达上限后,引擎设置 _budget_grace_call = true:
while (remaining > 0 || grace_call):
response = LLM.call(...)
if has_tool_calls:
execute_tools()
remaining -= 1
else:
return response // Agent 选择文字回复 = 正常退出
if remaining <= 0 && !grace_call_used:
grace_call = true // 再给一轮
grace_call_used = true
行为特征
| 场景 | 行为 |
|---|---|
| 预算用尽 + Agent 文字回复 | 正常退出,Grace Call 不触发 |
| 预算用尽 + Agent 继续 tool_call | Grace Call 启动,再执行一轮 |
| Grace Call 轮 Agent 文字回复 | 正常退出 |
| Grace Call 轮 Agent 仍 tool_call | 强制终止,发 EventDone |
与 INV-TERM-01 的关系
INV-TERM-01 声明引擎不因 counter 阈值主动终止 Run。Grace Call 体现了这一哲学:
- 预算上限 → 发
EventBudgetWarning(通知 UI) - 再给一轮机会
- 只有外部
BudgetCheckFn返回Exhausted才是真正的商业终止
与 CycleDetector 的区别
CycleDetector 有自己独立的预算体系(ExplorationTermThreshold、ActionTermThreshold),不受 Grace Call 影响。Grace Call 只作用于 IterationBudget / MaxTurns 层面。
相关文档
- Run 预算管理 →
run-budget-details.md - Run 终止哲学 →
run-termination.md - Run 生命周期 →
run-lifecycle.md