版本
main 源码,commit 320c07f
平台 / 功能
macOS Apple Silicon;AI Agent 对话剪辑 / 音乐分析。
问题描述
一次 analyze_music 已成功返回后,Codex 仍可能在后续 turn 反复发出完全相同的 tool call。Server run 是无 turn 上限循环,且没有针对昂贵纯工具的连续重复保护,因此每次都会重新跑本地节拍和 CLAP 分析,并把完整 JSON 结果重复写入聊天。
实际观测
同一 run、同一 itemId、force=true、相同 args digest:连续执行 4 次成功分析,第 5 次仍在开始;人工停止后 run 才结束。每次都返回相同的 120 BPM / 38 beats 结果,只是 analysisRef/profile digest 有变化。
复现步骤
- 使用 Codex 后端请求只调用一次
analyze_music。
- 参数为固定 itemId 和
force=true。
- 某些模型采样下,首个成功结果返回后会再次发出同一调用。
- 查看 run ledger 和聊天工具卡片。
期望行为
对相邻、字节等价参数的昂贵纯工具,首个成功结果应成为权威结果;重复请求应复用结果并终止循环,不能再次消耗本地算力或 Codex 额度。不同参数或中间发生状态修改时仍应允许重跑。
实际行为
runner 无条件执行每个重复调用,造成长时间占用、重复 JSON 和额度浪费。
根因定位
无界 turn loop 依赖模型自行停止;executeBrowserTool 没有成功结果的短期幂等 guard。
建议修复
- 仅缓存“紧邻的同工具 + 同 args digest + 已成功”的纯工具结果。
- 任意不同工具/参数调用立即清除缓存,避免读到状态变更前的旧结果。
- 重复请求不创建新的 browser tool-request,不重跑模型。
- 将 run 正常完成,并留下简短 guard 说明。
- 添加相同/不同 digest 和跨工具回归测试。
本地验证
加入窄范围 guard 后,全量测试通过;真实界面运行只有 1 个 tool_requested 和 1 个 success outcome,run 状态为 completed,聊天只显示一句摘要。
版本
main 源码,commit
320c07f平台 / 功能
macOS Apple Silicon;AI Agent 对话剪辑 / 音乐分析。
问题描述
一次
analyze_music已成功返回后,Codex 仍可能在后续 turn 反复发出完全相同的 tool call。Server run 是无 turn 上限循环,且没有针对昂贵纯工具的连续重复保护,因此每次都会重新跑本地节拍和 CLAP 分析,并把完整 JSON 结果重复写入聊天。实际观测
同一 run、同一 itemId、
force=true、相同 args digest:连续执行 4 次成功分析,第 5 次仍在开始;人工停止后 run 才结束。每次都返回相同的 120 BPM / 38 beats 结果,只是 analysisRef/profile digest 有变化。复现步骤
analyze_music。force=true。期望行为
对相邻、字节等价参数的昂贵纯工具,首个成功结果应成为权威结果;重复请求应复用结果并终止循环,不能再次消耗本地算力或 Codex 额度。不同参数或中间发生状态修改时仍应允许重跑。
实际行为
runner 无条件执行每个重复调用,造成长时间占用、重复 JSON 和额度浪费。
根因定位
无界 turn loop 依赖模型自行停止;
executeBrowserTool没有成功结果的短期幂等 guard。建议修复
本地验证
加入窄范围 guard 后,全量测试通过;真实界面运行只有 1 个
tool_requested和 1 个 success outcome,run 状态为 completed,聊天只显示一句摘要。