diff --git a/packages/ai/src/api/openai-responses-shared.ts b/packages/ai/src/api/openai-responses-shared.ts index 1b161578a..fbb11c225 100644 --- a/packages/ai/src/api/openai-responses-shared.ts +++ b/packages/ai/src/api/openai-responses-shared.ts @@ -563,7 +563,9 @@ export async function processResponsesStream( options.applyServiceTierPricing(output.usage, serviceTier); } // Map status to stop reason - output.stopReason = mapStopReason(response?.status); + const status = response?.status; + output.rawStopReason = status; + output.stopReason = mapStopReason(status); if (output.content.some((b) => b.type === "toolCall") && output.stopReason === "stop") { output.stopReason = "toolUse"; } @@ -716,6 +718,7 @@ export async function processResponsesStream( throw new Error(`Error Code ${event.code}: ${event.message}` || "Unknown error"); } else if (event.type === "response.failed") { sawTerminalResponseEvent = true; + output.rawStopReason = event.response?.status; const error = event.response?.error; const details = event.response?.incomplete_details; const msg = error diff --git a/packages/ai/test/openai-responses-terminal-event.test.ts b/packages/ai/test/openai-responses-terminal-event.test.ts index fcc3cc522..2e02151e0 100644 --- a/packages/ai/test/openai-responses-terminal-event.test.ts +++ b/packages/ai/test/openai-responses-terminal-event.test.ts @@ -285,6 +285,7 @@ describe("OpenAI Responses terminal event handling", () => { expect(output.responseId).toBe("resp_completed"); expect(output.stopReason).toBe("stop"); + expect(output.rawStopReason).toBe("completed"); expect(output.usage).toMatchObject({ input: 15, output: 7, @@ -303,6 +304,7 @@ describe("OpenAI Responses terminal event handling", () => { expect(output.responseId).toBe("resp_incomplete"); expect(output.stopReason).toBe("length"); + expect(output.rawStopReason).toBe("incomplete"); expect(output.usage).toMatchObject({ input: 25, output: 12, @@ -320,5 +322,6 @@ describe("OpenAI Responses terminal event handling", () => { await expect(processResponsesStream(createFailedEvents(), output, stream, model)).rejects.toThrow( "server_error: boom", ); + expect(output.rawStopReason).toBe("failed"); }); });