跳转至

预算与限制

重试决定 Run 如何应对基础设施故障;限制决定单个请求最多可以消耗多少资源。因此它们应作为 Runner 参数传入,而不是放在可复用的 Agent 配置上。

from lovia import Agent, RunBudget, Runner

agent = Agent(name="analyst", model="<model>")

result = await Runner.run(
    agent,
    "分析这些日志。",
    max_turns=12,
    budget=RunBudget(max_tool_calls=20, max_seconds=60),
)

RunBudget

Runner 会在 Turn 之间、每次模型回复后,以及每个 Tool 调用的预检阶段检查预算。

字段 限制对象
max_input_tokens 累计输入 Token
max_output_tokens 累计输出 Token
max_total_tokens 累计输入与输出 Token
max_tool_calls Tool 请求次数,包括被拒绝的调用
max_seconds 从第一次预算检查开始计算的墙钟时间

超限后会在下一个安全点抛出 BudgetExceeded。预算会停止分派新的 Tool 调用,但已经运行的 调用会完成并持久化结果。

每次 Run 创建新的预算

RunBudget 会保存开始时间和 Tool 调用计数。复用同一个实例,会把已经消耗的时间和次数 带入下一次 Run。

Agent-as-tool 子 Run 使用独立复制的预算。子 Run 超限时,父 Run 会收到 Tool 错误并决定如何处理,而不是自动失败。

Turn 限制

max_turns 默认为 50,耗尽后抛出 MaxTurnsExceeded。它是防止 Agent 反复调用工具、 始终无法产生最终答案的最直接保护。

时间限制是协作式的

max_seconds 只在安全点检查,并非硬截止时间。一个运行五分钟的 Tool 可能让 60 秒预算延迟 结束。需要真实截止时间时,应同时配置 Tool 的 timeout=取消

延伸阅读