先看现象。openai-agents 0.2 的 Runner.run 没有传 max_turns,复杂任务第 11 轮抛 MaxTurnsExceeded,前面的工具都执行完了,但拿不到最后回答。
排查方向其实有限,先把可能性排一排。默认上限是 10 轮,工具往返也算一轮。另一种情况是工具返回后模型继续调用,没有终止条件。
少数情况下是异常没有被捕获,结果对象丢了。
不容易想到的是,任务本身需要更多轮次,配置没跟着调。
显式把 max_turns 调大再跑一次
python -c "print('Runner.run(agent, input, max_turns=30)')"
捕获异常并从 last_response 里取已有结果
python -c "print('except MaxTurnsExceeded as e: e.run_data.last_response')"
然后检查工具是否在没有进展时被反复调用
python trace_tools.py --run-id latest --show-calls
给 Agent 加一个明确的收尾指令
python smoke_agent.py --system-file finish_rule.txt
白天有业务在跑,能验证的部分都压到了晚上做。
当时还开着另一个排查窗口,两边日志对照着看才定位到。
恢复的判定其实很直接。任务能在 30 轮内自然结束,返回 final_output,日志里没有 MaxTurnsExceeded。
轮次上限是保护机制,不是 bug,遇到它先看工具调用是否在原地打转,单纯调大上限只会把问题推到下一轮。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。
