Run 预算与 Grace Call 协作
Run 预算字段与 Grace Call 机制共同决定 Run 何时结束、如何结束。
预算字段
| 字段 | 默认值 | 说明 |
|---|---|---|
MaxTurns | 90 | 最大 LLM 调用轮次 |
MaxTokens | 0(无限制) | 总 token 消耗上限 |
TimeoutSeconds | 86400(24h) | 超时秒数 |
IterationBudget | 与 MaxTurns 联动 | 迭代预算(含委派子 Run 共享) |
INV-TERM-01:引擎不因计数器自动终止
预算耗尽时引擎不会自动终止 Run。行为如下:
- 发送
EventBudgetWarning通知 UI - 进入 Grace Call 状态
- 允许 Agent 一轮最终回复
唯一能因预算终止 Run 的是外部 BudgetCheckFn(商业限制)。
Grace Call 流程
预算耗尽
↓
_budget_grace_call = true
↓
LLM 调用(最后一轮)
├── Agent 返回文字 → 正常结束
└── Agent 调用工具 → 执行工具 → Run 结束
↓
_budget_grace_call = false(不再有下一轮)
Grace Call 确保 Agent 不会在工具调用中途被"截断"。
BudgetCheckFn(外部终止)
type BudgetCheckFn func(status BudgetStatus) BudgetDecision
// 返回值
BudgetContinue // 继续
BudgetWarning // 警告但继续
BudgetExhausted // 终止 Run
- 由消费方注入(如 weisyn 平台的钱包余额检查)
- 每轮 LLM 调用前执行
- 返回
Exhausted→ Run 立即终止
CycleDetector 独立预算
CycleDetector 有自己的阈值体系,与 Run 预算完全独立:
| 类别 | 警告阈值 | 终止阈值 |
|---|---|---|
| 探索类工具 | 50 | 100 |
| 动作类工具 | 25 | 50 |
| 完全相同调用 | 4 | 7 |
CycleDetector 终止走两阶段协议(自愈 → HITL),不走 Grace Call。
消费方预算配置示例
req := wesgine.AppRunRequest{
Actor: "alice",
SessionID: "s1",
AgentID: "assistant",
Messages: messages,
Model: "gpt-4o",
MaxTurns: 50,
TimeoutSeconds: 3600, // 1 小时
BudgetCheckFn: walletChecker.Check,
}
相关文档
- Run 生命周期 →
run-lifecycle.md - CycleDetector →
cycle-detection.md - Run 终止哲学 →
run-termination.md