From 6184307c394c6a622ccdf47cf5b0f9a860cbc15e Mon Sep 17 00:00:00 2001 From: Mario Zechner Date: Tue, 23 Jun 2026 21:04:59 +0200 Subject: [PATCH] fix(ai): require explicit anthropic compat metadata --- packages/ai/src/api/anthropic-messages.ts | 13 ++----- .../ai/src/providers/openrouter.models.ts | 38 +++++++++---------- packages/ai/test/fireworks-models.test.ts | 11 +++++- 3 files changed, 33 insertions(+), 29 deletions(-) diff --git a/packages/ai/src/api/anthropic-messages.ts b/packages/ai/src/api/anthropic-messages.ts index 3b94d296..03bbc26c 100644 --- a/packages/ai/src/api/anthropic-messages.ts +++ b/packages/ai/src/api/anthropic-messages.ts @@ -170,16 +170,11 @@ const INTERLEAVED_THINKING_BETA = "interleaved-thinking-2025-05-14"; function getAnthropicCompat( model: Model<"anthropic-messages">, ): Required> { - const isFireworks = model.provider === "fireworks"; - const isCloudflareAiGatewayAnthropic = - model.provider === "cloudflare-ai-gateway" && model.baseUrl.includes("anthropic"); - return { - supportsEagerToolInputStreaming: model.compat?.supportsEagerToolInputStreaming ?? !isFireworks, - supportsLongCacheRetention: model.compat?.supportsLongCacheRetention ?? !isFireworks, - sendSessionAffinityHeaders: - model.compat?.sendSessionAffinityHeaders ?? (isFireworks || isCloudflareAiGatewayAnthropic), - supportsCacheControlOnTools: model.compat?.supportsCacheControlOnTools ?? !isFireworks, + supportsEagerToolInputStreaming: model.compat?.supportsEagerToolInputStreaming ?? true, + supportsLongCacheRetention: model.compat?.supportsLongCacheRetention ?? true, + sendSessionAffinityHeaders: model.compat?.sendSessionAffinityHeaders ?? false, + supportsCacheControlOnTools: model.compat?.supportsCacheControlOnTools ?? true, supportsTemperature: model.compat?.supportsTemperature ?? true, allowEmptySignature: model.compat?.allowEmptySignature ?? false, }; diff --git a/packages/ai/src/providers/openrouter.models.ts b/packages/ai/src/providers/openrouter.models.ts index 434f5696..53326347 100644 --- a/packages/ai/src/providers/openrouter.models.ts +++ b/packages/ai/src/providers/openrouter.models.ts @@ -909,7 +909,7 @@ export const OPENROUTER_MODELS = { cacheRead: 0.2, cacheWrite: 0.375, }, - contextWindow: 131072, + contextWindow: 65536, maxTokens: 32768, } satisfies Model<"openai-completions">, "google/gemini-3.1-flash-lite": { @@ -1108,7 +1108,7 @@ export const OPENROUTER_MODELS = { cacheWrite: 0, }, contextWindow: 262144, - maxTokens: 32768, + maxTokens: 8192, } satisfies Model<"openai-completions">, "ibm-granite/granite-4.1-8b": { id: "ibm-granite/granite-4.1-8b", @@ -1216,8 +1216,8 @@ export const OPENROUTER_MODELS = { cacheRead: 0.06, cacheWrite: 0, }, - contextWindow: 262144, - maxTokens: 144000, + contextWindow: 256000, + maxTokens: 80000, } satisfies Model<"openai-completions">, "liquid/lfm-2.5-1.2b-thinking:free": { id: "liquid/lfm-2.5-1.2b-thinking:free", @@ -1451,7 +1451,7 @@ export const OPENROUTER_MODELS = { cacheWrite: 0, }, contextWindow: 1048576, - maxTokens: 4096, + maxTokens: 512000, } satisfies Model<"openai-completions">, "mistralai/codestral-2508": { id: "mistralai/codestral-2508", @@ -1807,7 +1807,7 @@ export const OPENROUTER_MODELS = { cost: { input: 0.6, output: 2.5, - cacheRead: 0.6, + cacheRead: 0, cacheWrite: 0, }, contextWindow: 262144, @@ -2189,7 +2189,7 @@ export const OPENROUTER_MODELS = { cacheWrite: 0, }, contextWindow: 1047576, - maxTokens: 4096, + maxTokens: 32768, } satisfies Model<"openai-completions">, "openai/gpt-4.1-nano": { id: "openai/gpt-4.1-nano", @@ -2221,7 +2221,7 @@ export const OPENROUTER_MODELS = { cost: { input: 2.5, output: 10, - cacheRead: 1.25, + cacheRead: 0, cacheWrite: 0, }, contextWindow: 128000, @@ -2365,11 +2365,11 @@ export const OPENROUTER_MODELS = { cost: { input: 0.25, output: 2, - cacheRead: 0.03, + cacheRead: 0.025, cacheWrite: 0, }, contextWindow: 400000, - maxTokens: 4096, + maxTokens: 128000, } satisfies Model<"openai-completions">, "openai/gpt-5-nano": { id: "openai/gpt-5-nano", @@ -2437,11 +2437,11 @@ export const OPENROUTER_MODELS = { cost: { input: 1.25, output: 10, - cacheRead: 0.125, + cacheRead: 0.13, cacheWrite: 0, }, contextWindow: 128000, - maxTokens: 16384, + maxTokens: 32000, } satisfies Model<"openai-completions">, "openai/gpt-5.1-codex": { id: "openai/gpt-5.1-codex", @@ -2533,7 +2533,7 @@ export const OPENROUTER_MODELS = { cacheWrite: 0, }, contextWindow: 128000, - maxTokens: 32000, + maxTokens: 16384, } satisfies Model<"openai-completions">, "openai/gpt-5.2-codex": { id: "openai/gpt-5.2-codex", @@ -3799,11 +3799,11 @@ export const OPENROUTER_MODELS = { cost: { input: 0.14, output: 1, - cacheRead: 0.05, + cacheRead: 0, cacheWrite: 0, }, contextWindow: 262144, - maxTokens: 81920, + maxTokens: 262144, } satisfies Model<"openai-completions">, "qwen/qwen3.5-397b-a17b": { id: "qwen/qwen3.5-397b-a17b", @@ -3838,8 +3838,8 @@ export const OPENROUTER_MODELS = { cacheRead: 0, cacheWrite: 0, }, - contextWindow: 256000, - maxTokens: 32768, + contextWindow: 262144, + maxTokens: 262144, } satisfies Model<"openai-completions">, "qwen/qwen3.5-flash-02-23": { id: "qwen/qwen3.5-flash-02-23", @@ -4429,11 +4429,11 @@ export const OPENROUTER_MODELS = { cost: { input: 0.98, output: 3.08, - cacheRead: 0.182, + cacheRead: 0.49, cacheWrite: 0, }, contextWindow: 202752, - maxTokens: 4096, + maxTokens: 65535, } satisfies Model<"openai-completions">, "z-ai/glm-5.2": { id: "z-ai/glm-5.2", diff --git a/packages/ai/test/fireworks-models.test.ts b/packages/ai/test/fireworks-models.test.ts index 6980f318..a0c9c915 100644 --- a/packages/ai/test/fireworks-models.test.ts +++ b/packages/ai/test/fireworks-models.test.ts @@ -79,7 +79,16 @@ const tool: Tool = { parameters: Type.Object({ value: Type.String() }), }; -function createFireworksModel(compat?: Model<"anthropic-messages">["compat"]): Model<"anthropic-messages"> { +const FIREWORKS_ANTHROPIC_COMPAT = { + sendSessionAffinityHeaders: true, + supportsEagerToolInputStreaming: false, + supportsCacheControlOnTools: false, + supportsLongCacheRetention: false, +} satisfies NonNullable["compat"]>; + +function createFireworksModel( + compat: Model<"anthropic-messages">["compat"] = FIREWORKS_ANTHROPIC_COMPAT, +): Model<"anthropic-messages"> { return { id: "accounts/fireworks/models/kimi-k2p6", name: "Kimi K2.6",