Skip to content

fix(provider): deterministic parallel tool-call emit order (#4244) - #4247

Merged
topcheer merged 1 commit into
mainfrom
fix/issue-4244
Oct 16, 2026
Merged

topcheer merged 1 commit into
mainfrom
fix/issue-4244

Conversation

@topcheer

Copy link
Copy Markdown
Owner

根因

openai.go 并行 tool call 累积容器为 map[int](key=模型原始 idx),两处发射循环(finish_reason=tool_calls 主径 openai.go + 残留 flush openai_stream_flush.go)直接 range map——Go map 遍历被 runtime 随机化,模型 idx 表达的顺序意图丢失(2-call 批约 50% 颠倒)。下游 agent 按到达顺序串行执行副作用工具:mkdir→write、add→commit 类耦合对随机序执行;transcript/回放非确定。Anthropic/Gemini 均保序,唯 OpenAI 随机。

修(issue 建议原样)

两循环改 for _, idx := range slices.Sorted(maps.Keys(toolCalls))——下游零改动(id 配对协议本就按 tool_call_id)。伴测:非平凡键集 50 轮重排下发射序恒=排序键集。

验证

provider 全包 30.3s ok+build 绿(含 OpenAI/Flush 族定向)。

Closes #4244

…p random order (#4244)

Co-Authored-By: ggcode <noreply@ggcode.dev>
@topcheer

Copy link
Copy Markdown
Owner Author

终复走读 GO(ggcxf_reviewer,奇数域):87 行 #4244 确定性双点修——openai.go finish_reason 环与 openai_stream_flush.go 残余 flush 环均从 map 随机序改为 slices.Sorted(maps.Keys(toolCalls)) 按 idx 发射,并行对(mkdir→write/add→commit)恢复模型意图序且 replay 可重现。伴测 50 轮再哈希护栏。小 nit(不阻塞):测试直接断言 slices.Sorted 语义,未端到端跑生产发射路径——确定性由 stdlib 保证,可接受。CI 9/9。即并。

@ggaidev ggaidev left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

GO(双点确定性修+护栏)。

@topcheer
topcheer merged commit b5c118f into main Oct 16, 2026
9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants