From ac7f3c5ece217fa6c9ecccb99be368ed664b0644 Mon Sep 17 00:00:00 2001 From: Aiden Cline <63023139+rekram1-node@users.noreply.github.com> Date: Wed, 9 Sep 2026 21:27:15 -0500 Subject: [PATCH] fix(core): route Mantle GPT-OSS models through Chat (#48251) --- packages/ai/src/providers/amazon-bedrock-mantle.ts | 12 ++++++------ packages/ai/test/provider/bedrock-mantle.test.ts | 8 ++++---- packages/core/src/aisdk-native.ts | 2 +- packages/core/test/aisdk-native.test.ts | 6 +++--- packages/core/test/model-resolver.test.ts | 10 +++++----- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/packages/ai/src/providers/amazon-bedrock-mantle.ts b/packages/ai/src/providers/amazon-bedrock-mantle.ts index f58d0f52783..9de5369d027 100644 --- a/packages/ai/src/providers/amazon-bedrock-mantle.ts +++ b/packages/ai/src/providers/amazon-bedrock-mantle.ts @@ -1,7 +1,8 @@ import { Route, type RouteDefaultsInput } from "../route/client.js" +import { Endpoint } from "../route/endpoint.js" import type { ProviderPackage } from "../provider-package.js" import { OpenAIChat } from "../protocols/openai-chat.js" -import { OpenAIResponses } from "../protocols/openai-responses.js" +import { OpenResponses } from "../protocols/open-responses.js" import { BedrockAuth, type Credentials } from "../protocols/utils/bedrock-auth.js" import { ProviderID, type ModelID } from "../schema/index.js" import { withOpenAIOptions, type OpenAIProviderOptionsInput } from "./openai-options.js" @@ -37,11 +38,10 @@ const responsesRoute = Route.make({ id: "bedrock-mantle-responses", provider: id, providerMetadataKey: "mantle", - protocol: OpenAIResponses.protocol, - endpoint: OpenAIResponses.route.endpoint, - auth: OpenAIResponses.route.auth, - transport: OpenAIResponses.httpTransport, - defaults: OpenAIResponses.route.defaults, + protocol: OpenResponses.protocol, + endpoint: Endpoint.path(OpenResponses.PATH), + transport: OpenResponses.httpTransport, + defaults: { providerOptions: { store: false, include: ["reasoning.encrypted_content"] } }, }) const chatRoute = OpenAIChat.route.with({ diff --git a/packages/ai/test/provider/bedrock-mantle.test.ts b/packages/ai/test/provider/bedrock-mantle.test.ts index 5807228c553..d8771851b09 100644 --- a/packages/ai/test/provider/bedrock-mantle.test.ts +++ b/packages/ai/test/provider/bedrock-mantle.test.ts @@ -4,7 +4,7 @@ import { HttpClientRequest } from "effect/unstable/http" import { LLM, Message } from "../../src/index.js" import { AmazonBedrockMantle } from "../../src/providers.js" import { model } from "../../src/providers/amazon-bedrock/mantle.js" -import { OpenAIResponses } from "../../src/protocols/openai-responses.js" +import { OpenResponses } from "../../src/protocols/open-responses.js" import { compileRequest, LLMClient } from "../../src/route/client.js" import { it } from "../lib/effect.js" import { withProcessEnv } from "../lib/env.js" @@ -25,7 +25,7 @@ describe("Amazon Bedrock Mantle provider", () => { expect(provider.model).toBe(provider.responses) expect(AmazonBedrockMantle.model).toBe(AmazonBedrockMantle.responsesModel) expect(model).toBe(AmazonBedrockMantle.responsesModel) - expect(provider.model("openai.gpt-oss-120b").route.transport).toBe(OpenAIResponses.httpTransport) + expect(provider.model("openai.gpt-oss-120b").route.transport).toBe(OpenResponses.httpTransport) const chat = yield* compileRequest(LLM.request({ model: provider.chat("openai.gpt-oss-120b"), prompt: "Hi" })) const responses = yield* compileRequest( LLM.request({ model: provider.model("openai.gpt-oss-120b"), prompt: "Hi" }), @@ -38,7 +38,7 @@ describe("Amazon Bedrock Mantle provider", () => { }) expect(responses).toMatchObject({ route: "bedrock-mantle-responses", - protocol: "openai-responses", + protocol: "open-responses", body: { model: "openai.gpt-oss-120b", store: false }, }) expect(provider.model("openai.gpt-oss-120b").route.providerMetadataKey).toBe("mantle") @@ -178,7 +178,7 @@ describe("Amazon Bedrock Mantle provider", () => { const recorded = recordedTests({ prefix: "bedrock-mantle", provider: "amazon-bedrock", - protocol: "openai-responses", + protocol: "open-responses", requires: ["AWS_BEARER_TOKEN_BEDROCK"], metadata: { model: "openai.gpt-oss-120b" }, }) diff --git a/packages/core/src/aisdk-native.ts b/packages/core/src/aisdk-native.ts index 49a398256f4..dd172ecbe46 100644 --- a/packages/core/src/aisdk-native.ts +++ b/packages/core/src/aisdk-native.ts @@ -163,7 +163,7 @@ function mapProviderOptions(settings: Readonly>, exclude function mapBedrockMantle(input: MapInput, baseSettings: Readonly>): Mapping | undefined { const settings = input.settings - const chat = input.modelID === "openai.gpt-oss-safeguard-20b" || input.modelID === "openai.gpt-oss-safeguard-120b" + const chat = input.modelID.includes("gpt-oss") return { package: `@opencode/ai/providers/amazon-bedrock/mantle/${chat ? "chat" : "responses"}`, settings: { diff --git a/packages/core/test/aisdk-native.test.ts b/packages/core/test/aisdk-native.test.ts index bf43bbc4d66..188b474434e 100644 --- a/packages/core/test/aisdk-native.test.ts +++ b/packages/core/test/aisdk-native.test.ts @@ -175,7 +175,7 @@ describe("AISDKNative", () => { settings: { region: "us-east-1" }, }) expect(map("@ai-sdk/amazon-bedrock/mantle", { region: "us-east-1" }, "openai.gpt-oss-120b")).toEqual({ - package: "@opencode/ai/providers/amazon-bedrock/mantle/responses", + package: "@opencode/ai/providers/amazon-bedrock/mantle/chat", settings: { region: "us-east-1" }, }) }) @@ -287,7 +287,7 @@ describe("AISDKNative", () => { } expect(map("@ai-sdk/amazon-bedrock/mantle", settings, "openai.gpt-oss-120b")).toEqual({ - package: "@opencode/ai/providers/amazon-bedrock/mantle/responses", + package: "@opencode/ai/providers/amazon-bedrock/mantle/chat", settings: { apiKey: "token", baseURL: "https://mantle.test/v1", @@ -336,7 +336,7 @@ describe("AISDKNative", () => { "openai.gpt-oss-120b", ), ).toEqual({ - package: "@opencode/ai/providers/amazon-bedrock/mantle/responses", + package: "@opencode/ai/providers/amazon-bedrock/mantle/chat", settings: { credentials: { accessKeyId: "key", diff --git a/packages/core/test/model-resolver.test.ts b/packages/core/test/model-resolver.test.ts index c11a997eeaf..7a2b284a9d0 100644 --- a/packages/core/test/model-resolver.test.ts +++ b/packages/core/test/model-resolver.test.ts @@ -169,19 +169,19 @@ describe("ModelResolver", () => { ), ) - it.effect("maps Bedrock Mantle models to native Responses and safeguards to Chat", () => + it.effect("maps Bedrock Mantle GPT-OSS models to Chat and other models to Responses", () => Effect.gen(function* () { const credential = Credential.Key.make({ type: "key", key: "secret" }) const responses = yield* ModelResolver.fromCatalogModel( model(Provider.aisdk("@ai-sdk/amazon-bedrock/mantle"), { - modelID: "openai.gpt-oss-120b", + modelID: "openai.gpt-5.5", settings: { region: "us-east-2" }, }), credential, ) const chat = yield* ModelResolver.fromCatalogModel( model(Provider.aisdk("@ai-sdk/amazon-bedrock/mantle"), { - modelID: "openai.gpt-oss-safeguard-20b", + modelID: "openai.gpt-oss-20b", settings: { region: "us-east-2" }, }), credential, @@ -1041,7 +1041,7 @@ describe("ModelResolver", () => { ["@ai-sdk/amazon-bedrock", "@opencode/ai/providers/amazon-bedrock", "api-model"], [ "@ai-sdk/amazon-bedrock/mantle", - "@opencode/ai/providers/amazon-bedrock/mantle/responses", + "@opencode/ai/providers/amazon-bedrock/mantle/chat", "openai.gpt-oss-120b", ], ["@ai-sdk/azure", "@opencode/ai/providers/azure/responses", "api-model"], @@ -1271,7 +1271,7 @@ describe("ModelResolver", () => { expect(bedrock.route.id).toBe("bedrock-converse") expect(bedrock.route.defaults.generation).toEqual({ topP: 0.8 }) expect(bedrock.route.defaults.http?.body).toEqual({ serviceTier: { type: "priority" } }) - expect(mantle.route.id).toBe("bedrock-mantle-responses") + expect(mantle.route.id).toBe("bedrock-mantle-chat") expect(mantle.route.defaults.generation).toEqual({ topP: 0.6 }) }), )