From 5ac4156eb2803dbc6eb52e8b89a4914a701c124a Mon Sep 17 00:00:00 2001 From: Aiden Cline <63023139+rekram1-node@users.noreply.github.com> Date: Wed, 26 Aug 2026 17:52:41 -0500 Subject: [PATCH] fix(core): preserve reasoning across model switches (#45401) --- packages/core/src/session/runner/to-llm-message.ts | 3 ++- packages/core/test/session-runner-message.test.ts | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/core/src/session/runner/to-llm-message.ts b/packages/core/src/session/runner/to-llm-message.ts index 51b0f1ef1ef..9c90d775f60 100644 --- a/packages/core/src/session/runner/to-llm-message.ts +++ b/packages/core/src/session/runner/to-llm-message.ts @@ -157,6 +157,7 @@ const assistant = (message: SessionMessage.Assistant, model: Model.Ref, provider providerMetadata: reuseProviderMetadata ? providerMetadata(providerMetadataKey, item.state) : undefined, }, ] + // Let the destination adapter handle readable reasoning after a model/provider switch. if (item.type === "reasoning") return reuseProviderMetadata ? [ @@ -167,7 +168,7 @@ const assistant = (message: SessionMessage.Assistant, model: Model.Ref, provider }, ] : item.text.length > 0 - ? [{ type: "text", text: item.text }] + ? [{ type: message.error === undefined ? "reasoning" : "text", text: item.text }] : [] // Call-side metadata is model-scoped proof of generation (Gemini thought // signatures, OpenAI encrypted reasoning): only the producing model may diff --git a/packages/core/test/session-runner-message.test.ts b/packages/core/test/session-runner-message.test.ts index 706ecc30227..462e3f6c919 100644 --- a/packages/core/test/session-runner-message.test.ts +++ b/packages/core/test/session-runner-message.test.ts @@ -984,7 +984,7 @@ Recent work ) expect(messages[0]?.content).toEqual([ - { type: "text", text: "Visible thought" }, + { type: "reasoning", text: "Visible thought" }, { type: "tool-call", id: "hosted-old-model",