fix(qa): issue unique mock tool call ids (#96338) · openclaw/openclaw@f65aca6
vincentkoc
·
2026-06-24
·
via Recent Commits to openclaw:main
File tree
extensions/qa-lab/src/providers/mock-openai
| Original file line number | Diff line number | Diff line change |
|---|
@@ -1014,6 +1014,27 @@ describe("qa mock openai server", () => {
|
1014 | 1014 | expect(firstPayload.output?.[0]?.call_id).not.toBe(secondPayload.output?.[0]?.call_id); |
1015 | 1015 | }); |
1016 | 1016 | |
| 1017 | +it("uses unique ids for repeated identical tool calls", async () => { |
| 1018 | +const server = await startMockServer(); |
| 1019 | +const body = { |
| 1020 | +stream: false, |
| 1021 | +model: "gpt-5.5", |
| 1022 | +input: [makeUserInput("Read QA_KICKOFF_TASK.md, then answer with exactly QA-READ-OK.")], |
| 1023 | +}; |
| 1024 | + |
| 1025 | +const first = await expectResponsesJson<{ output?: Array<{ call_id?: string }> }>(server, body); |
| 1026 | +const second = await expectResponsesJson<{ output?: Array<{ call_id?: string }> }>( |
| 1027 | +server, |
| 1028 | +body, |
| 1029 | +); |
| 1030 | + |
| 1031 | +const firstCallId = first.output?.[0]?.call_id; |
| 1032 | +const secondCallId = second.output?.[0]?.call_id; |
| 1033 | +expect(firstCallId).toMatch(/^call_mock_read_/); |
| 1034 | +expect(secondCallId).toMatch(/^call_mock_read_/); |
| 1035 | +expect(firstCallId).not.toBe(secondCallId); |
| 1036 | +}); |
| 1037 | + |
1017 | 1038 | it("continues repo-contract followthrough when a retry user item follows tool output", async () => { |
1018 | 1039 | const server = await startQaMockOpenAiServer({ |
1019 | 1040 | host: "127.0.0.1", |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -10,6 +10,8 @@ import { writeJson } from "../shared/http-json.js";
|
10 | 10 | |
11 | 11 | type ResponsesInputItem = Record<string, unknown>; |
12 | 12 | |
| 13 | +let mockFunctionCallSequence = 0; |
| 14 | + |
13 | 15 | type StreamEvent = |
14 | 16 | | { type: "response.output_item.added"; item: Record<string, unknown> } |
15 | 17 | | { |
@@ -773,8 +775,10 @@ function buildMockFunctionCall(name: string, args: Record<string, unknown>) {
|
773 | 775 | .update(serialized) |
774 | 776 | .digest("hex") |
775 | 777 | .slice(0, 10); |
776 | | -const callId = `call_mock_${name}_${callSuffix}`; |
777 | | -const itemId = `fc_mock_${name}_${callSuffix}`; |
| 778 | +const sequence = ++mockFunctionCallSequence; |
| 779 | +const uniqueSuffix = `${callSuffix}_${sequence}`; |
| 780 | +const callId = `call_mock_${name}_${uniqueSuffix}`; |
| 781 | +const itemId = `fc_mock_${name}_${uniqueSuffix}`; |
778 | 782 | const item = { |
779 | 783 | type: "function_call", |
780 | 784 | id: itemId, |
@@ -786,7 +790,7 @@ function buildMockFunctionCall(name: string, args: Record<string, unknown>) {
|
786 | 790 | callId, |
787 | 791 | item, |
788 | 792 | itemId, |
789 | | -responseId: `resp_mock_${name}_${callSuffix}`, |
| 793 | +responseId: `resp_mock_${name}_${uniqueSuffix}`, |
790 | 794 | serialized, |
791 | 795 | }; |
792 | 796 | } |
|
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。