Skip to content

fix(model_prices): verified registry audit, Databricks Sep-2026 catalog, realtime image pricing, deprecation dates - #39388

Merged
mateo-berri merged 30 commits into
litellm_internal_stagingfrom
litellm_registry_audit_2026_09_02
Sep 4, 2026
Merged

fix(model_prices): verified registry audit, Databricks Sep-2026 catalog, realtime image pricing, deprecation dates#39388
mateo-berri merged 30 commits into
litellm_internal_stagingfrom
litellm_registry_audit_2026_09_02

Conversation

@devin-ai-integration

@devin-ai-integration devin-ai-integration Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

TLDR

Problem this solves:

  • Newer OpenAI, Anthropic, Gemini, Databricks, OpenRouter and other models had no registry entry
  • Existing entries carried wrong prices, limits, modes or retirement dates
  • Open registry PRs needed a single place to land

How it solves it:

User Flow

Before: a proxy admin who added azure_ai/Codestral-2501 and azure/us/gpt-4.1-nano-2025-04-14 to their config sees $0 spend for one and a retirement date a year too early for the other

  1. They send GET https://litellm-domain/model/info with their master key
  2. The codestral-2501 row comes back with input_cost_per_token: 0 and max_input_tokens: null, so every request to it is logged at $0 spend
  3. They send GET https://litellm-domain/model/deprecations and the gpt-4.1-nano-azure-us row says deprecation_date: 2026-10-14, a year before the date Azure publishes

After: the same calls return Azure's list price and retirement schedule

  1. They send GET https://litellm-domain/model/info with their master key
  2. The codestral-2501 row comes back with input_cost_per_token: 3e-07, output_cost_per_token: 9e-07 and max_input_tokens: 256000, matching the Azure Mistral pricing page and Retail Prices API
  3. They send GET https://litellm-domain/model/deprecations and the gpt-4.1-nano-azure-us row says deprecation_date: 2027-04-14, matching the Foundry retirement schedule

Relevant issues

Rolling registry PR for the 2026-09-02, 2026-09-03 (two runs) and 2026-09-04 (three runs) audits. Continues #39170 (merged). Deprecation dates use the deprecation_date field shipped for #26900

Linear ticket

Changes by provider

Every value below was read from the raw HTML or JSON of the linked official page. Root and backup maps are identical (ci_cd/check_files_match.py passes) and the schema is unchanged.

Azure Foundry (2026-09-03 run)

Sources: https://learn.microsoft.com/en-us/azure/foundry/openai/concepts/model-retirement-schedule (raw HTML table rows), https://learn.microsoft.com/en-us/azure/foundry/foundry-models/concepts/models-sold-directly-by-azure, https://prices.azure.com/api/retail/prices (official Retail Prices API, serviceName eq 'Foundry Models'), https://azure.microsoft.com/en-us/pricing/details/ai-foundry-models/mistral/, https://azure.microsoft.com/en-us/pricing/details/ai-foundry-models/fireworks/

  • azure/us/gpt-4.1-nano-2025-04-14: deprecation_date 2026-10-14 -> 2027-04-14. The schedule row for gpt-4.1-nano version 2025-04-14 reads "Model retirement 2027-04-14, deployment retirement 2027-10-14"; the old value matched neither
  • azure_ai/claude-fable-5-1: added deprecation_date: 2027-12-05, the schedule row for claude-fable-5-1. Before this the proxy fell back to Anthropic's own 2027-09-01 date from the bare claude-fable-5-1 entry
  • Added azure_ai/Codestral-2501: $0.30 / $0.90 per 1M (Retail Prices Codestral Inp glbl 0.0003 per 1K and Codestral Outp glbl 0.0009 per 1K), 256K context and 4,096 output per the Foundry catalog page, chat mode, text only. The schedule lists it as GA with no retirement date, so none is recorded
  • Added azure_ai/FW-Nemotron-Lightning-3.5-30B-A3B: $0.06 / $0.22 per 1M with $0.01 cached input (Retail Prices FW NVIDIA Nemotron 3.5 LN In/Opt/Cd In DZ meters, the only meters Azure publishes for it), 262,144 context and text-only modalities per the catalog page, reasoning and tool calling on
  • Added azure_ai/MAI-Thinking-1: $2 / $8 per 1M with $0.20 cached input (Retail Prices MAI-Thinking-1 Inp/Opt/Cd Inp glbl 1M Tokens), 256,000 context, 64,000 output, text only, tool calling and reasoning content, per the models-sold-directly-by-Azure page
  • Added azure_ai/mistral-ocr-4-0: $4 per 1K pages OCR and $5 per 1K pages annotation (Retail Prices OCR 4 glbl Pages and OCR 4 annot glbl Pages), same shape as the existing mistral/mistral-ocr-4-0 entry

Databricks (2026-09-04 run; https://www.databricks.com/product/pricing/foundation-model-serving and https://www.databricks.com/product/pricing/proprietary-foundation-model-serving for DBU rates, https://docs.databricks.com/aws/en/machine-learning/foundation-model-apis/supported-models for endpoint names, input modalities, the limits it prints and the Responses API notes, the vendors' own model pages for limits Databricks does not print (https://developers.openai.com/api/docs/models/gpt-5.6-sol, gpt-5.6-terra, gpt-5.6-luna, gpt-5.5, gpt-5.5-pro, gpt-5.4; https://ai.google.dev/gemini-api/docs/models/gemini-3.8-flash and the other Gemini 3.x Flash, Flash Lite and Image pages), https://docs.databricks.com/aws/en/machine-learning/model-serving/function-calling and https://docs.databricks.com/aws/en/machine-learning/model-serving/query-reason-models for tool and reasoning support, https://docs.databricks.com/aws/en/machine-learning/retired-models-policy for retirement dates; all read from browser-rendered raw HTML because the pricing pages sit behind a JavaScript challenge)

  • Added 19 entries the catalog lists and the registry lacked: databricks/databricks-claude-fable-5-1, gpt-5-6-sol, gpt-5-6-terra, gpt-5-6-luna, gpt-5-5, gpt-5-5-pro, gemini-3-8-flash, gemini-3-7-flash, gemini-3-6-flash, gemini-3-5-flash, gemini-3-5-flash-lite, gemini-3-1-flash-image, gemini-3-pro-image, glm-5-3, grok-4-6, inkling, qwen35-122b-a10b, qwen3-next-80b-a3b-instruct, qwen3-embedding-0-6b. Dollar prices are the published Global DBU per 1M rates times $0.070, the same convention and *_dbu_cost_per_token reference fields the existing Databricks entries use. Input modalities come from the supported-models page, and limits from the same page where it prints them (Inkling 1,000,000 in, Grok 4.6 500,000 in text only, Qwen3.5 122B 256K in / 25K out, GLM-5.3 1,048,576 in / 65,536 out) or from the vendor's model page otherwise (GPT-5.5, 5.5 Pro and the three GPT-5.6 rows: OpenAI prints a 1,050,000 context and 128,000 max output, stored as 922,000 in / 128,000 out like the direct gpt-5.6-sol entry; Gemini 3.x Flash rows 1,048,576 in / 65,536 out; Gemini 3.1 Flash Image 131,072 in / 32,768 out; Gemini 3 Pro Image 65,536 in / 32,768 out). gpt-5-5 and gpt-5-5-pro carry mode: responses because the Databricks page says "Use the Responses API to interact with this model". supports_reasoning and supports_function_calling are set only where the reasoning and function-calling pages list the model
  • databricks/databricks-glm-5-3-flash: now priced at 2.143 / 7.143 DBU per 1M with 0.429 cached input (the pricing page publishes the row this run; the entry previously said rates were not published), plus the 1,048,576 context, image input and reasoning flags from the supported-models table
  • databricks/databricks-gpt-5-4: max_input_tokens 272,000 -> 922,000 (OpenAI's GPT-5.4 page prints a 1,050,000 context and 128,000 max output; Databricks prints no limit), and supports_vision, supports_reasoning, supports_function_calling, supports_tool_choice and the text+image modalities that were missing. gpt-5-4-mini and gpt-5-4-nano get the same flags; gpt-5, gpt-5-1, gpt-5-2, gpt-5-3-codex, gpt-5-mini and gpt-5-nano get supports_function_calling and supports_tool_choice, all listed on the function-calling page. gpt-5-3-codex also moves from mode: chat to mode: responses, the same "Use the Responses API" note the supported-models page puts on GPT-5.5
  • databricks/databricks-claude-fable-5-1: prompt_cache_min_tokens: 512, the minimum Anthropic publishes for Fable 5.1 at https://platform.claude.com/docs/en/build-with-claude/prompt-caching; the cost-map-wide Fable 5 test requires it on every variant
  • Retirement dates from the retired-models page, recorded as deprecation_date: claude-3-7-sonnet 2026-04-12, claude-sonnet-4 2026-10-09, gemini-2-5-flash 2026-10-02, gpt-5-1-codex-max, gpt-5-1-codex-mini and gpt-5-2-codex 2026-07-16, meta-llama-3-1-405b-instruct 2026-02-15, mixtral-8x7b-instruct 2025-04-30, llama-2-70b-chat 2024-10-30, mpt-30b-instruct and mpt-7b-instruct 2024-08-30, meta-llama-3-70b-instruct 2024-07-23. No other Databricks entry got a date because the page lists no other retirement
  • Cache rates where the pricing page prints n/a: the registry follows the convention already on the base branch for glm-5-2 and every GPT row, cache write equal to the input rate (no surcharge) and cache read equal to the input rate (no discount) when the column is n/a. Rows with a published cached-input rate (GLM-5.3 3.714, GLM-5.3 Flash 0.429, Inkling 2.429) carry that rate. test_every_priced_databricks_model_declares_cache_rates on the base branch requires both fields on every priced Databricks entry, so omitting them was not an option without changing that guarantee
  • gemini-3-8-flash, gemini-3-1-flash-image and gemini-3-pro-image carry limits and modalities but no price, with a metadata.notes saying the DBU rate is not published yet, the same shape glm-5-3-flash had on the base branch until its rate appeared. See Caveats

Azure OpenAI realtime (https://learn.microsoft.com/en-us/azure/foundry/foundry-models/concepts/models-sold-directly-by-azure for the model rows, https://learn.microsoft.com/en-us/azure/foundry/openai/concepts/model-retirement-schedule for retirement dates, https://developers.openai.com/api/docs/pricing for the per-token rates Azure charges at OpenAI parity; raw HTML)

  • Added azure/gpt-realtime-2, azure/gpt-realtime-2.1 and azure/gpt-realtime-2.1-mini in mode: realtime with the OpenAI rates ($4 / $24 text, $32 / $64 audio, $5 image, $0.40 cached for the two full models; $0.60 / $2.40 text, $10 / $20 audio, $0.80 image, $0.06 cached for mini), the 32,000 input and 4,096 output limits the Azure catalog rows print, /v1/realtime as the only endpoint, text, image and audio input, text and audio output, function calling on
  • deprecation_date: azure/gpt-realtime-2 2026-08-31 (already retired on the schedule), azure/gpt-realtime-2.1 and azure/gpt-realtime-2.1-mini 2027-06-25, the retirement dates the schedule rows print

OpenAI realtime (https://developers.openai.com/api/docs/pricing, https://developers.openai.com/api/docs/models/gpt-realtime-2, https://developers.openai.com/api/docs/models/gpt-realtime-2.1, https://developers.openai.com/api/docs/models/gpt-realtime-2.1-mini; raw HTML)

  • Every realtime entry with an image rate (gpt-realtime, gpt-realtime-2025-08-28, gpt-realtime-1.5, gpt-realtime-2, gpt-realtime-2.1, gpt-realtime-2.1-mini, gpt-realtime-mini-2025-10-06, gpt-realtime-mini-2025-12-15 and the Azure twins azure/gpt-realtime-2025-08-28, azure/gpt-realtime-1.5-2026-02-23, azure/gpt-realtime-mini, azure/gpt-realtime-mini-2025-10-06) moves its image rate from input_cost_per_image to input_cost_per_image_token. OpenAI prices realtime image input per 1M tokens ($5.00 and $0.80 per 1M on the pricing page) and the API reports input_token_details.image_tokens; input_cost_per_image is the per-image field the calculator multiplies by image_count, so those tokens were being charged at the text rate. Verified with a real call in the proof section (194 image tokens billed at $0.80 per 1M instead of $0.60) and pinned by test_realtime_image_tokens_priced_per_token
  • gpt-realtime-2, gpt-realtime-2.1 and gpt-realtime-2.1-mini limits (128,000 in / 32,000 out) and prices were checked against the model pages and match, no change

Vertex AI (https://cloud.google.com/gemini-enterprise-agent-platform/models/partner-models/claude/use-claude, raw HTML)

  • vertex_ai/claude-fable-5-1 and vertex_ai/claude-fable-5-1@default: added deprecation_date: 2027-03-01. The Vertex page says "Retirement date: No sooner than March 1, 2027". Neither entry had a date, so the proxy was reporting Anthropic's direct-API date instead. All other Vertex Claude dates already match the page

Novita (https://developers.openai.com/api/docs/models/gpt-oss-120b, https://developers.openai.com/api/docs/models/gpt-oss-20b)

  • novita/openai/gpt-oss-120b and novita/openai/gpt-oss-20b: supports_vision true -> false. OpenAI's model pages list text as the only input modality for both open-weight models; the hosting provider cannot add image input

OpenAI (https://developers.openai.com/api/docs/pricing, https://developers.openai.com/api/docs/models)

  • Added gpt-daybreak-blue-latest and gpt-daybreak-red-latest, the model ids OpenAI now documents for the Daybreak aliases. They point at gpt-5.6-sol / gpt-5.6-cyber, are Responses-only per the model pages (Chat Completions is struck through in the raw endpoint list, the same way it is on gpt-5.5-pro), so they use mode: responses like the other Responses-only OpenAI entries and completion() bridges them to /v1/responses. They carry the same prices as those snapshots. The older bare daybreak-*-latest aliases are kept and only their source is repointed at the pages that exist
  • gpt-5.5 and gpt-5.5-2026-04-23: Fast (priority) tier corrected to $12.50 / $75 per 1M with $1.25 cached input, per the Fast mode row on the pricing page (was $10 / $60 / $1). tests/test_litellm/proxy/spend_tracking/test_savings.py hard-coded the old 2x priority ratio for gpt-5.5, so its expected multiplier is now the published 2.5x
  • gpt-image-2, gpt-image-2-2026-04-21, azure/gpt-image-2 and azure/gpt-image-2-2026-04-21: removed output_cost_per_token: 1e-05. The pricing page's GPT Image 2 row has text input $5, cached text $1.25, image input $8, cached image $2 and image output $30 per 1M, and no text output price at all. With the $10 field present, completion_cost() for a usage that reports only completion_tokens (the shape the chat and /spend/calculate paths produce) billed the generated image at $10 per 1M instead of the published $30, since the calculator only falls back to output_cost_per_image_token when the text output price is absent (generic_cost_per_token in litellm_core_utils/llm_cost_calc/utils.py). Usages with an output_tokens_details.image_tokens breakdown, like the live /v1/images/generations response, already used $30 and are unchanged. tests/test_litellm/test_gpt_image_cost_calculator.py now pins the image rate for both usage shapes, and tests/test_litellm/test_utils.py expects get_model_info to report output_cost_per_token: 0 for the two entries

Anthropic (https://platform.claude.com/docs/en/models/mythos-5-1/overview, https://platform.claude.com/docs/en/about-claude/pricing)

  • Added claude-mythos-5-1 with the documented prices, 1M context, 128K output and the capability flags listed on the overview page

Nebius Token Factory (https://tokenfactory.nebius.com/api/public/models_info, catalog pages linked per entry)

  • Added 27 catalog models with no registry entry: DeepSeek V4 Flash / Flash-0731 / Pro, MiniMax M2.5 / M3, Kimi K2.6 / K2.7-Code / K3, Hermes 4 70B / 405B, seven NVIDIA Nemotron and Cosmos models, gpt-oss-120b, MiniCPM-V-4.5, Qwen3 235B / 30B 2507, Qwen3-Next 80B Thinking, Qwen3.5 397B, Qwen3-Embedding-8B, GLM 5.1 / 5.2 / 5.3-Flash. Prices and max_model_len come from the public models_info endpoint; supports_reasoning, supports_function_calling and supports_vision are set only where the catalog lists that use case
  • Corrected nebius/google/gemma-3-27b-it ($0.10 / $0.30, 110K), nebius/Qwen/Qwen3-32B (40,960 context) and nebius/Qwen/Qwen2.5-VL-72B-Instruct ($0.25 / $0.75, 32K), and moved their source off the retired nebius.com/prices page

IBM watsonx (https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-models.html?context=wx, cross-checked with https://www.ibm.com/products/watsonx-ai/pricing)

  • watsonx/bigscience/mt0-xxl-13b: $0.001908 per 1K tokens both ways (was 0.0005 / 0.002 per token, a 1K to 1 unit slip), context 4,096; also added watsonx/bigscience/mt0-xxl, the id IBM actually documents
  • watsonx/ibm/granite-4-h-small $0.0636 / $0.265 per 1M and 131,072 context, watsonx/openai/gpt-oss-120b $0.159 / $0.636 and 131,072, watsonx/meta-llama/llama-3-3-70b-instruct $0.7526 both ways and 131,072, watsonx/mistralai/mistral-small-3-1-24b-instruct-2503 $0.106 / $0.318 and 131,072, watsonx/meta-llama/llama-4-maverick-17b $0.371 / $1.484 and 131,072
  • Added watsonx/meta-llama/llama-4-maverick-17b-128e-instruct-fp8, the documented API id for Maverick
  • max_output_tokens (and max_tokens, which test_max_tokens_consistency requires to match) follows IBM's model detail pages: the Maverick rows cap new tokens at 8,192 and Mistral Small 3.1 at 16,384, while granite-4-h-small, gpt-oss-120b and llama-3-3-70b-instruct publish only the 131,072 combined window, so output is bounded by that

W&B Inference (https://wandb.ai/site/pricing/inference)

  • Five entries stored the per 1M price divided by 100 instead of by 1,000,000, so spend was 100,000x too high (for example $0.10 per 1M was stored as 0.01 per token): wandb/Qwen/Qwen3-235B-A22B-Instruct-2507, wandb/Qwen/Qwen3-235B-A22B-Thinking-2507, wandb/deepseek-ai/DeepSeek-R1-0528, wandb/deepseek-ai/DeepSeek-V3-0324, wandb/meta-llama/Llama-4-Scout-17B-16E-Instruct

Gemini API (https://ai.google.dev/gemini-api/docs/pricing, https://ai.google.dev/gemini-api/docs/models, raw HTML; 2026-09-03 second run)

  • Added gemini/lyria-3.5-clip-preview ($0.04 per song) and gemini/lyria-3.5-pro-preview ($0.08 per song), the two Lyria 3.5 rows on the pricing page, same shape as the existing Lyria 3 entries
  • gemini/lyria-3-pro-preview: added the missing output_cost_per_image: 0.08; the pricing page lists $0.08 per song and the entry recorded $0
  • gemini-2.5-flash-native-audio-latest, gemini-2.5-flash-native-audio-preview-09-2025, gemini-2.5-flash-native-audio-preview-12-2025, gemini-3.1-flash-live-preview and their gemini/ twins: mode chat -> realtime. Every one of them lists only /v1/realtime in supported_endpoints, so chat mode contradicted the endpoint list (from fix(pricing): add the Vertex AI Gemini Live GA models and correct the preview #36886)
  • gemini/gemini-3.5-live-translate-preview: mode chat -> realtime, plus max_input_tokens: 131072, max_output_tokens: 65536, max_tokens: 65536 and text added to supported_output_modalities. The model page (https://ai.google.dev/gemini-api/docs/models/gemini-3.5-live-translate-preview, raw HTML) lists Live API as its only supported surface, audio in, audio plus text transcript out, 131,072 / 65,536 token limits; the entry had /v1/realtime as its only endpoint but still said chat
  • Left as is: the 2.5 Flash Native Audio prices. The raw pricing table still reads $0.50 text / $3.00 audio input and $2.00 text / $12.00 audio output, which is what the registry has

Vertex AI Live (https://cloud.google.com/vertex-ai/generative-ai/pricing, https://cloud.google.com/vertex-ai/generative-ai/docs/live-api, raw HTML)

Mistral (https://docs.mistral.ai/inference/pricing, raw HTML)

  • mistral/ministral-14b-latest, mistral/ministral-14b-2512: added cache_read_input_token_cost: 2e-08 ($0.02 cached input per 1M)
  • mistral/ministral-3b-latest, mistral/ministral-3b-2512: added cache_read_input_token_cost: 1e-08 ($0.01 cached input per 1M)

Nebius Token Factory (https://tokenfactory.nebius.com/api/public/models_info)

  • nebius/meta-llama/Llama-3.3-70B-Instruct: limits 128,000 -> 131,072, the context_length the catalog API reports
  • nebius/moonshotai/Kimi-K3: limits 1,048,576 -> 1,024,000, the context_length the catalog API reports

Perplexity Agent API (https://docs.perplexity.ai/docs/agent-api/models, model list embedded as JSON in the raw page)

  • Added 29 perplexity/<vendor>/<model> Responses-mode entries the page lists and the registry lacked: anthropic/claude-fable-5, claude-opus-5, claude-opus-4-8, claude-sonnet-5, claude-sonnet-4-6; openai/gpt-5.6-sol, gpt-5.6-terra, gpt-5.6-luna, gpt-5.5, gpt-5.4, gpt-5.4-mini, gpt-5.4-nano, gpt-5; google/gemini-3.1-pro-preview, gemini-3.1-flash-lite, gemini-3.5-flash, gemini-3.5-flash-lite, gemini-3.6-flash, gemini-3.7-flash; xai/grok-4.6, grok-4.5, grok-4.3, grok-4.20-reasoning, grok-4.20-non-reasoning, grok-4.20-multi-agent; perplexity/glm-5.3, glm-5.3-flash, nemotron-3.5-lightning-30b-a3b, nemotron-3-ultra-550b-a55b. Each carries the page's input, output and cached-input prices, and the *_above_272k_tokens tier where the page publishes a long-context rate. They follow the perplexity/openai/gpt-5.2 naming already on the base branch
  • The 10 existing Agent API entries that had no price at all (perplexity/openai/gpt-5.2, gpt-5.1, gpt-5-mini, perplexity/anthropic/claude-opus-4-6, claude-opus-4-7, claude-opus-4-5, claude-sonnet-4-5, claude-haiku-4-5, perplexity/google/gemini-3-flash-preview, perplexity/perplexity/sonar) now carry the page's input, output and cached-input prices and a source
  • The new Anthropic rows carry the bare Anthropic entry's supports_adaptive_thinking (Fable 5 also thinking_always_on, Opus 5 also prompt_cache_min_tokens: 512), matching the perplexity/anthropic/claude-opus-4-7 row already on the base branch. The cost-map-wide tests in test_claude_fable_5_config.py, test_claude_opus_5_config.py and test_claude_sonnet_5_config.py require the flag on every variant
  • Not set: token limits. The Agent API page publishes prices only, and the existing entries carry none either

OpenRouter (https://openrouter.ai/api/v1/models, OpenRouter's own catalog API, cross-checked with the upstream provider entries already in the registry)

  • Added openrouter/minimax/minimax-m3 ($0.30 / $1.20 per 1M, $0.06 cached input, 1,048,576 context, 512,000 output, text, image and video input, tools, tool_choice, reasoning and structured outputs per supported_parameters) and openrouter/qwen/qwen3.7-plus ($0.32 / $1.28, $0.064 cache read, $0.40 cache write, 1,000,000 context, 131,072 output, text and image input), the two catalog models that have no upstream entry in the registry, straight from the catalog API's pricing, context_length, top_provider.max_completion_tokens, modalities and supported_parameters
  • Added 27 entries for first-party models OpenRouter now routes and the registry lacked: openrouter/anthropic/claude-fable-5, claude-fable-5.1, claude-opus-4.8, claude-sonnet-5; openrouter/google/gemini-2.5-flash-lite, gemini-3.5-flash, gemini-3.5-flash-lite, gemini-3.6-flash, gemini-3.7-flash, gemini-3.8-flash; openrouter/openai/gpt-4o-mini, gpt-5.1, gpt-5.3-codex, gpt-5.4, gpt-5.4-mini, gpt-5.4-nano, gpt-5.5, gpt-5.6-luna, gpt-5.6-terra, o3, o4-mini; openrouter/x-ai/grok-4.20, grok-4.20-multi-agent, grok-4.3, grok-4.5, grok-4.6, grok-build-0.1. Prices are the catalog API's prompt, completion and input_cache_read values, which for these first-party models equal the upstream provider list price already in the registry. Token limits are copied from the matching upstream entry (for example openrouter/openai/gpt-5.5 uses gpt-5.5's 1,050,000 / 128,000), not from OpenRouter's rounded context figure. Capability flags come from the API's supported_parameters and modalities. The four Anthropic entries also carry the bare entry's supports_adaptive_thinking: true and supports_sampling_params: false (Fable also thinking_always_on and prompt_cache_min_tokens: 512), which the Fable, Opus 4.8 and Sonnet 5 cost-map sweep tests require on every variant so LiteLLM never sends the legacy thinking shape or rejected sampling params to those models
  • Corrected prices on 36 existing entries where the catalog API differs from the registry: deepseek/deepseek-chat, deepseek-chat-v3-0324, deepseek-r1, deepseek-v3.2, deepseek-v3.2-exp; gryphe/mythomax-l2-13b; mancer/weaver; minimax/minimax-m2.1, minimax-m2.5; mistralai/devstral-2512, mistral-large, mistral-small-3.1-24b-instruct, mistral-small-3.2-24b-instruct, mixtral-8x22b-instruct; moonshotai/kimi-k2.5; nvidia/nemotron-3.5-lightning; openai/gpt-3.5-turbo, gpt-oss-120b, gpt-oss-20b; qwen/qwen-2.5-coder-32b-instruct, qwen3-235b-a22b-2507, qwen3-235b-a22b-thinking-2507, qwen3-coder, qwen3-coder-plus, qwen3.5-122b-a10b, qwen3.5-27b, qwen3.5-397b-a17b, qwen3.5-flash-02-23, qwen3.5-plus-02-15; undi95/remm-slerp-l2-13b; xiaomi/mimo-v2.5, mimo-v2.5-pro; z-ai/glm-4.6, glm-4.7-flash, glm-5, glm-5.1. Several were off by a large factor (for example gpt-oss-120b $0.05 -> $0.037 in, $0.25 -> $0.17 out; qwen3.5-plus-02-15 $0.40 -> $0.26 in). Cached-input prices were added where the API publishes input_cache_read
  • Limits fixed to the upstream provider's published values on 8 entries: anthropic/claude-opus-4.5 output 32,000 -> 64,000; anthropic/claude-sonnet-4.5 1,000,000 / 1,000,000 -> 200,000 / 64,000; anthropic/claude-haiku-4.5 output 200,000 -> 64,000; google/gemini-2.5-flash and gemini-2.5-pro output 8,192 -> 65,535; openai/gpt-4o output 4,096 -> 16,384; openai/o3-mini and o3-mini-high 128,000 / 65,536 -> 200,000 / 100,000. Each of these was internally inconsistent with the upstream entry it proxies
  • Added 131 more catalog models with no registry entry, all from the same catalog API in one pass: the Gemma 2 / 3 / 4 and Gemini image rows, the Llama 3.x / 4 rows, DeepSeek V4 Flash and V3.1 Terminus, MiniMax 01 / M1 / M2.7 / M3 free tiers, nine Mistral rows, six Moonshot Kimi rows, the NVIDIA Nemotron 3 and 3.5 rows, 14 OpenAI rows OpenRouter routes that had no proxy entry (GPT-4 Turbo, the 4o snapshots, GPT-5 Pro, the 5.1 Codex pair, 5.4 Pro, 5.5 Pro, GPT-6 Astra, gpt-audio, o1-pro, o3-pro, o4-mini-high, gpt-oss-safeguard-20b), the Poolside Laguna rows, 38 Qwen rows and 10 Z.ai GLM rows. Prices are the API's prompt, completion, input_cache_read and input_cache_write values, plus the audio and image output rates where it publishes them; limits are context_length and top_provider.max_completion_tokens; capability flags come only from the row's own supported_parameters and architecture.input_modalities, with supports_pdf_input set where the row lists the file input modality. Skipped from the same pass: openai/gpt-3.5-turbo-0613 (retired upstream), the openai/gpt-5-image*, gpt-5.4-image-2, gpt-5.6-luna-pro, gpt-5.6-sol, gpt-5.6-sol-pro, gpt-5.6-terra-pro, gpt-6-astra-pro and gpt-chat-latest rows, and the two google/lyria-3-* rows, none of which LiteLLM's OpenRouter path can serve as a chat entry
  • tests/test_litellm/litellm_core_utils/test_get_model_cost_map.py gains a regression test pinning ten of the corrected prices and a stale-value guard (from fix(catalog): align openrouter prices with live openrouter.ai rates #39591, values re-derived from the live API); tests/test_litellm/test_utils.py updates the Kimi K2.5 expectations to the corrected $0.45 / $2.25 / $0.07

AWS Bedrock (https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonBedrock/current/us-west-2/index.json, the official AWS Price List JSON; https://aws.amazon.com/bedrock/pricing/ Standard tier Qwen3 table; https://docs.aws.amazon.com/bedrock/latest/userguide/model-card-qwen-qwen3-coder-480b-a35b-instruct.html)

  • qwen.qwen3-coder-480b-a35b-v1:0: input_cost_per_token 2.2e-07 -> 4.5e-07. The us-west-2 offer SKU USW2-Qwen3Coder-480B-A35B-input-tokens (feature On-demand Inference, effective 2026-08-01) is $0.00045 per 1K, and the pricing page's Standard tier Qwen3 row resolves to the same $0.45 / $1.80 per 1M in us-west-2 and us-east-2. The output price ($1.80) already matched. source points at the us-west-2 offer file because the us-east-1 offer only lists the Mantle SKUs for this model and the Runtime id returns The provided model identifier is invalid in us-east-1, even though the model card lists that region
  • Checked and left as is: the Runtime ids for DeepSeek V3.1, Qwen3 Coder 30B A3B and Nova Reel are present with matching prices. The Bedrock Mantle ids on the model cards are not added because AWS publishes their prices per region and tier and the registry's Mantle convention was not confirmed this run

Fireworks AI (https://docs.fireworks.ai/serverless/pricing, raw HTML; the model detail response from https://api.fireworks.ai/v1/accounts/fireworks/models/deepseek-v4-flash-vision-exp)

  • Added fireworks_ai/accounts/fireworks/models/deepseek-v4-flash-vision-exp and the short fireworks_ai/deepseek-v4-flash-vision-exp alias, matching the two-key shape the other Fireworks entries use. The serverless pricing row reads $0.22 / $0.007 / $0.66 per 1M, so $2.2e-07 input, $7e-09 cache read and $6.6e-07 output, with the 1,048,576 context and image input the model detail response reports, plus tool calling and tool choice. No max_output_tokens, because neither surface publishes one, and no supports_reasoning, because neither states it even though the live response returns reasoning_content

Baseten (https://www.baseten.co/pricing/, https://docs.baseten.co/inference/model-apis/overview, https://docs.baseten.co/inference/model-apis/vision)

  • Added baseten/zai-org/GLM-5.3: $1.40 / $4.40 per 1M with $0.14 cached input, 1,048,576 context and 262,144 output per the Model APIs overview, tool calling, prompt caching and response schema on. supports_vision: true with text, image input modalities: the overview's feature-support table ticks Vision for GLM 5.3 and the vision page lists zai-org/GLM-5.3 under supported models with image_url input (images only, no video_url). tests/test_litellm/test_baseten_glm_5_3_model_metadata.py covers the entry (from fix(pricing): add baseten/zai-org/GLM-5.3 to the model pricing registry #39603). supports_reasoning is deliberately absent because the Baseten chat path does not accept reasoning_effort

Absorbed from other open registry PRs

Field-level merge only: each source PR was diffed against its own merge base and only the fields it changed were re-verified and applied, so nothing newer on litellm_internal_staging is dropped

Left alone as code or behavior PRs that only incidentally touch the JSON, or as registry changes with no official source yet: #39610 (Bedrock cost calculation code), #39607 (GPT-6 Astra OpenAI and Azure transformation code), #39427 (Azure AI OCR implementation), #39414 (Vertex DeepSeek OCR cost code), #39395 (Meta realtime handler), #38165 (Dashscope types and utils), #37991 (Vertex implementation), #39115, #35617, #34609 (Bedrock strict-tools flags, not in Bedrock docs), #37972 (EmpirioLabs, no official pricing page), #36385 and #33930 (Bedrock Mantle limits and Gemma, not in Bedrock docs), #36279 and #36274 (Azure GPT-5.6 prices, no Azure meter yet), #35720 (ChatGPT models, no OpenAI pricing row), #36084 and #34494 (deletion-only), #35446 (Kimi K3 output limit, not on Fireworks page), #33765 (Azure GPT-5.5 snapshot deletions), #33920 (Anthropic web-search flags, behavior change), #33618 (Azure audio aliases, one remaining mode change is a behavior change), #34941 (MAI image cost calculator code), #34620 (WaveSpeed provider code), #36422 and #36416 (fallback_generalizations file layout, no model values), #39732, #37103 and #34623 (new provider code with their own catalog rows), #35737 (MiniMax image generation code), #36233 (Vertex Chirp 3 STT/TTS provider code), #29898 (Bedrock invoke output_format behavior), #30383 (router cost backfill code)

Checked and deliberately left unchanged

  • Vertex Claude retirement dates other than Fable 5.1, Azure Foundry retirement dates other than the two above, Gemini API shutdown dates, OpenAI deprecations and Anthropic model deprecations: all existing deprecation_date values match the raw pages
  • Azure mistral-document-ai-2512: registry has $3 per 1K pages, Retail Prices API shows $2 / $2.50 for OCR 2512 glbl Pages. Left as is because the catalog page it cites cannot be read without JavaScript, so the two official surfaces cannot be reconciled here
  • Together MiniMaxAI/MiniMax-M2.7 and Qwen/Qwen2.5-7B-Instruct-Turbo: both appear in https://api.together.xyz/v1/models with per-token prices, but neither is on https://docs.together.ai/docs/serverless-models and a live call to each returns Unable to access non-serverless model ... create and start a new dedicated endpoint. Dedicated endpoints bill per GPU-minute, so the catalog's per-token figures are not a serverless list price. The MiniMax entry was pulled back out and the existing Qwen2.5 7B Turbo entry keeps its flags with no price
  • Together Qwen/Qwen3.8-2.4T-A95B cached input: docs say $0.50, pricing page says $0.25; the registry matches the pricing page, so no change until Together agrees with itself
  • Gemini deep-research-* and antigravity-preview-*: billed at the underlying model's list rate, no per-model price to record
  • Gemini 3.8 Flash, DeepSeek V4, Perplexity Sonar and embeddings, Groq, Voyage, xAI, Mistral, Cohere: current entries match the official pages. Cohere command-a-plus-05-2026, rerank-v4.0-* and the Mistral additions were skipped because the pricing pages do not publish per-token prices for them yet
  • OpenRouter: only the entries listed above were rewritten, and only from OpenRouter's own catalog API. Entries whose API price matches the registry were left alone, and no capability flag was changed without the upstream provider's entry agreeing
  • Bedrock and Fireworks direct: no diff found beyond the Qwen3 Coder 480B input price above and the unabsorbed PRs
  • xAI: every language model price and limit matches https://docs.x.ai/developers/models. grok-4.20-multi-agent keeps supports_function_calling: false even though the catalog says true, because the API rejects client-side tools (02f7873). Video, TTS and STT rows are skipped, LiteLLM has no xAI path for them
  • Groq: all entries match https://console.groq.com/docs/models. minimaxai/minimax-m2.7 is "Contact Sales" pricing, so it is not added
  • OpenAI and Anthropic direct: prices, limits and deprecation dates match the raw pages on the 2026-09-04 pass too (the only change is the realtime image field move above). Anthropic prompt-cache minimums (512 for Fable 5.1 / Mythos 5.1 / Opus 5 / Fable 5 / Mythos 5, 2,048 for Mythos Preview and Opus 4.7, 4,096 for Opus 4.6 and 4.5, 1,024 for Opus 4.8, Sonnet 5 and Sonnet 4) match every entry
  • Gemini API and Vertex shutdown dates re-read on 2026-09-04 (Gemini 3.1 Flash Lite 2027-05-07, Flash Image previews 2026-06-25, 2.5 Flash Image 2026-10-02, embedding-001 2028-05-14, Imagen 4 2026-08-17, Veo 2026-06-30, Omni Flash preview 2026-09-30, Robotics ER 1.6 2026-08-31, 2.5 GA models with no date announced): every entry already matches
  • Databricks: no deprecation_date beyond the retired-models page, in particular none for gemini-2-5-pro or the Claude 4.x rows still listed as supported. The workspace used for the Databricks proof below has databricks-gpt-oss-20b provisioned and neither GPT-5 Responses endpoint, so the catalog itself was read from the pages, not from a live workspace

Pre-Submission checklist

  • I have added meaningful tests (test_realtime_image_tokens_priced_per_token fails on the merge base where image tokens bill at the text rate; the Databricks cost calculator tests pin the 19 new DBU rows)
  • The handful of test files covering my change pass locally: LITELLM_LOCAL_MODEL_COST_MAP=True uv run --no-sync pytest -q tests/test_litellm/test_model_prices_schema.py tests/test_litellm/test_model_cost_aliases.py tests/test_litellm/litellm_core_utils/test_get_model_cost_map.py tests/test_litellm/litellm_core_utils/llm_cost_calc/test_llm_cost_calc_utils.py tests/test_litellm/llms/databricks/ tests/test_litellm/llms/azure_ai/test_azure_ai_cost_calculator.py tests/test_litellm/llms/azure_ai/test_azure_ai_fw_models_metadata.py tests/test_litellm/llms/mistral/ocr/test_mistral_ocr_cost.py tests/test_litellm/proxy/spend_tracking/test_savings.py tests/test_litellm/test_baseten_glm_5_3_model_metadata.py tests/test_litellm/test_cost_calculator.py tests/test_litellm/test_daybreak_model_metadata.py tests/test_litellm/test_gpt_image_cost_calculator.py tests/test_litellm/test_utils.py (every test file this PR touches: 1,131 passed, 13 skipped at f5157a6, and the Baseten metadata test passes again at 50d6b26 with its new supports_vision and text, image assertions; at 1f0611a test_aaamodel_prices_and_context_window_json_is_valid failed because the OpenRouter Qwen rows introduced cache_*_input_token_cost_above_128k_tokens and _above_256k_tokens, which the last commit adds to that test's field list), python3 ci_cd/check_files_match.py (root and backup identical, 3,814 entries each), uv run --no-sync python ci_cd/generate_model_prices_schema.py (schema unchanged), make lint (exit 0 at 8e83d6d, 0c29f51, 1f0611a and 50d6b26), make check (PASS at f5157a6; 50d6b26 on top only changes two registry flags and the test that pins them)
  • My PR passes all required CI/CD checks. Known non-blocking failures on earlier tips: CircleCI local_testing_part1 / part2 fail on bedrock/cohere.command-r-plus-v1:0 with an AWS 404 for the us-west-2 invoke URL, identically on staging's own pipeline (jobs 2153247 and 2153213), and this PR does not touch that entry. The non-required osv-scan job fails on every open PR on a gitpython advisory in uv.lock, which this PR does not touch
  • My PR's scope is as isolated as possible; it only solves 1 specific problem
  • I have received a Greptile Confidence Score of at least 4/5

Delays in PR merge?

If you're seeing a delay in your PR being merged, ping the LiteLLM Team on Slack (#pr-review).

Screenshots / Proof of Fix

Two proxies, one from the merge base dd01abc on port 42131 (detached worktree, database litellm_qa_base) and one from the tip 50d6b26 on port 42132 (database litellm_qa_head), booted with LITELLM_LOCAL_MODEL_COST_MAP=True python litellm/proxy/proxy_cli.py --config qa_config.yaml --port $PORT --num_workers 2 --use_v2_migration_resolver. Same qa_config.yaml for both, master_key: sk-qa-1234, drop_params: true:

model_list:
  - model_name: gpt-realtime-2.1-mini
    litellm_params: {model: openai/gpt-realtime-2.1-mini, api_key: os.environ/OPENAI_API_KEY}
  - model_name: azure-realtime-2.1-mini
    litellm_params: {model: azure/gpt-realtime-2.1-mini, api_key: placeholder, api_base: https://placeholder.openai.azure.com}
  - model_name: azure-realtime-2
    litellm_params: {model: azure/gpt-realtime-2, api_key: placeholder, api_base: https://placeholder.openai.azure.com}
  - model_name: dbx-gpt-5.6-sol
    litellm_params: {model: databricks/databricks-gpt-5-6-sol, api_key: placeholder, api_base: https://placeholder.cloud.databricks.com/serving-endpoints}
  - model_name: dbx-gpt-5.3-codex
    litellm_params: {model: databricks/databricks-gpt-5-3-codex, api_key: placeholder, api_base: https://placeholder.cloud.databricks.com/serving-endpoints}
  - model_name: dbx-glm-5.3-flash
    litellm_params: {model: databricks/databricks-glm-5-3-flash, api_key: placeholder, api_base: https://placeholder.cloud.databricks.com/serving-endpoints}
  - model_name: dbx-qwen3.5-122b
    litellm_params: {model: databricks/databricks-qwen35-122b-a10b, api_key: placeholder, api_base: https://placeholder.cloud.databricks.com/serving-endpoints}
  - model_name: codestral-2501
    litellm_params: {model: azure_ai/Codestral-2501, api_key: placeholder, api_base: https://placeholder.services.ai.azure.com}
  - model_name: gpt-4.1-nano-azure-us
    litellm_params: {model: azure/us/gpt-4.1-nano-2025-04-14, api_key: placeholder, api_base: https://placeholder.openai.azure.com}
  - model_name: ministral-14b
    litellm_params: {model: mistral/ministral-14b-latest, api_key: os.environ/MISTRAL_API_KEY}
  - model_name: bedrock-qwen3-coder-480b
    litellm_params: {model: bedrock/qwen.qwen3-coder-480b-a35b-v1:0, aws_region_name: us-west-2}
  - model_name: gpt-image-2
    litellm_params: {model: openai/gpt-image-2, api_key: os.environ/OPENAI_API_KEY}
  - model_name: openrouter-minimax-m3
    litellm_params: {model: openrouter/minimax/minimax-m3, api_key: placeholder}
  - model_name: openrouter-minimax-m2.7
    litellm_params: {model: openrouter/minimax/minimax-m2.7, api_key: placeholder}
  - model_name: fw-dsv4-vision
    litellm_params: {model: fireworks_ai/accounts/fireworks/models/deepseek-v4-flash-vision-exp, api_key: os.environ/FIREWORKS_AI_API_KEY}
  - model_name: together-qwen2.5-7b
    litellm_params: {model: together_ai/Qwen/Qwen2.5-7B-Instruct-Turbo, api_key: placeholder}
  - model_name: baseten-glm-5.3
    litellm_params: {model: baseten/zai-org/GLM-5.3, api_key: placeholder}

The realtime case connects to ws://localhost:$PORT/v1/realtime?model=gpt-realtime-2.1-mini, sends one conversation.item.create with input_text "What color is this square? One word." plus a generated 64x64 solid blue PNG as input_image, then response.create with output_modalities: ["text"], and prints the response.done usage. The Fireworks case posts req_fw.json: the same question with a generated 64x64 solid red PNG as a base64 image_url and max_tokens: 16. Spend rows are read back through the proxy's own GET /spend/logs. The placeholder-key deployments are only read through /model/info, /model_group/info, /model/deprecations and /spend/calculate, which never call the provider

Before (dd01abc)

/model/info

  1. curl -s -H "Authorization: Bearer sk-qa-1234" localhost:42131/model/info | jq -r '.data[] | "\(.model_name)\tmode=\(.model_info.mode)\tinput=\(.model_info.input_cost_per_token)\toutput=\(.model_info.output_cost_per_token)\tcache_write=\(.model_info.cache_creation_input_token_cost)\tcache_read=\(.model_info.cache_read_input_token_cost)\timg_tok=\(.model_info.input_cost_per_image_token)\timg=\(.model_info.input_cost_per_image)\tmax_input=\(.model_info.max_input_tokens)\tmax_output=\(.model_info.max_output_tokens)\tvision=\(.model_info.supports_vision)"' | sort
  2. Observed:
azure-realtime-2	mode=null	input=0	output=0	cache_write=null	cache_read=4e-07	img_tok=null	img=null	max_input=null	max_output=null	vision=null
azure-realtime-2.1-mini	mode=null	input=0	output=0	cache_write=null	cache_read=6e-08	img_tok=null	img=null	max_input=null	max_output=null	vision=null
baseten-glm-5.3	mode=null	input=0	output=0	cache_write=null	cache_read=null	img_tok=null	img=null	max_input=null	max_output=null	vision=null
bedrock-qwen3-coder-480b	mode=chat	input=2.2e-07	output=1.8e-06	cache_write=null	cache_read=null	img_tok=null	img=null	max_input=262000	max_output=65536	vision=null
codestral-2501	mode=null	input=0	output=0	cache_write=null	cache_read=null	img_tok=null	img=null	max_input=null	max_output=null	vision=null
dbx-glm-5.3-flash	mode=chat	input=0	output=0	cache_write=null	cache_read=null	img_tok=null	img=null	max_input=1048576	max_output=131072	vision=true
dbx-gpt-5.3-codex	mode=chat	input=1.75e-06	output=1.4e-05	cache_write=1.75e-06	cache_read=1.75e-07	img_tok=null	img=null	max_input=272000	max_output=128000	vision=null
dbx-gpt-5.6-sol	mode=null	input=0	output=0	cache_write=null	cache_read=null	img_tok=null	img=null	max_input=null	max_output=null	vision=null
dbx-qwen3.5-122b	mode=null	input=0	output=0	cache_write=null	cache_read=null	img_tok=null	img=null	max_input=null	max_output=null	vision=null
fw-dsv4-vision	mode=null	input=0	output=0	cache_write=null	cache_read=null	img_tok=null	img=null	max_input=null	max_output=null	vision=null
gpt-4.1-nano-azure-us	mode=chat	input=1.1e-07	output=4.4e-07	cache_write=null	cache_read=2.5e-08	img_tok=null	img=null	max_input=1047576	max_output=32768	vision=true
gpt-image-2	mode=image_generation	input=5e-06	output=1e-05	cache_write=null	cache_read=1.25e-06	img_tok=8e-06	img=null	max_input=null	max_output=null	vision=true
gpt-realtime-2.1-mini	mode=realtime	input=6e-07	output=2.4e-06	cache_write=null	cache_read=6e-08	img_tok=null	img=8e-07	max_input=128000	max_output=32000	vision=null
ministral-14b	mode=chat	input=2e-07	output=2e-07	cache_write=null	cache_read=null	img_tok=null	img=null	max_input=262144	max_output=262144	vision=true
openrouter-minimax-m2.7	mode=null	input=0	output=0	cache_write=null	cache_read=null	img_tok=null	img=null	max_input=null	max_output=null	vision=null
openrouter-minimax-m3	mode=null	input=0	output=0	cache_write=null	cache_read=null	img_tok=null	img=null	max_input=null	max_output=null	vision=null
together-qwen2.5-7b	mode=chat	input=0	output=0	cache_write=null	cache_read=null	img_tok=null	img=null	max_input=null	max_output=null	vision=null

/model/deprecations

  1. curl -s -H "Authorization: Bearer sk-qa-1234" localhost:42131/model/deprecations | jq -c '{deprecated: [.deprecated[] | {model_name, deprecation_date}], upcoming: [.upcoming[] | {model_name, deprecation_date}]}'
  2. Observed:
{"deprecated":[],"upcoming":[{"model_name":"gpt-4.1-nano-azure-us","deprecation_date":"2026-10-14"}]}

Real OpenAI realtime call with an image, gpt-realtime-2.1-mini

  1. Run the WebSocket client described above against port 42131
  2. Observed response.done usage:
{"total_tokens": 260, "input_tokens": 194, "output_tokens": 66, "input_token_details": {"text_tokens": 0, "audio_tokens": 0, "image_tokens": 194, "cached_tokens": 189, "cached_tokens_details": {"text_tokens": 0, "audio_tokens": 0, "image_tokens": 189}}, "output_token_details": {"text_tokens": 66, "audio_tokens": 0, "reasoning_tokens": 61}}

Real Mistral call, ministral-14b

  1. curl -s -D - -H "Authorization: Bearer sk-qa-1234" -H 'Content-Type: application/json' localhost:42131/v1/chat/completions -d '{"model":"ministral-14b","messages":[{"role":"user","content":"Reply with the single word: pong"}],"max_tokens":8,"temperature":0}'
  2. Observed status, cost header and body:
HTTP/1.1 200 OK
x-litellm-response-cost: 2.8000000000000003e-06
{"content": "Ping", "prompt_tokens": 11, "completion_tokens": 3}

Real Fireworks call with an image, deepseek-v4-flash-vision-exp

  1. curl -s -D - -H "Authorization: Bearer sk-qa-1234" -H 'Content-Type: application/json' localhost:42131/v1/chat/completions -d @req_fw.json
  2. Observed status, cost headers and body:
HTTP/1.1 200 OK
x-litellm-response-cost-input: 0.0
x-litellm-response-cost-output: 0.0
{"reasoning_content": "1.  **Analyze the Request:**\n    *   The user asks", "usage": {"completion_tokens": 16, "prompt_tokens": 127, "total_tokens": 143, "completion_tokens_details": {"reasoning_tokens": 16}, "prompt_tokens_details": {"cached_tokens": 126}, "output_tokens_details": {"reasoning_tokens": 16}}}
  1. The provider accepted the image and answered, and the proxy has no x-litellm-response-cost header for it because the registry has no row for the model

Real OpenAI image generation, gpt-image-2

  1. curl -s -D - -o img.json -H "Authorization: Bearer sk-qa-1234" -H 'Content-Type: application/json' localhost:42131/v1/images/generations -d '{"model":"gpt-image-2","prompt":"a plain red square","n":1,"size":"1024x1024","quality":"low"}' | grep -i "^HTTP\|x-litellm-response-cost:"; jq -c '{data_len: (.data|length), usage}' img.json
  2. Observed:
HTTP/1.1 200 OK
x-litellm-response-cost: 0.0059299999999999995
{"data_len":1,"usage":{"total_tokens":206,"input_tokens":10,"input_tokens_details":{"image_tokens":0,"text_tokens":10},"output_tokens":196,"output_tokens_details":{"image_tokens":196,"text_tokens":0}}}

/spend/calculate for a gpt-image-2 usage with no output token breakdown

  1. curl -s -H "Authorization: Bearer sk-qa-1234" -H 'Content-Type: application/json' localhost:42131/spend/calculate -d '{"completion_response":{"id":"img-1","object":"chat.completion","created":1,"model":"gpt-image-2","choices":[{"index":0,"message":{"role":"assistant","content":""},"finish_reason":"stop"}],"usage":{"prompt_tokens":100,"completion_tokens":5000,"total_tokens":5100}}}'
  2. Observed:
{"cost":0.0505}
  1. Reading the row: 100 x 5e-6 + 5000 x 1e-5 = 0.0505, the image output billed at the $10 text price

/spend/calculate for openrouter/qwen/qwen3.7-flash above and below the 256k tier

  1. curl -s -H "Authorization: Bearer sk-qa-1234" -H 'Content-Type: application/json' localhost:42131/spend/calculate -d '{"completion_response":{"id":"t1","object":"chat.completion","created":1,"model":"openrouter/qwen/qwen3.7-flash","choices":[{"index":0,"message":{"role":"assistant","content":"ok"},"finish_reason":"stop"}],"usage":{"prompt_tokens":300000,"completion_tokens":1000,"total_tokens":301000,"prompt_tokens_details":{"cached_tokens":100000}}}}', then the same call with "prompt_tokens":10000,"completion_tokens":100,"total_tokens":10100 and "cached_tokens":4000
  2. Observed:
{"error":{"message":"This model isn't mapped yet. model=openrouter/qwen/qwen3.7-flash, custom_llm_provider=openrouter. Add it here - https://github.com/BerriAI/litellm/blob/main/model_prices_and_context_window.json.","type":"None","param":"None","code":"500"}}
(same 500 for the 10,000 token usage)
  1. The base has no row for the model, so the proxy returns a 500 instead of a cost

/spend/calculate for the placeholder deployments

  1. for m in dbx-glm-5.3-flash dbx-gpt-5.6-sol dbx-qwen3.5-122b bedrock-qwen3-coder-480b codestral-2501 openrouter-minimax-m2.7 together-qwen2.5-7b; do printf "%s " "$m"; curl -s -H "Authorization: Bearer sk-qa-1234" -H 'Content-Type: application/json' localhost:42131/spend/calculate -d "{\"model\":\"$m\",\"messages\":[{\"role\":\"user\",\"content\":\"Reply with the single word: pong\"}]}"; echo; done
  2. Observed:
dbx-glm-5.3-flash {"cost":0.0}
dbx-gpt-5.6-sol {"cost":0.0}
dbx-qwen3.5-122b {"cost":0.0}
bedrock-qwen3-coder-480b {"cost":3.08e-06}
codestral-2501 {"cost":0.0}
openrouter-minimax-m2.7 {"cost":0.0}
together-qwen2.5-7b {"cost":2.8e-06}

/model_group/info

  1. for g in dbx-gpt-5.6-sol dbx-gpt-5.3-codex azure-realtime-2.1-mini fw-dsv4-vision openrouter-minimax-m2.7 baseten-glm-5.3; do curl -s -H "Authorization: Bearer sk-qa-1234" "localhost:42131/model_group/info?model_group=$g" | jq -c '.data[] | {model_group, mode, supports_vision, supports_function_calling, supports_reasoning, max_input_tokens, max_output_tokens, input_cost_per_token, output_cost_per_token}'; done
  2. Observed:
{"model_group":"dbx-gpt-5.6-sol","mode":null,"supports_vision":false,"supports_function_calling":false,"supports_reasoning":false,"max_input_tokens":null,"max_output_tokens":null,"input_cost_per_token":0,"output_cost_per_token":0}
{"model_group":"dbx-gpt-5.3-codex","mode":"chat","supports_vision":false,"supports_function_calling":false,"supports_reasoning":false,"max_input_tokens":272000,"max_output_tokens":128000,"input_cost_per_token":1.75e-06,"output_cost_per_token":1.4e-05}
{"model_group":"azure-realtime-2.1-mini","mode":null,"supports_vision":false,"supports_function_calling":false,"supports_reasoning":false,"max_input_tokens":null,"max_output_tokens":null,"input_cost_per_token":0,"output_cost_per_token":0}
{"model_group":"fw-dsv4-vision","mode":null,"supports_vision":false,"supports_function_calling":false,"supports_reasoning":false,"max_input_tokens":null,"max_output_tokens":null,"input_cost_per_token":0,"output_cost_per_token":0}
{"model_group":"openrouter-minimax-m2.7","mode":null,"supports_vision":false,"supports_function_calling":false,"supports_reasoning":false,"max_input_tokens":null,"max_output_tokens":null,"input_cost_per_token":0,"output_cost_per_token":0}
{"model_group":"baseten-glm-5.3","mode":null,"supports_vision":false,"supports_function_calling":false,"supports_reasoning":false,"max_input_tokens":null,"max_output_tokens":null,"input_cost_per_token":0,"output_cost_per_token":0}

/spend/logs for the four real calls

  1. curl -s -H "Authorization: Bearer sk-qa-1234" localhost:42131/spend/logs | jq -c 'sort_by(.startTime) | .[] | {model, call_type, prompt_tokens, completion_tokens, spend}'
  2. Observed:
{"model":"openai/gpt-realtime-2.1-mini","call_type":"_arealtime","prompt_tokens":194,"completion_tokens":66,"spend":0.00031914}
{"model":"mistral/ministral-14b-latest","call_type":"acompletion","prompt_tokens":11,"completion_tokens":3,"spend":2.8e-06}
{"model":"fireworks_ai/accounts/fireworks/models/deepseek-v4-flash-vision-exp","call_type":"acompletion","prompt_tokens":127,"completion_tokens":16,"spend":0}
{"model":"openai/gpt-image-2","call_type":"aimage_generation","prompt_tokens":10,"completion_tokens":196,"spend":0.00593}
  1. Reading the realtime row: OpenAI served 189 of the 194 image tokens from its prompt cache, so 5 uncached image tokens x 0.6e-6 (the $0.60 text rate, because the base stores the image price in the per-image field) + 189 cached x 0.06e-6 + (66 + 61 reasoning) x 2.4e-6 = 0.00031914. The Fireworks row logs $0 spend for a paid call

After (50d6b26)

/model/info

  1. curl -s -H "Authorization: Bearer sk-qa-1234" localhost:42132/model/info | jq -r '.data[] | "\(.model_name)\tmode=\(.model_info.mode)\tinput=\(.model_info.input_cost_per_token)\toutput=\(.model_info.output_cost_per_token)\tcache_write=\(.model_info.cache_creation_input_token_cost)\tcache_read=\(.model_info.cache_read_input_token_cost)\timg_tok=\(.model_info.input_cost_per_image_token)\timg=\(.model_info.input_cost_per_image)\tmax_input=\(.model_info.max_input_tokens)\tmax_output=\(.model_info.max_output_tokens)\tvision=\(.model_info.supports_vision)"' | sort
  2. Observed:
azure-realtime-2	mode=realtime	input=4e-06	output=2.4e-05	cache_write=null	cache_read=4e-07	img_tok=5e-06	img=null	max_input=32000	max_output=4096	vision=null
azure-realtime-2.1-mini	mode=realtime	input=6e-07	output=2.4e-06	cache_write=null	cache_read=6e-08	img_tok=8e-07	img=null	max_input=32000	max_output=4096	vision=null
baseten-glm-5.3	mode=chat	input=1.4e-06	output=4.4e-06	cache_write=null	cache_read=1.4e-07	img_tok=null	img=null	max_input=1048576	max_output=262144	vision=true
bedrock-qwen3-coder-480b	mode=chat	input=4.5e-07	output=1.8e-06	cache_write=null	cache_read=null	img_tok=null	img=null	max_input=262000	max_output=65536	vision=null
codestral-2501	mode=chat	input=3e-07	output=9e-07	cache_write=null	cache_read=null	img_tok=null	img=null	max_input=256000	max_output=4096	vision=null
dbx-glm-5.3-flash	mode=chat	input=1.5001e-07	output=5.0001e-07	cache_write=1.5001e-07	cache_read=3.003e-08	img_tok=null	img=null	max_input=1048576	max_output=131072	vision=true
dbx-gpt-5.3-codex	mode=responses	input=1.75e-06	output=1.4e-05	cache_write=1.75e-06	cache_read=1.75e-07	img_tok=null	img=null	max_input=272000	max_output=128000	vision=null
dbx-gpt-5.6-sol	mode=chat	input=4.00001e-06	output=1.999998e-05	cache_write=5.00003e-06	cache_read=3.9998e-07	img_tok=null	img=null	max_input=922000	max_output=128000	vision=true
dbx-qwen3.5-122b	mode=chat	input=2.2001e-07	output=2.20003e-06	cache_write=2.2001e-07	cache_read=2.2001e-07	img_tok=null	img=null	max_input=262144	max_output=25000	vision=false
fw-dsv4-vision	mode=chat	input=2.2e-07	output=6.6e-07	cache_write=null	cache_read=7e-09	img_tok=null	img=null	max_input=1048576	max_output=null	vision=true
gpt-4.1-nano-azure-us	mode=chat	input=1.1e-07	output=4.4e-07	cache_write=null	cache_read=2.5e-08	img_tok=null	img=null	max_input=1047576	max_output=32768	vision=true
gpt-image-2	mode=image_generation	input=5e-06	output=0	cache_write=null	cache_read=1.25e-06	img_tok=8e-06	img=null	max_input=null	max_output=null	vision=true
gpt-realtime-2.1-mini	mode=realtime	input=6e-07	output=2.4e-06	cache_write=null	cache_read=6e-08	img_tok=8e-07	img=null	max_input=128000	max_output=32000	vision=null
ministral-14b	mode=chat	input=2e-07	output=2e-07	cache_write=null	cache_read=2e-08	img_tok=null	img=null	max_input=262144	max_output=262144	vision=true
openrouter-minimax-m2.7	mode=chat	input=3e-07	output=1.2e-06	cache_write=null	cache_read=6e-08	img_tok=null	img=null	max_input=204800	max_output=131072	vision=false
openrouter-minimax-m3	mode=chat	input=3e-07	output=1.2e-06	cache_write=null	cache_read=6e-08	img_tok=null	img=null	max_input=1048576	max_output=512000	vision=true
together-qwen2.5-7b	mode=chat	input=0	output=0	cache_write=null	cache_read=null	img_tok=null	img=null	max_input=null	max_output=null	vision=null

/model/deprecations

  1. curl -s -H "Authorization: Bearer sk-qa-1234" localhost:42132/model/deprecations | jq -c '{deprecated: [.deprecated[] | {model_name, deprecation_date}], upcoming: [.upcoming[] | {model_name, deprecation_date}]}'
  2. Observed:
{"deprecated":[{"model_name":"azure-realtime-2","deprecation_date":"2026-08-31"}],"upcoming":[{"model_name":"gpt-4.1-nano-azure-us","deprecation_date":"2027-04-14"},{"model_name":"azure-realtime-2.1-mini","deprecation_date":"2027-06-25"}]}

Real OpenAI realtime call with an image, gpt-realtime-2.1-mini

  1. Run the WebSocket client described above against port 42132
  2. Observed response.done usage:
{"total_tokens": 234, "input_tokens": 194, "output_tokens": 40, "input_token_details": {"text_tokens": 0, "audio_tokens": 0, "image_tokens": 194, "cached_tokens": 0, "cached_tokens_details": {"text_tokens": 0, "audio_tokens": 0, "image_tokens": 0}}, "output_token_details": {"text_tokens": 40, "audio_tokens": 0, "reasoning_tokens": 35}}

Real Mistral call, ministral-14b

  1. curl -s -D - -H "Authorization: Bearer sk-qa-1234" -H 'Content-Type: application/json' localhost:42132/v1/chat/completions -d '{"model":"ministral-14b","messages":[{"role":"user","content":"Reply with the single word: pong"}],"max_tokens":8,"temperature":0}'
  2. Observed status, cost header and body:
HTTP/1.1 200 OK
x-litellm-response-cost: 2.8000000000000003e-06
{"content": "Ping", "prompt_tokens": 11, "completion_tokens": 3}
  1. Same price as before; /model/info above now shows the cache_read rate of 2e-08 that the base was missing

Real Fireworks call with an image, deepseek-v4-flash-vision-exp

  1. curl -s -D - -H "Authorization: Bearer sk-qa-1234" -H 'Content-Type: application/json' localhost:42132/v1/chat/completions -d @req_fw.json
  2. Observed status, cost headers and body:
HTTP/1.1 200 OK
x-litellm-response-cost: 1.1662000000000001e-05
x-litellm-response-cost-input: 2.2e-07
x-litellm-response-cost-output: 1.056e-05
x-litellm-response-cost-cache-read: 8.82e-07
{"reasoning_content": "1.  **Analyze the User's Request:**\n    *   The", "usage": {"completion_tokens": 16, "prompt_tokens": 127, "total_tokens": 143, "completion_tokens_details": {"reasoning_tokens": 16}, "prompt_tokens_details": {"cached_tokens": 126}, "output_tokens_details": {"reasoning_tokens": 16}}}
  1. Reading the headers: 1 uncached input token x 2.2e-7 + 126 cached x 7e-9 + 16 output x 6.6e-7 = 1.1662e-05, the published $0.22 / $0.007 / $0.66 per 1M

Real OpenAI image generation, gpt-image-2

  1. curl -s -D - -o img.json -H "Authorization: Bearer sk-qa-1234" -H 'Content-Type: application/json' localhost:42132/v1/images/generations -d '{"model":"gpt-image-2","prompt":"a plain red square","n":1,"size":"1024x1024","quality":"low"}' | grep -i "^HTTP\|x-litellm-response-cost:"; jq -c '{data_len: (.data|length), usage}' img.json
  2. Observed:
HTTP/1.1 200 OK
x-litellm-response-cost: 0.0059299999999999995
{"data_len":1,"usage":{"total_tokens":206,"input_tokens":10,"input_tokens_details":{"image_tokens":0,"text_tokens":10},"output_tokens":196,"output_tokens_details":{"image_tokens":196,"text_tokens":0}}}
  1. Unchanged: 10 x 5e-6 + 196 image tokens x 3e-5 = 0.00593. The response carries output_tokens_details.image_tokens, so this path already used the $30 image rate on both sides

/spend/calculate for a gpt-image-2 usage with no output token breakdown

  1. curl -s -H "Authorization: Bearer sk-qa-1234" -H 'Content-Type: application/json' localhost:42132/spend/calculate -d '{"completion_response":{"id":"img-1","object":"chat.completion","created":1,"model":"gpt-image-2","choices":[{"index":0,"message":{"role":"assistant","content":""},"finish_reason":"stop"}],"usage":{"prompt_tokens":100,"completion_tokens":5000,"total_tokens":5100}}}'
  2. Observed:
{"cost":0.1505}
  1. Reading the row: 100 x 5e-6 + 5000 x 3e-5 = 0.1505, the image output billed at the $30 image rate now that the stray output_cost_per_token: 1e-05 is gone

/spend/calculate for openrouter/qwen/qwen3.7-flash above and below the 256k tier

  1. curl -s -H "Authorization: Bearer sk-qa-1234" -H 'Content-Type: application/json' localhost:42132/spend/calculate -d '{"completion_response":{"id":"t1","object":"chat.completion","created":1,"model":"openrouter/qwen/qwen3.7-flash","choices":[{"index":0,"message":{"role":"assistant","content":"ok"},"finish_reason":"stop"}],"usage":{"prompt_tokens":300000,"completion_tokens":1000,"total_tokens":301000,"prompt_tokens_details":{"cached_tokens":100000}}}}', then the same call with "prompt_tokens":10000,"completion_tokens":100,"total_tokens":10100 and "cached_tokens":4000
  2. Observed:
{"cost":0.0448}
{"cost":0.00021699999999999996}
  1. Reading the rows: above 256k, 200,000 uncached x 2e-7 + 100,000 cached x 4e-8 + 1,000 output x 8e-7 = 0.0448, the new cache_read_input_token_cost_above_256k_tokens field is picked up by the tier loop in generic_cost_per_token. Below the tier, 6,000 x 3e-8 + 4,000 x 6e-9 + 100 x 1.3e-7 = 0.000217, the base rates

/spend/calculate for the placeholder deployments

  1. for m in dbx-glm-5.3-flash dbx-gpt-5.6-sol dbx-qwen3.5-122b bedrock-qwen3-coder-480b codestral-2501 openrouter-minimax-m2.7 together-qwen2.5-7b; do printf "%s " "$m"; curl -s -H "Authorization: Bearer sk-qa-1234" -H 'Content-Type: application/json' localhost:42132/spend/calculate -d "{\"model\":\"$m\",\"messages\":[{\"role\":\"user\",\"content\":\"Reply with the single word: pong\"}]}"; echo; done
  2. Observed:
dbx-glm-5.3-flash {"cost":2.10014e-06}
dbx-gpt-5.6-sol {"cost":5.6000139999999995e-05}
dbx-qwen3.5-122b {"cost":3.0801399999999998e-06}
bedrock-qwen3-coder-480b {"cost":6.3e-06}
codestral-2501 {"cost":4.2e-06}
openrouter-minimax-m2.7 {"cost":4.2e-06}
together-qwen2.5-7b {"cost":2.8e-06}
  1. together-qwen2.5-7b is identical on both sides: its Together catalog price was reverted before this tip because the live endpoint reports the model as non-serverless (see the unchanged section above)

/model_group/info

  1. for g in dbx-gpt-5.6-sol dbx-gpt-5.3-codex azure-realtime-2.1-mini fw-dsv4-vision openrouter-minimax-m2.7 baseten-glm-5.3; do curl -s -H "Authorization: Bearer sk-qa-1234" "localhost:42132/model_group/info?model_group=$g" | jq -c '.data[] | {model_group, mode, supports_vision, supports_function_calling, supports_reasoning, max_input_tokens, max_output_tokens, input_cost_per_token, output_cost_per_token}'; done
  2. Observed:
{"model_group":"dbx-gpt-5.6-sol","mode":"chat","supports_vision":true,"supports_function_calling":true,"supports_reasoning":true,"max_input_tokens":922000,"max_output_tokens":128000,"input_cost_per_token":4.00001e-06,"output_cost_per_token":1.999998e-05}
{"model_group":"dbx-gpt-5.3-codex","mode":"responses","supports_vision":false,"supports_function_calling":true,"supports_reasoning":false,"max_input_tokens":272000,"max_output_tokens":128000,"input_cost_per_token":1.75e-06,"output_cost_per_token":1.4e-05}
{"model_group":"azure-realtime-2.1-mini","mode":"realtime","supports_vision":false,"supports_function_calling":true,"supports_reasoning":false,"max_input_tokens":32000,"max_output_tokens":4096,"input_cost_per_token":6e-07,"output_cost_per_token":2.4e-06}
{"model_group":"fw-dsv4-vision","mode":"chat","supports_vision":true,"supports_function_calling":true,"supports_reasoning":false,"max_input_tokens":1048576,"max_output_tokens":null,"input_cost_per_token":2.2e-07,"output_cost_per_token":6.6e-07}
{"model_group":"openrouter-minimax-m2.7","mode":"chat","supports_vision":false,"supports_function_calling":true,"supports_reasoning":true,"max_input_tokens":204800,"max_output_tokens":131072,"input_cost_per_token":3e-07,"output_cost_per_token":1.2e-06}
{"model_group":"baseten-glm-5.3","mode":"chat","supports_vision":true,"supports_function_calling":true,"supports_reasoning":false,"max_input_tokens":1048576,"max_output_tokens":262144,"input_cost_per_token":1.4e-06,"output_cost_per_token":4.4e-06}
  1. baseten-glm-5.3 now reports supports_vision: true with the Baseten limits and prices; the base has no row for the model at all

/spend/logs for the four real calls

  1. curl -s -H "Authorization: Bearer sk-qa-1234" localhost:42132/spend/logs | jq -c 'sort_by(.startTime) | .[] | {model, call_type, prompt_tokens, completion_tokens, spend}'
  2. Observed:
{"model":"openai/gpt-realtime-2.1-mini","call_type":"_arealtime","prompt_tokens":194,"completion_tokens":40,"spend":0.0003352}
{"model":"mistral/ministral-14b-latest","call_type":"acompletion","prompt_tokens":11,"completion_tokens":3,"spend":2.8e-06}
{"model":"fireworks_ai/accounts/fireworks/models/deepseek-v4-flash-vision-exp","call_type":"acompletion","prompt_tokens":127,"completion_tokens":16,"spend":1.1662e-05}
{"model":"openai/gpt-image-2","call_type":"aimage_generation","prompt_tokens":10,"completion_tokens":196,"spend":0.00593}
  1. Reading the realtime row: no image tokens came from OpenAI's prompt cache this time, so 194 image tokens x 0.8e-6 (the $0.80 per 1M image rate) + (40 + 35 reasoning) x 2.4e-6 = 0.0003352. The Fireworks row carries the same 1.1662e-05 the response header reported
    Observed on both sides, none caused or changed by this PR:
  • Realtime bills reasoning tokens on top of text_tokens that already include them
  • Cached realtime image tokens bill at the $0.06 text cache rate, OpenAI lists $0.08
  • Registry has no cache-read image field, so the second one needs a schema change

Databricks Responses-API mode against a real workspace (2026-09-04)

The same two commits, booted again with LITELLM_LOCAL_MODEL_COST_MAP=True python litellm/proxy/proxy_cli.py --config dbx_config.yaml --port $PORT --num_workers 2 and no database: merge base dd01abc on port 49137, tip 50d6b26 on port 57918, a real Databricks workspace token in DATABRICKS_API_KEY, master_key: sk-qa-1234, drop_params: true. Every proxy call below also sends -H "Authorization: Bearer sk-qa-1234" -H "Content-Type: application/json"

model_list:
  - model_name: dbx-gpt-5.3-codex
    litellm_params: {model: databricks/databricks-gpt-5-3-codex, api_key: os.environ/DATABRICKS_API_KEY, api_base: os.environ/DATABRICKS_API_BASE}
  - model_name: dbx-gpt-5.5-pro
    litellm_params: {model: databricks/databricks-gpt-5-5-pro, api_key: os.environ/DATABRICKS_API_KEY, api_base: os.environ/DATABRICKS_API_BASE}
  - model_name: dbx-gpt-oss-20b
    litellm_params: {model: databricks/databricks-gpt-oss-20b, api_key: os.environ/DATABRICKS_API_KEY, api_base: os.environ/DATABRICKS_API_BASE}

What the workspace itself answers, with no proxy in between (it has databricks-gpt-oss-20b provisioned and no GPT-5 Responses endpoint):

$ curl -s -X POST "$DATABRICKS_API_BASE/databricks-gpt-5-3-codex/invocations" -H "Authorization: Bearer $DATABRICKS_API_KEY" -H "Content-Type: application/json" -d {"messages":[{"role":"user","content":"pong"}],"max_tokens":20}
  {"error_code":"BAD_REQUEST","message":"Model databricks-gpt-5-3-codex only supports the Responses API. Please use /serving-endpoints/responses or /serving-endpoints/open-responses instead."}
    http_status=400
$ curl -s -X POST "$DATABRICKS_API_BASE/responses" -H "Authorization: Bearer $DATABRICKS_API_KEY" -H "Content-Type: application/json" -d {"model":"databricks-gpt-5-3-codex","input":"pong"}
  {"error_code":"ENDPOINT_NOT_FOUND","message":"The given endpoint does not exist, please retry after checking the specified model and version deployment exists."}
    http_status=404
$ curl -s -X POST "$DATABRICKS_API_BASE/open-responses" -H "Authorization: Bearer $DATABRICKS_API_KEY" -H "Content-Type: application/json" -d {"model":"databricks-gpt-5-3-codex","input":"pong"}
  {"error_code":"ENDPOINT_NOT_FOUND","message":"The given endpoint does not exist, please retry after checking the specified model and version deployment exists."}
    http_status=404

Before (dd01abc)

$ curl -s http://localhost:49137/model_group/info -H "Authorization: Bearer sk-qa-1234"   # mode per model
  dbx-gpt-5.3-codex: mode=chat
  dbx-gpt-5.5-pro: mode=None
  dbx-gpt-oss-20b: mode=chat
$ curl -s http://localhost:49137/v1/chat/completions -d {"model":"dbx-gpt-5.3-codex","messages":[{"role":"user","content":"Reply with the single word pong."}],"max_tokens":20}
  error: {"message": "litellm.BadRequestError: DatabricksException - {\"error_code\":\"BAD_REQUEST\",\"message\":\"Model databricks-gpt-5-3-codex only supports the Responses API. Please use /serving-endpoints/responses or /serving-endpoints/open-responses instead.\"}. Received Model Group=dbx-gpt-5.3-codex\nAvailable Model Group Fallbacks=None", "type": "invalid_request_error", "param": null, "code": "400"}
  http_status=400
$ curl -s http://localhost:49137/v1/chat/completions -d {"model":"dbx-gpt-5.5-pro","messages":[{"role":"user","content":"Reply with the single word pong."}],"max_tokens":20}
  error: {"message": "litellm.BadRequestError: DatabricksException - {\"error_code\":\"BAD_REQUEST\",\"message\":\"Model databricks-gpt-5-5-pro only supports the Responses API. Please use /serving-endpoints/responses or /serving-endpoints/open-responses instead.\"}. Received Model Group=dbx-gpt-5.5-pro\nAvailable Model Group Fallbacks=None", "type": "invalid_request_error", "param": null, "code": "400"}
  http_status=400
$ curl -s http://localhost:49137/v1/chat/completions -d {"model":"dbx-gpt-oss-20b","messages":[{"role":"user","content":"Reply with the single word pong."}],"max_tokens":400}   # control, provisioned chat model
  content: "pong" | total_tokens: 144
  http_status=200
$ curl -s http://localhost:49137/v1/responses -d {"model":"dbx-gpt-5.3-codex","input":"Reply with the single word pong."}   # after the 60s router cooldown from the 404 above
  error: {"message": "litellm.NotFoundError: DatabricksException - {\"error_code\":\"ENDPOINT_NOT_FOUND\",\"message\":\"The given endpoint does not exist, please retry after checking the specified model and version deployment exists.\"}. Received Model Group=dbx-gpt-5.3-codex\nAvailable Model Group Fallbacks=None", "type": "invalid_request_error", "param": null, "code": "404"}
  http_status=404

Databricks rejects the proxy's /chat/completions call for both GPT rows with its "only supports the Responses API" 400, while the provisioned control model answers

After (50d6b26)

$ curl -s http://localhost:57918/model_group/info -H "Authorization: Bearer sk-qa-1234"   # mode per model
  dbx-gpt-5.3-codex: mode=responses
  dbx-gpt-5.5-pro: mode=responses
  dbx-gpt-oss-20b: mode=chat
$ curl -s http://localhost:57918/v1/chat/completions -d {"model":"dbx-gpt-5.3-codex","messages":[{"role":"user","content":"Reply with the single word pong."}],"max_tokens":20}
  error: {"message": "litellm.NotFoundError: DatabricksException - {\"error_code\":\"ENDPOINT_NOT_FOUND\",\"message\":\"The given endpoint does not exist, please retry after checking the specified model and version deployment exists.\"}. Received Model Group=dbx-gpt-5.3-codex\nAvailable Model Group Fallbacks=None", "type": "invalid_request_error", "param": null, "code": "404"}
  http_status=404
$ curl -s http://localhost:57918/v1/chat/completions -d {"model":"dbx-gpt-5.5-pro","messages":[{"role":"user","content":"Reply with the single word pong."}],"max_tokens":20}
  error: {"message": "litellm.NotFoundError: DatabricksException - {\"error_code\":\"ENDPOINT_NOT_FOUND\",\"message\":\"The given endpoint does not exist, please retry after checking the specified model and version deployment exists.\"}. Received Model Group=dbx-gpt-5.5-pro\nAvailable Model Group Fallbacks=None", "type": "invalid_request_error", "param": null, "code": "404"}
  http_status=404
$ curl -s http://localhost:57918/v1/chat/completions -d {"model":"dbx-gpt-oss-20b","messages":[{"role":"user","content":"Reply with the single word pong."}],"max_tokens":400}   # control, provisioned chat model
  content: "pong" | total_tokens: 176
  http_status=200
$ curl -s http://localhost:57918/v1/responses -d {"model":"dbx-gpt-5.3-codex","input":"Reply with the single word pong."}   # after the 60s router cooldown from the 404 above
  error: {"message": "litellm.NotFoundError: DatabricksException - {\"error_code\":\"ENDPOINT_NOT_FOUND\",\"message\":\"The given endpoint does not exist, please retry after checking the specified model and version deployment exists.\"}. Received Model Group=dbx-gpt-5.3-codex\nAvailable Model Group Fallbacks=None", "type": "invalid_request_error", "param": null, "code": "404"}
  http_status=404

Both GPT rows now report mode: responses, the same /v1/chat/completions calls are sent to the workspace's /responses endpoint (the 404 is the workspace's own ENDPOINT_NOT_FOUND from the raw calls above, not a routing error), /v1/responses behaves the same on both legs, and the control model still answers. A bridged reply end to end needs a workspace with the GPT-5 Responses endpoint provisioned

Type

🐛 Bug Fix

Caveats (if any)

Low

  • Databricks gpt-5-5, gpt-5-5-pro and gpt-5-3-codex flip to mode: responses
    • Databricks itself rejects their /chat/completions calls with "only supports the Responses API" (proof above)
    • After the flip the proxy sends them to /responses; the QA workspace has no such endpoint, so a full bridged reply still needs one that does
  • Databricks gemini-3-8-flash, gemini-3-1-flash-image and gemini-3-pro-image carry no price
    • Databricks has not published their DBU rate, so spend logs $0, the same as with no entry at all
    • Inventing a rate or dropping the limits and modalities would both be worse; metadata.notes says so, and a per-deployment cost override works meanwhile
  • Ten Databricks deprecation_date values are already in the past
    • Each matches the retired-models page verbatim (re-read 2026-09-04); only /model/deprecations reads the field
  • Two OpenRouter rows already drift from today's catalog
    • qwen/qwen3.5-35b-a3b output is $1.25 here, $0.75 now; undi95/remm-slerp-l2-13b input is $0.45 here, $0.35 now (both were further off on the base)
    • OpenRouter reprices daily, and a new commit restarts every bot, CI and QA cycle for two cheap rows, so the next audit picks them up
  • The W&B pricing page no longer prints the five corrected models
    • Each row keeps its digits and only the divisor changes (per 1M, not per 100), so the 100,000x overcount is gone either way
  • Databricks n/a cache columns are stored as the input rate (no surcharge, no discount), the convention glm-5-2 and the GPT rows already follow on the base
  • Realtime output pricing counts reasoning_tokens on top of output_tokens on both legs; pre-existing calculator behavior, not touched here
  • azure/gpt-realtime-2 is past its 2026-08-31 retirement, so /model/deprecations lists it as deprecated on day one
  • gpt-image-2 budget reservation is $0 before the call and reconciles from real spend after it, the shape gpt-image-1 and the Azure GPT Image rows already have; not exercised live
  • proxy-infra / Run tests (Python 3.10) is red on test_qualifiers_and_optionality_are_unwrapped
  • ci/circleci: proxy_store_model_in_db_tests is red on test_chat_completion_bad_model_with_spend_logs (model_group comes back empty)
    • The same assertion fails on every litellm_internal_staging pipeline today (#89085 through #89104) and eleven of the last twelve PR pipelines; not a required check, not touched here

Final Attestation

  • The tests check the right things, including the edge cases, and regressions in the respective real-world customer use-cases are not possible after this PR
  • 50d6b26 passes /live-pr-risk

Link to Devin session: https://app.devin.ai/sessions/38fb47b2a0e448df985f90f107e4939c
Open in Devin Desktop: https://app.devin.ai/desktop/session/38fb47b2a0e448df985f90f107e4939c?variant=devin
Requested by: @mateo-berri


Note

Medium Risk
Changes are mostly registry data but directly drive global spend, deprecations, and API mode (e.g. Databricks Responses bridge); incorrect rows would misbill customers or route chat calls unexpectedly.

Overview
This PR refreshes model_prices_and_context_window.json (and the matching backup) from provider pricing pages: hundreds of new model rows, corrected rates/limits/modes/deprecation dates, and absorbed registry-only work from several open PRs. Proxy /model/info, /model/deprecations, and /spend/calculate therefore stop reporting $0 or wrong retirement dates for models that were missing or stale.

Spend calculation fixes move realtime image input from input_cost_per_image to input_cost_per_image_token so input_token_details.image_tokens bill at the published per‑1M image rate (pinned by test_realtime_image_tokens_priced_per_token). For GPT Image 2, it drops a stray output_cost_per_token so completions without an image-token breakdown use output_cost_per_image_token ($30/1M) instead of the old $10/1M text rate. Other notable registry-driven billing fixes include W&B entries stored per-token instead of per‑1M (100,000× overcount), Bedrock Qwen3 Coder 480B input price, and OpenRouter headline rate corrections with a regression test in test_get_model_cost_map.py.

Metadata / routing changes include Gemini Live models set to mode: realtime, new Azure realtime 2.x rows, Databricks catalog additions with DBU pricing and some mode: responses rows (e.g. GPT‑5.3 Codex, GPT‑5.5 on Databricks), gpt-5.5 Fast/priority tier rates, and new Daybreak / Perplexity Agent / Nebius / Baseten GLM‑5.3 entries. Tests across cost calculators, Databricks, Azure AI, savings, and model schema are updated to match.

Reviewed by Cursor Bugbot for commit 50d6b26. Bugbot is set up for automated code reviews on this repo. Configure here.

mateo-berri and others added 4 commits September 2, 2026 19:40
…nd gpt-daybreak aliases, fix gpt-5.5 Fast and W&B pricing

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
…ect watsonx list prices

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
…uld record zero spend

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

🤖 Devin AI Engineer

I'll be helping with this pull request! Here's what you should know:

✅ I will automatically:

  • Address comments on this PR. Add '(aside)' to your comment to have me ignore it.
  • Look at CI failures and help fix them

Note: I can only respond to comments from users who have write access to this repository.

⚙️ Control Options:

  • Disable automatic comment, CI, and merge conflict monitoring

@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

PR #39388 (BerriAI/litellm, author devin-ai-integration[bot]) has no labels — the enterprise label is absent, so it is out of scope. No GitHub or Linear changes made; no risk label applied.

@codspeed-hq

codspeed-hq Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Merging this PR will not alter performance

✅ 31 untouched benchmarks


Comparing litellm_registry_audit_2026_09_02 (50d6b26) with litellm_internal_staging (205a5e9)1

Open in CodSpeed

Footnotes

  1. No successful run was found on litellm_internal_staging (d71fe43) during the generation of this report, so 205a5e9 was used instead as the comparison base. There might be some changes unrelated to this pull request in this report.

@codecov

codecov Bot commented Sep 2, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@greptile-apps

greptile-apps Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR performs a broad model-registry audit, adding provider catalog entries and correcting pricing, capabilities, limits, modes, and retirement dates.

  • Adds and updates model metadata across OpenAI, Azure, Databricks, Anthropic, Gemini, OpenRouter, Nebius, watsonx, and other providers.
  • Corrects realtime image-token and GPT Image 2 output-cost metadata.
  • Expands regression coverage for pricing calculations and model capabilities.

Confidence Score: 5/5

The PR appears safe to merge because no blocking failure remains.

No blocking failure remains.

Important Files Changed

Filename Overview
model_prices_and_context_window.json Adds and corrects model pricing, limits, capabilities, endpoint modes, and deprecation metadata across numerous providers.
litellm/model_prices_and_context_window_backup.json Mirrors the root model registry changes in the runtime backup map.
model_prices_and_context_window.schema.json Extends recognized tiered cache-pricing fields used by new registry entries.
tests/test_litellm/litellm_core_utils/llm_cost_calc/test_llm_cost_calc_utils.py Adds regression coverage for realtime image-token pricing.
tests/test_litellm/litellm_core_utils/test_get_model_cost_map.py Expands validation of corrected model prices and guards against stale registry values.
tests/test_litellm/llms/databricks/test_databricks_cost_calculator.py Covers cost calculation for newly priced Databricks catalog entries.
tests/test_litellm/test_baseten_glm_5_3_model_metadata.py Validates Baseten GLM-5.3 pricing, limits, modalities, and supported capabilities.
tests/test_litellm/test_gpt_image_cost_calculator.py Verifies GPT Image 2 output is billed at the image-token rate with and without detailed token breakdowns.

Reviews (13): Last reviewed commit: "fix(registry): mark baseten GLM-5.3 as v..." | Re-trigger Greptile

Comment thread model_prices_and_context_window.json
… fast-mode rate

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

@greptileai

@mateo-berri

Copy link
Copy Markdown
Contributor

bugbot run

Comment thread model_prices_and_context_window.json
mateo-berri and others added 2 commits September 2, 2026 20:35
…per registry convention

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
…d maximum new tokens

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

@greptileai

@mateo-berri

Copy link
Copy Markdown
Contributor

bugbot run

@cursor cursor Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Bugbot reviewed your changes and found no new issues!

Comment @cursor review or bugbot run to trigger another review on this PR

Reviewed by Cursor Bugbot for commit e148868. Configure here.

mateo-berri and others added 4 commits September 3, 2026 13:05
…ing-3.5, sync Azure and Vertex deprecation dates, fix novita gpt-oss vision flags

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
…and Foundry docs

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
…es from Azure Retail Prices

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
@devin-ai-integration devin-ai-integration Bot changed the title fix(model_prices): registry audit 2026-09-02, add Nebius, watsonx, Daybreak and Mythos entries, fix watsonx, W&B and GPT-5.5 Fast prices fix(model_prices): 2026-09-02/03 registry audit, Azure Foundry additions, deprecation dates, absorb open registry PRs Sep 3, 2026
@devin-ai-integration devin-ai-integration Bot changed the title fix(model_prices): 2026-09-02/03 registry audit, Azure Foundry, Perplexity, OpenRouter, Baseten and Gemini additions, absorb open registry PRs fix(model_prices): verified registry audit, Databricks Sep-2026 catalog, realtime image pricing, deprecation dates Sep 4, 2026
@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

@greptileai

@mateo-berri

Copy link
Copy Markdown
Contributor

bugbot run

@cursor cursor Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Bugbot reviewed your changes and found no new issues!

1 issue from previous review remains unresolved.

Fix All in Cursor

Comment @cursor review or bugbot run to trigger another review on this PR

Reviewed by Cursor Bugbot for commit c707f2f. Configure here.

…imax-m3 and qwen3.7-plus

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

@greptileai

@mateo-berri

Copy link
Copy Markdown
Contributor

bugbot run

@cursor cursor Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Bugbot reviewed your changes and found no new issues!

1 issue from previous review remains unresolved.

Fix All in Cursor

Comment @cursor review or bugbot run to trigger another review on this PR

Reviewed by Cursor Bugbot for commit 0c29f51. Configure here.

mateo-berri and others added 4 commits September 4, 2026 19:02
…ash Vision, Together MiniMax M2.7 and Qwen2.5 7B Turbo pricing

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
… pricing, both non-serverless

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

@greptileai

…ion docs

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

@greptileai

@mateo-berri

Copy link
Copy Markdown
Contributor

bugbot run

@cursor cursor Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Bugbot reviewed your changes and found no new issues!

1 issue from previous review remains unresolved.

Fix All in Cursor

Comment @cursor review or bugbot run to trigger another review on this PR

Reviewed by Cursor Bugbot for commit 50d6b26. Configure here.

@mateo-berri

Copy link
Copy Markdown
Contributor

bugbot run

@cursor cursor Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Bugbot reviewed your changes and found no new issues!

1 issue from previous review remains unresolved.

Fix All in Cursor

Comment @cursor review or bugbot run to trigger another review on this PR

Reviewed by Cursor Bugbot for commit 50d6b26. Configure here.

@mateo-berri mateo-berri left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@mateo-berri
mateo-berri merged commit 922659f into litellm_internal_staging Sep 4, 2026
233 of 236 checks passed
@mateo-berri
mateo-berri deleted the litellm_registry_audit_2026_09_02 branch September 4, 2026 21:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant