From 895eff09b01ce524a4878a65096adfd5191b7d78 Mon Sep 17 00:00:00 2001 From: Aiden Cline <63023139+rekram1-node@users.noreply.github.com> Date: Mon, 24 Aug 2026 22:37:47 -0500 Subject: [PATCH] fix(ai): classify missing chat finish reasons as incomplete (#44864) --- packages/ai/src/protocols/openai-chat.ts | 11 ++++++++++- .../ai/test/provider/openai-compatible-chat.test.ts | 1 + 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/ai/src/protocols/openai-chat.ts b/packages/ai/src/protocols/openai-chat.ts index 2821db8cf87..4770a301838 100644 --- a/packages/ai/src/protocols/openai-chat.ts +++ b/packages/ai/src/protocols/openai-chat.ts @@ -7,6 +7,7 @@ import { HttpTransport } from "../route/transport/index.js" import { Protocol } from "../route/protocol.js" import { AIError, + InvalidProviderOutputReason, LLMEvent, ProviderInternalReason, UnknownProviderReason, @@ -1046,7 +1047,15 @@ const step = (state: ParserState, event: OpenAIChatEvent) => const finishEvents = Effect.fn("OpenAIChat.finishEvents")(function* (state: ParserState) { if (state.finishReason === undefined && state.requireFinishReason) - return yield* ProviderShared.eventError(ADAPTER, "OpenAI Chat stream ended without finish_reason") + return yield* new AIError({ + module: ADAPTER, + method: "stream", + reason: new InvalidProviderOutputReason({ + classification: "incomplete-stream", + message: "OpenAI Chat stream ended without finish_reason", + route: ADAPTER, + }), + }) const events: LLMEvent[] = [] const toolCallEvents = state.finishReason === undefined && Object.keys(state.tools).length > 0 diff --git a/packages/ai/test/provider/openai-compatible-chat.test.ts b/packages/ai/test/provider/openai-compatible-chat.test.ts index 01144c7e26c..c4108d1b402 100644 --- a/packages/ai/test/provider/openai-compatible-chat.test.ts +++ b/packages/ai/test/provider/openai-compatible-chat.test.ts @@ -362,6 +362,7 @@ describe("OpenAI-compatible Chat route", () => { expect(error.reason).toMatchObject({ _tag: "InvalidProviderOutput", + classification: "incomplete-stream", message: "OpenAI Chat stream ended without finish_reason", }) }),