diff --git a/open-sse/translator/response/openai-responses.ts b/open-sse/translator/response/openai-responses.ts index 40b3b67076..ebd417d007 100644 --- a/open-sse/translator/response/openai-responses.ts +++ b/open-sse/translator/response/openai-responses.ts @@ -16,7 +16,7 @@ function stripEmptyOptionalToolArgs(value) { try { const parsed = JSON.parse(value); const cleaned = stripEmptyOptionalToolArgs(parsed); - return JSON.stringify(cleaned || {}); + return JSON.stringify(cleaned ?? {}); } catch { return value; } diff --git a/tests/unit/translator-resp-openai-responses.test.ts b/tests/unit/translator-resp-openai-responses.test.ts index 2d6706b316..569cfa5f0d 100644 --- a/tests/unit/translator-resp-openai-responses.test.ts +++ b/tests/unit/translator-resp-openai-responses.test.ts @@ -242,6 +242,26 @@ test("Responses -> OpenAI: empty-name tool call is deferred until output_item.do ); }); +test("Responses -> OpenAI: preserves falsy JSON-string tool arguments while cleaning", () => { + const state = {}; + openaiResponsesToOpenAIResponse( + { + type: "response.output_item.added", + item: { type: "function_call", call_id: "call_flag", name: "set_flag" }, + }, + state + ); + const done = openaiResponsesToOpenAIResponse( + { + type: "response.output_item.done", + item: { type: "function_call", call_id: "call_flag", name: "set_flag", arguments: "false" }, + }, + state + ); + + assert.equal(done.choices[0].delta.tool_calls[0].function.arguments, "false"); +}); + test("Responses -> OpenAI: strips empty optional args from JSON-string output_item.done arguments", () => { const state = {}; openaiResponsesToOpenAIResponse(