diff --git a/packages/opencode/src/provider/transform.ts b/packages/opencode/src/provider/transform.ts index 0c01f0d5f8d5..79cfa3ea508a 100644 --- a/packages/opencode/src/provider/transform.ts +++ b/packages/opencode/src/provider/transform.ts @@ -1110,7 +1110,14 @@ export function options(input: { if (input.model.api.id.includes("gpt-5") && !input.model.api.id.includes("gpt-5-chat")) { if (!input.model.api.id.includes("gpt-5-pro")) { result["reasoningEffort"] = "medium" - result["reasoningSummary"] = "auto" + if ( + input.model.api.npm === "@ai-sdk/openai" || + input.model.api.npm === "@ai-sdk/azure" || + input.model.api.npm === "@ai-sdk/github-copilot" || + input.model.api.npm === "@ai-sdk/amazon-bedrock/mantle" + ) { + result["reasoningSummary"] = "auto" + } if (input.model.api.npm === "@ai-sdk/openai" || input.model.api.npm === "@ai-sdk/amazon-bedrock/mantle") { result["include"] = INCLUDE_ENCRYPTED_REASONING } diff --git a/packages/opencode/src/session/llm/request.ts b/packages/opencode/src/session/llm/request.ts index 2c9ede0e1b6b..0996be0f7ba4 100644 --- a/packages/opencode/src/session/llm/request.ts +++ b/packages/opencode/src/session/llm/request.ts @@ -89,6 +89,13 @@ export const prepare = Effect.fn("LLMRequestPrep.prepare")(function* (input: Pre providerOptions: input.provider.options, }) const options = mergeOptions(mergeOptions(mergeOptions(base, input.model.options), input.agent.options), variant) + if ( + input.model.api.npm === "@ai-sdk/azure" && + (input.provider.options.useCompletionUrls || input.model.options.useCompletionUrls || options.useCompletionUrls) + ) { + delete options.reasoningSummary + delete options.include + } if (isOpenaiOauth) options.instructions = system.join("\n") const messages = diff --git a/packages/opencode/test/provider/transform.test.ts b/packages/opencode/test/provider/transform.test.ts index 414b66412922..674d4ef00475 100644 --- a/packages/opencode/test/provider/transform.test.ts +++ b/packages/opencode/test/provider/transform.test.ts @@ -1,5 +1,7 @@ import { describe, expect, test } from "bun:test" +import { Effect } from "effect" import { ProviderTransform } from "@/provider/transform" +import { LLMRequestPrep } from "@/session/llm/request" import { ProviderV2 } from "@opencode-ai/core/provider" import { ModelV2 } from "@opencode-ai/core/model" @@ -294,6 +296,78 @@ describe("ProviderTransform.options - gpt-5 textVerbosity", () => { expect(result.textVerbosity).toBe("low") }) + test("openai-compatible gpt-5 models omit Responses-only reasoningSummary", () => { + const model = { + ...createGpt5Model("gpt-5.4"), + id: "cortecs/gpt-5.4", + providerID: "cortecs", + api: { + id: "gpt-5.4", + url: "https://api.cortecs.ai/v1", + npm: "@ai-sdk/openai-compatible", + }, + } + const result = ProviderTransform.options({ model, sessionID, providerOptions: {} }) + expect(result.reasoningEffort).toBe("medium") + expect(result.reasoningSummary).toBeUndefined() + expect(result.include).toBeUndefined() + }) + + test("azure chat completions omit Responses-only reasoning options after variants merge", async () => { + const model = { + ...createGpt5Model("gpt-5.4"), + id: "azure/gpt-5.4", + providerID: "azure", + api: { + id: "gpt-5.4", + url: "https://azure.com", + npm: "@ai-sdk/azure", + }, + variants: { + high: { + reasoningEffort: "high", + reasoningSummary: "auto", + include: ["reasoning.encrypted_content"], + }, + }, + } + const result = await Effect.runPromise( + LLMRequestPrep.prepare({ + user: { + id: "msg_user-test", + sessionID, + role: "user", + time: { created: Date.now() }, + agent: "test", + model: { providerID: "azure", modelID: "gpt-5.4", variant: "high" }, + } as any, + sessionID, + model, + agent: { + name: "test", + mode: "primary", + options: {}, + permission: [], + } as any, + system: [], + messages: [{ role: "user", content: "Hello" }], + tools: {}, + provider: { id: "azure", options: { useCompletionUrls: true } } as any, + auth: undefined, + plugin: { + trigger: (_name: string, _input: unknown, output: unknown) => Effect.succeed(output), + list: () => Effect.succeed([]), + init: () => Effect.void, + } as any, + flags: { outputTokenMax: 32_000, client: "test" } as any, + isWorkflow: false, + }), + ) + expect(result.params.options.reasoningEffort).toBe("high") + expect(result.params.options.reasoningSummary).toBeUndefined() + expect(result.params.options.include).toBeUndefined() + }) + test("gpt-5.1 should have textVerbosity set to low", () => { const model = createGpt5Model("gpt-5.1") const result = ProviderTransform.options({ model, sessionID, providerOptions: {} })