diff --git a/packages/ai/src/utils/assistant-message-frame.ts b/packages/ai/src/utils/assistant-message-frame.ts index f314a9f1d..65e23ede5 100644 --- a/packages/ai/src/utils/assistant-message-frame.ts +++ b/packages/ai/src/utils/assistant-message-frame.ts @@ -83,6 +83,7 @@ function cloneStartMessage(message: AssistantMessage): AssistantMessage { model: message.model, ...(message.responseModel === undefined ? {} : { responseModel: message.responseModel }), ...(message.responseId === undefined ? {} : { responseId: message.responseId }), + ...(message.providerThinkingLevel === undefined ? {} : { providerThinkingLevel: message.providerThinkingLevel }), ...(message.diagnostics === undefined ? {} : { diagnostics: structuredClone(message.diagnostics) }), usage: structuredClone(message.usage), stopReason: "pending", diff --git a/packages/ai/test/assistant-message-frame.test.ts b/packages/ai/test/assistant-message-frame.test.ts index 0c0564e23..ab7f5f9ac 100644 --- a/packages/ai/test/assistant-message-frame.test.ts +++ b/packages/ai/test/assistant-message-frame.test.ts @@ -61,6 +61,16 @@ describe("assistant message frames", () => { ]); }); + it("preserves provider thinking level from the stream start", () => { + const partial = seed(); + partial.providerThinkingLevel = "high"; + const encoder = new AssistantMessageFrameEncoder(); + const start = frame(encoder, { type: "start", partial }); + + expect(start).toMatchObject({ type: "start", partial: { providerThinkingLevel: "high" } }); + expect(reduceAssistantMessageFrames([start])?.providerThinkingLevel).toBe("high"); + }); + it("preserves initial and final thinking metadata, including redaction", () => { const partial = seed(); const encoder = new AssistantMessageFrameEncoder();