From b55fe1bbd42630e8bb7518023c05d15a2ea936a1 Mon Sep 17 00:00:00 2001 From: PriNova Date: Sat, 30 May 2026 11:15:30 +0200 Subject: [PATCH 1/2] Fix OpenRouter reasoning instruction role --- .../ai/src/providers/openai-completions.ts | 5 ++- .../openai-completions-tool-choice.test.ts | 44 +++++++++++++++++++ 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/packages/ai/src/providers/openai-completions.ts b/packages/ai/src/providers/openai-completions.ts index 245e0bc8..ae06326e 100644 --- a/packages/ai/src/providers/openai-completions.ts +++ b/packages/ai/src/providers/openai-completions.ts @@ -1075,6 +1075,7 @@ function detectCompat(model: Model<"openai-completions">): ResolvedOpenAIComplet const isTogether = provider === "together" || baseUrl.includes("api.together.ai") || baseUrl.includes("api.together.xyz"); const isMoonshot = provider === "moonshotai" || provider === "moonshotai-cn" || baseUrl.includes("api.moonshot."); + const isOpenRouter = provider === "openrouter" || baseUrl.includes("openrouter.ai"); const isCloudflareWorkersAI = provider === "cloudflare-workers-ai" || baseUrl.includes("api.cloudflare.com"); const isCloudflareAiGateway = provider === "cloudflare-ai-gateway" || baseUrl.includes("gateway.ai.cloudflare.com"); @@ -1101,7 +1102,7 @@ function detectCompat(model: Model<"openai-completions">): ResolvedOpenAIComplet return { supportsStore: !isNonStandard, - supportsDeveloperRole: !isNonStandard, + supportsDeveloperRole: !isNonStandard && !isOpenRouter, supportsReasoningEffort: !isGrok && !isZai && !isMoonshot && !isTogether && !isCloudflareAiGateway, supportsUsageInStreaming: true, maxTokensField: useMaxTokens ? "max_tokens" : "max_completion_tokens", @@ -1115,7 +1116,7 @@ function detectCompat(model: Model<"openai-completions">): ResolvedOpenAIComplet ? "zai" : isTogether ? "together" - : provider === "openrouter" || baseUrl.includes("openrouter.ai") + : isOpenRouter ? "openrouter" : "openai", openRouterRouting: {}, diff --git a/packages/ai/test/openai-completions-tool-choice.test.ts b/packages/ai/test/openai-completions-tool-choice.test.ts index 81dfb1d4..7ba1e911 100644 --- a/packages/ai/test/openai-completions-tool-choice.test.ts +++ b/packages/ai/test/openai-completions-tool-choice.test.ts @@ -817,6 +817,50 @@ describe("openai-completions tool_choice", () => { expect(writeCall).not.toHaveProperty("partialArgs"); }); + it("uses system messages for OpenRouter reasoning model instructions", async () => { + const model = getModel("openrouter", "deepseek/deepseek-v4-pro")!; + let payload: unknown; + + await streamSimple( + model, + { + systemPrompt: "Follow instructions.", + messages: [{ role: "user", content: "Hi", timestamp: Date.now() }], + }, + { + apiKey: "test", + onPayload: (params: unknown) => { + payload = params; + }, + }, + ).result(); + + const params = payload as { messages?: Array<{ role?: string }> }; + expect(params.messages?.[0]?.role).toBe("system"); + }); + + it("keeps developer messages for OpenAI reasoning model instructions", async () => { + const model = getModel("openai", "gpt-5.5")!; + let payload: unknown; + + await streamSimple( + model, + { + systemPrompt: "Follow instructions.", + messages: [{ role: "user", content: "Hi", timestamp: Date.now() }], + }, + { + apiKey: "test", + onPayload: (params: unknown) => { + payload = params; + }, + }, + ).result(); + + const params = payload as { messages?: Array<{ role?: string }> }; + expect(params.messages?.[0]?.role).toBe("developer"); + }); + it("stores Xiaomi MiMo reasoning replay compat in built-in metadata", () => { const providers = ["xiaomi", "xiaomi-token-plan-cn", "xiaomi-token-plan-ams", "xiaomi-token-plan-sgp"] as const; From 74d81bd36375cc9a42f32e70ac1bbf49d8a581f5 Mon Sep 17 00:00:00 2001 From: PriNova Date: Sat, 30 May 2026 12:24:19 +0200 Subject: [PATCH 2/2] Fix OpenAI completions developer role test --- packages/ai/test/openai-completions-tool-choice.test.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/ai/test/openai-completions-tool-choice.test.ts b/packages/ai/test/openai-completions-tool-choice.test.ts index 7ba1e911..5f40c817 100644 --- a/packages/ai/test/openai-completions-tool-choice.test.ts +++ b/packages/ai/test/openai-completions-tool-choice.test.ts @@ -840,7 +840,8 @@ describe("openai-completions tool_choice", () => { }); it("keeps developer messages for OpenAI reasoning model instructions", async () => { - const model = getModel("openai", "gpt-5.5")!; + const { compat: _compat, ...baseModel } = getModel("openai", "gpt-5.5")!; + const model = { ...baseModel, api: "openai-completions" } as const; let payload: unknown; await streamSimple(