运行预算与循环限制
区分整次运行、单轮工具预算、Goal 窗口和子 agent 深度。
不同限制计量的对象不同。配置为 0 时也不具有统一含义,应逐项核对。
整次运行
| 设置 | 默认与行为 |
|---|---|
| model.sessionTokenLimit | -1;-1 和 0 都不限。记录的 prompt token 超限后丢弃下一次发送,不中止整个会话 |
| model.maxSessionTurns | -1,不限会话轮数 |
| model.maxWallTimeSeconds | -1,不限;无头/无人值守运行超时退出 55 |
| model.maxToolCalls | -1,不限;0 禁止全部工具调用,只计顶层调度的成功和失败,structured_output(含验证失败)在 --json-schema 下豁免 |
| model.maxSubagentDepth | 5;从第一级 subagent 计数,范围钳制 1–100 |
--max-wall-time 可覆盖时长,接受 90、30s、5m、1h、1.5h 等正值,最短 1 秒;500ms、0.5 会拒绝。--max-tool-calls 可覆盖累计工具预算,超过预算退出 55,最大可设 1,000,000。
--max-subagent-depth 可覆盖嵌套深度;1 仍允许一级 subagent,但禁止继续嵌套。teammate、fork 和 workflow 启动的 agent 不按该设置开放嵌套。
一次 agent 调度只算一次,其内部工具不计入整次 maxToolCalls。stream-json 输入每条用户消息重置预算;qwen serve/ACP 当前不读取这两项时长/工具运行预算。详见无人值守范围。
单轮工具上限
model.maxToolCallsPerTurn 显式设置正数时为硬上限。默认未显式配置时,100 是自适应软阈值:重复同一调用的停滞轮次会停止,多样化的有效调用可继续,但硬上限为 1000。
这个“轮”包括模型响应及工具结果续接;阻塞 Stop Hook 的续接和运行时调度的 Goal 轮次有新预算。daemon/ACP 按整个 batch 执行前检查,越过显式或硬上限的 batch 全部跳过,因此可能提前一个 batch 停止。
0 或负值禁用此单轮 cap。model.skipLoopDetection 默认 true,关闭的是另一些流式检测;单轮 cap 独立生效。daemon/ACP 还始终有无效参数停滞保护,不能将 skipLoopDetection=true 理解为无任何循环保护。
Goal 窗口
model.goalTokenBudget 默认 30,000,000,累计 Goal 自己轮次中的模型调用 totalTokenCount;-1 不限,0、超过 300,000,000、其他负数、非整数或非数字会在启动时拒绝。
Goal 用尽窗口会获得一轮收尾,然后停止,恢复会授权下一窗口。它不是每次模型请求的上下文上限,也不等于服务商账单预算。
model.goalMaxTurns 未设则无轮数上限,-1 也表示不限;合法正数最多 10,000。计入已完成的用户驱动 Goal 轮次,达到上限仍可接收用户消息,但下一次自主续接可能转为收尾。
model.goalMaxActiveMinutes 未设则无活动时长上限,-1 不限;合法正数最多 10,080。计入 active 状态下的等待与轮间空闲,不计 paused/blocked/stopped 和重启停机;进程挂起仍计时。仅在轮间检查,不是到点强制终止当前工具。
这两项修改需重启,新上限只为之后创建的 Goal 建立。要给既有 Goal 重新设限,官方提示用 /goal set 替换或清除后重建,都会重置记录与计量;不能将其当作无损修改。取消已耗尽上限也要后续 resume/edit 才生效,未耗尽的旧窗口不会自动消失。
model.goalCheckpointTimeoutSeconds 已弃用,值虽接受但不再使用。