feat: bump bedrock and add proper mantle support for openai models through aws bedrock (#30464)

This commit is contained in:
Aiden Cline
2026-06-04 00:09:12 -05:00
committed by GitHub
parent 2a33addd29
commit 9f42bd4a85
12 changed files with 305 additions and 92 deletions

View File

@@ -33,6 +33,20 @@ afterEach(async () => {
const list = Provider.use.list()
const mantleModelConfig = {
provider: { npm: "@ai-sdk/amazon-bedrock/mantle" },
limit: { context: 272_000, output: 32_000 },
modalities: {
input: ["text", "image", "pdf"] as Array<"text" | "image" | "pdf">,
output: ["text"] as Array<"text">,
},
}
const mantleOpenAIModelConfig = {
...mantleModelConfig,
provider: { npm: "@ai-sdk/amazon-bedrock/mantle", api: "https://bedrock-mantle.us-east-2.api.aws/openai/v1" },
}
const withAuthJson = (contents: string) =>
Effect.acquireRelease(
Effect.promise(async () => {
@@ -94,6 +108,65 @@ it.instance(
{ config: { provider: { "amazon-bedrock": { options: { region: "eu-west-1" } } } } },
)
it.instance(
"Bedrock Mantle: GPT-5.5 uses Responses API and OpenAI base path",
() =>
Effect.gen(function* () {
yield* set("AWS_BEARER_TOKEN_BEDROCK", "test-bearer-token")
const model = yield* Provider.use.getModel(ProviderV2.ID.amazonBedrock, ProviderV2.ModelID.make("openai.gpt-5.5"))
const language = yield* Provider.use.getLanguage(model)
expect((language as { provider: string }).provider).toBe("bedrock-mantle.responses")
expect((language as { modelId: string }).modelId).toBe("openai.gpt-5.5")
expect(
(language as unknown as { config: { url: (input: { path: string; modelId: string }) => string } }).config.url({
path: "/responses",
modelId: "openai.gpt-5.5",
}),
).toBe("https://bedrock-mantle.us-east-2.api.aws/openai/v1/responses")
}),
{
config: {
provider: {
"amazon-bedrock": {
options: { region: "us-east-2" },
models: { "openai.gpt-5.5": mantleOpenAIModelConfig },
},
},
},
},
)
it.instance(
"Bedrock Mantle: GPT OSS safeguard uses Chat Completions and Mantle base path",
() =>
Effect.gen(function* () {
yield* set("AWS_BEARER_TOKEN_BEDROCK", "test-bearer-token")
const model = yield* Provider.use.getModel(
ProviderV2.ID.amazonBedrock,
ProviderV2.ModelID.make("openai.gpt-oss-safeguard-120b"),
)
const language = yield* Provider.use.getLanguage(model)
expect((language as { provider: string }).provider).toBe("bedrock-mantle.chat")
expect((language as { modelId: string }).modelId).toBe("openai.gpt-oss-safeguard-120b")
expect(
(language as unknown as { config: { url: (input: { path: string; modelId: string }) => string } }).config.url({
path: "/chat/completions",
modelId: "openai.gpt-oss-safeguard-120b",
}),
).toBe("https://bedrock-mantle.us-east-1.api.aws/v1/chat/completions")
}),
{
config: {
provider: {
"amazon-bedrock": {
options: { region: "us-east-1" },
models: { "openai.gpt-oss-safeguard-120b": mantleModelConfig },
},
},
},
},
)
it.instance(
"Bedrock: config profile takes precedence over AWS_PROFILE env var",
() =>

View File

@@ -274,6 +274,25 @@ describe("ProviderTransform.options - gpt-5 textVerbosity", () => {
expect(result.include).toEqual(["reasoning.encrypted_content"])
})
test("Bedrock Mantle gpt-5.5 uses OpenAI Responses defaults", () => {
const model = {
...createGpt5Model("openai.gpt-5.5"),
id: "amazon-bedrock/openai.gpt-5.5",
providerID: "amazon-bedrock",
api: {
id: "openai.gpt-5.5",
url: "https://bedrock-mantle.us-east-2.api.aws/openai/v1",
npm: "@ai-sdk/amazon-bedrock/mantle",
},
}
const result = ProviderTransform.options({ model, sessionID, providerOptions: {} })
expect(result.store).toBe(false)
expect(result.reasoningEffort).toBe("medium")
expect(result.reasoningSummary).toBe("auto")
expect(result.include).toEqual(["reasoning.encrypted_content"])
expect(result.textVerbosity).toBe("low")
})
test("gpt-5.1 should have textVerbosity set to low", () => {
const model = createGpt5Model("gpt-5.1")
const result = ProviderTransform.options({ model, sessionID, providerOptions: {} })
@@ -562,6 +581,21 @@ describe("ProviderTransform.providerOptions", () => {
})
})
test("maps Bedrock Mantle provider options to OpenAI namespace", () => {
const model = createModel({
providerID: "amazon-bedrock",
api: {
id: "openai.gpt-5.5",
url: "https://bedrock-mantle.us-east-2.api.aws/openai/v1",
npm: "@ai-sdk/amazon-bedrock/mantle",
},
})
expect(ProviderTransform.providerOptions(model, { reasoningEffort: "medium" })).toEqual({
openai: { reasoningEffort: "medium" },
})
})
test("uses groq slug for groq models", () => {
const model = createModel({
providerID: "vercel",
@@ -3163,6 +3197,28 @@ describe("ProviderTransform.variants", () => {
})
})
describe("@ai-sdk/amazon-bedrock/mantle", () => {
test("gpt-5.5 returns OpenAI-style reasoning variants", () => {
const model = createMockModel({
id: "openai.gpt-5.5",
providerID: "amazon-bedrock",
api: {
id: "openai.gpt-5.5",
url: "https://bedrock-mantle.us-east-2.api.aws/openai/v1",
npm: "@ai-sdk/amazon-bedrock/mantle",
},
release_date: "2026-04-23",
})
const result = ProviderTransform.variants(model)
expect(Object.keys(result)).toEqual(["none", "low", "medium", "high", "xhigh"])
expect(result.medium).toEqual({
reasoningEffort: "medium",
reasoningSummary: "auto",
include: ["reasoning.encrypted_content"],
})
})
})
describe("@ai-sdk/anthropic", () => {
for (const testCase of [
{