From 920fe168deb2887c7016dbcd797dc4fda1a7a4ac Mon Sep 17 00:00:00 2001 From: Charles-Henri ROBICHE Date: Thu, 29 Jan 2026 00:01:57 +0100 Subject: [PATCH] fix(litellm): use anthropic-messages API for Claude models - Set api: 'anthropic-messages' for claude-* models through LiteLLM - Add LiteLLM to resolveCacheControlTtl for cache parameter passthrough - Enables proper Anthropic cache control headers for cost savings This fixes the missing cache support by ensuring: 1. Claude models use the correct API format (anthropic-messages) 2. Cache control TTL is resolved and passed through for LiteLLM --- src/agents/litellm-models.ts | 5 +++++ src/agents/pi-embedded-runner/extra-params.ts | 2 ++ 2 files changed, 7 insertions(+) diff --git a/src/agents/litellm-models.ts b/src/agents/litellm-models.ts index fd45bd938..62a9e13ef 100644 --- a/src/agents/litellm-models.ts +++ b/src/agents/litellm-models.ts @@ -22,9 +22,14 @@ export type LitellmModelEntry = { }; export function buildLitellmModelDefinition(entry: LitellmModelEntry): ModelDefinitionConfig { + // Detect Claude models and use Anthropic Messages API for proper cache control support + const isClaude = entry.id.toLowerCase().startsWith("claude-"); + return { id: entry.id, name: entry.name, + // Claude models through LiteLLM should use anthropic-messages API for cache control + ...(isClaude ? { api: "anthropic-messages" as const } : {}), reasoning: entry.reasoning ?? false, input: entry.input ? [...entry.input] : ["text"], cost: LITELLM_DEFAULT_COST, diff --git a/src/agents/pi-embedded-runner/extra-params.ts b/src/agents/pi-embedded-runner/extra-params.ts index c23a0438f..083540286 100644 --- a/src/agents/pi-embedded-runner/extra-params.ts +++ b/src/agents/pi-embedded-runner/extra-params.ts @@ -32,6 +32,8 @@ function resolveCacheControlTtl( if (raw !== "5m" && raw !== "1h") return undefined; if (provider === "anthropic") return raw; if (provider === "openrouter" && modelId.startsWith("anthropic/")) return raw; + // LiteLLM proxying to Anthropic models (claude-*) + if (provider === "litellm" && modelId.startsWith("claude-")) return raw; return undefined; }