From 75d80fc5daf1dde2434944ddef9ce42c795e6e36 Mon Sep 17 00:00:00 2001 From: ANIRUDDHA ADAK Date: Tue, 25 Aug 2026 15:08:34 +0530 Subject: [PATCH] fix(mistral): retain provider-returned streaming model as responseModel (#128066) Co-authored-by: Aniruddha Adak --- packages/ai/src/providers/mistral.test.ts | 21 +++++++++++++++++++++ packages/ai/src/providers/mistral.ts | 5 +++++ 2 files changed, 26 insertions(+) diff --git a/packages/ai/src/providers/mistral.test.ts b/packages/ai/src/providers/mistral.test.ts index 2bb2c365827d..dbf19146567d 100644 --- a/packages/ai/src/providers/mistral.test.ts +++ b/packages/ai/src/providers/mistral.test.ts @@ -800,6 +800,27 @@ describe("Mistral provider", () => { cacheWrite: 0, totalTokens: 110, }); + expect(result.responseId).toBe("response-cache-usage"); + expect(result.responseModel).toBe("mistral-small-latest"); + }); + + it("omits responseModel when streamed model matches the requested id", async () => { + mistralMockState.streamResult = { + async *[Symbol.asyncIterator]() { + yield { + data: { + id: "response-same-model", + model: "mistral-large-latest", + choices: [{ finishReason: "stop", delta: { content: "ok" } }], + }, + }; + }, + }; + + const result = await runMistralFixture(context, { apiKey: "fixture" }); + + expect(result.responseId).toBe("response-same-model"); + expect(result).not.toHaveProperty("responseModel"); }); it("preserves tool-result boundary whitespace in the request payload", async () => { diff --git a/packages/ai/src/providers/mistral.ts b/packages/ai/src/providers/mistral.ts index 791b784c6ea9..381a93929894 100644 --- a/packages/ai/src/providers/mistral.ts +++ b/packages/ai/src/providers/mistral.ts @@ -593,6 +593,11 @@ async function consumeChatStream( // Mistral's streamed CompletionChunk carries an id field. Keep the first non-empty one, // mirroring how OpenAI-style streaming exposes a stable response identifier per stream. output.responseId ||= chunk.id; + // Retain the provider-returned model when it differs from the requested id so + // routed responses are not misattributed, matching the OpenAI sibling stream. + if (typeof chunk.model === "string" && chunk.model.length > 0 && chunk.model !== model.id) { + output.responseModel ||= chunk.model; + } if (chunk.usage) { const promptTokens = chunk.usage.promptTokens || 0;