Run 预算详解
wesgine Run 预算管理的字段、预警机制与外部预算检查。
预算字段
AppRunRequest 中可设定的预算字段:
| 字段 | 说明 | 默认 |
|---|---|---|
MaxTurns | 最大轮次 | 无限制 |
MaxTokens | 最大 Token 数 | 无限制 |
TimeoutSeconds | 超时秒数 | 86400(24h) |
IterationBudget | 迭代预算 | 跟随 MaxTurns |
预算不终止 Run
INV-TERM-01:引擎不因 counter 阈值主动终止 Run。
预算字段仅作为预警参考:
| 达到阈值时 | 行为 |
|---|---|
| 轮次到上限 | EventBudgetWarning → UI 提示 |
| Token 到上限 | EventBudgetWarning → UI 提示 |
| 时间到上限 | EventBudgetWarning → UI 提示 |
Run 继续执行,直到自然结束或被主动中断。
BudgetCheckFn(外部预算检查)
唯一能因"预算"终止 Run 的机制:
CellSpec{
BudgetCheckFn: func(ctx context.Context, usage BudgetUsage) BudgetDecision {
if usage.TotalTokens > customerLimit {
return BudgetExhausted
}
return BudgetOK
},
}
返回 BudgetExhausted → Run 终止。
这是商业限制,不是引擎策略——由消费方(平台层)决定。
BudgetStatus 事件
Run 过程中持续推送 BudgetStatus:
{
"turns": 5,
"total_turns": 10,
"input_tokens": 12000,
"output_tokens": 3000,
"elapsed_seconds": 45,
"budget_check": "ok"
}
前端据此渲染进度条和预算指示器。
Grace Call(最后一轮宽限)
即使预算已达阈值,Run 仍有一次宽限调用:
- 让 Agent 有机会完成最后的回复
- 避免在工具调用中途突然中断
- 不适用于
BudgetExhausted(硬终止)
CycleDetector 预算
CycleDetector 有自己的阈值,与 Run 预算独立:
| 阈值 | 触发 |
|---|---|
ExplorationTermThreshold | 探索类工具循环 |
ActionTermThreshold | 操作类工具循环 |
IdenticalCallTermThreshold | 完全相同调用循环 |
CycleDetector 会真正终止 Run(先自愈,再 HITL)。
消费方预算实践
| 产品 | 预算策略 |
|---|---|
| wescode | 高预算(编程任务长) |
| wesclaw | 中等预算 |
| wescraft | 中等预算 |
| teleclaw | BudgetCheckFn(企业配额) |
相关文档
- Run 终止哲学 →
run-termination.md - CycleDetector →
cycle-detection.md - ErrorStreak →
error-streak.md - Run 生命周期 →
run-lifecycle.md