fix(app): support anthropic models on azure cognitive services (#8335)

This commit is contained in:
Unies Ananda Raja
2026-01-17 04:24:06 +07:00
committed by GitHub
parent 6e028ec2dc
commit b8e2895dfc
3 changed files with 67 additions and 13 deletions

View File

@@ -16,6 +16,17 @@ function mimeToModality(mime: string): Modality | undefined {
}
export namespace ProviderTransform {
function isAzureAnthropic(model: Provider.Model): boolean {
return (
model.providerID === "azure-cognitive-services" &&
(model.api.id.includes("claude") || model.api.id.includes("anthropic"))
)
}
function usesAnthropicSDK(model: Provider.Model): boolean {
return model.api.npm === "@ai-sdk/anthropic" || isAzureAnthropic(model)
}
function normalizeMessages(
msgs: ModelMessage[],
model: Provider.Model,
@@ -50,7 +61,7 @@ export namespace ProviderTransform {
// Anthropic rejects messages with empty content - filter out empty string messages
// and remove empty text/reasoning parts from array content
if (model.api.npm === "@ai-sdk/anthropic") {
if (usesAnthropicSDK(model)) {
msgs = msgs
.map((msg) => {
if (typeof msg.content === "string") {
@@ -256,7 +267,7 @@ export namespace ProviderTransform {
model.providerID === "anthropic" ||
model.api.id.includes("anthropic") ||
model.api.id.includes("claude") ||
model.api.npm === "@ai-sdk/anthropic"
usesAnthropicSDK(model)
) {
msgs = applyCaching(msgs, model.providerID)
}
@@ -308,6 +319,23 @@ export namespace ProviderTransform {
const id = model.id.toLowerCase()
if (id.includes("deepseek") || id.includes("minimax") || id.includes("glm") || id.includes("mistral")) return {}
if (isAzureAnthropic(model)) {
return {
high: {
thinking: {
type: "enabled",
budgetTokens: 16000,
},
},
max: {
thinking: {
type: "enabled",
budgetTokens: 31999,
},
},
}
}
switch (model.api.npm) {
case "@openrouter/ai-sdk-provider":
if (!model.id.includes("gpt") && !model.id.includes("gemini-3") && !model.id.includes("grok-4")) return {}
@@ -578,6 +606,9 @@ export namespace ProviderTransform {
}
export function providerOptions(model: Provider.Model, options: { [x: string]: any }) {
if (isAzureAnthropic(model)) {
return { ["anthropic" as string]: options }
}
switch (model.api.npm) {
case "@ai-sdk/github-copilot":
case "@ai-sdk/openai":
@@ -613,16 +644,27 @@ export namespace ProviderTransform {
}
}
export function maxOutputTokens(model: Provider.Model, options: Record<string, any>, globalLimit: number): number
export function maxOutputTokens(
npm: string,
options: Record<string, any>,
modelLimit: number,
globalLimit: number,
): number
export function maxOutputTokens(
arg1: Provider.Model | string,
options: Record<string, any>,
arg3: number,
arg4?: number,
): number {
const model = typeof arg1 === "object" ? arg1 : null
const npm = model ? model.api.npm : (arg1 as string)
const modelLimit = model ? model.limit.output : arg3
const globalLimit = model ? arg3 : arg4!
const modelCap = modelLimit || globalLimit
const standardLimit = Math.min(modelCap, globalLimit)
if (npm === "@ai-sdk/anthropic") {
if (model ? usesAnthropicSDK(model) : npm === "@ai-sdk/anthropic") {
const thinking = options?.["thinking"]
const budgetTokens = typeof thinking?.["budgetTokens"] === "number" ? thinking["budgetTokens"] : 0
const enabled = thinking?.["type"] === "enabled"