Skip to content
Closed
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 10 additions & 11 deletions litellm/model_prices_and_context_window_backup.json
Original file line number Diff line number Diff line change
Expand Up @@ -5422,6 +5422,7 @@
"supports_tool_choice": true
},
"azure/gpt-realtime-2": {
"cache_creation_input_audio_token_cost": 4e-07,
"cache_read_input_audio_token_cost": 4e-07,
"cache_read_input_token_cost": 4e-07,
"deprecation_date": "2026-08-31",
Expand Down Expand Up @@ -23829,9 +23830,9 @@
"input_cost_per_audio_token": 3e-06,
"input_cost_per_token": 5e-07,
"litellm_provider": "vertex_ai-language-models",
"max_input_tokens": 1048576,
"max_output_tokens": 65535,
"max_tokens": 65535,
"max_input_tokens": 131072,
"max_output_tokens": 65536,
"max_tokens": 65536,
"mode": "realtime",
"output_cost_per_audio_token": 1.2e-05,
"output_cost_per_token": 2e-06,
Expand All @@ -23854,12 +23855,12 @@
"supports_audio_output": true,
"supports_function_calling": true,
"supports_parallel_function_calling": true,
"supports_pdf_input": true,
"supports_prompt_caching": true,
"supports_response_schema": true,
"supports_pdf_input": false,
"supports_prompt_caching": false,
"supports_response_schema": false,
"supports_system_messages": true,
"supports_tool_choice": true,
"supports_url_context": true,
"supports_url_context": false,
"supports_vision": true,
"supports_web_search": true,
"search_context_cost_per_query": {
Expand All @@ -23871,7 +23872,6 @@
"input_cost_per_image_token": 3e-06
},
"gemini-live-2.5-flash-preview-native-audio-09-2025": {
"cache_read_input_token_cost": 7.5e-08,
"input_cost_per_audio_token": 3e-06,
"input_cost_per_token": 5e-07,
"litellm_provider": "vertex_ai-language-models",
Expand Down Expand Up @@ -23900,7 +23900,7 @@
"supports_function_calling": true,
"supports_parallel_function_calling": true,
"supports_pdf_input": true,
"supports_prompt_caching": true,
"supports_prompt_caching": false,
"supports_response_schema": true,
"supports_system_messages": true,
"supports_tool_choice": true,
Expand All @@ -23915,7 +23915,6 @@
"gemini_native_audio": true
},
"gemini/gemini-live-2.5-flash-preview-native-audio-09-2025": {
"cache_read_input_token_cost": 7.5e-08,
"input_cost_per_audio_token": 3e-06,
"input_cost_per_token": 5e-07,
"litellm_provider": "gemini",
Expand Down Expand Up @@ -23945,7 +23944,7 @@
"supports_function_calling": true,
"supports_parallel_function_calling": true,
"supports_pdf_input": true,
"supports_prompt_caching": true,
"supports_prompt_caching": false,
"supports_response_schema": true,
"supports_system_messages": true,
"supports_tool_choice": true,
Expand Down
21 changes: 10 additions & 11 deletions model_prices_and_context_window.json
Original file line number Diff line number Diff line change
Expand Up @@ -5422,6 +5422,7 @@
"supports_tool_choice": true
},
"azure/gpt-realtime-2": {
"cache_creation_input_audio_token_cost": 4e-07,
"cache_read_input_audio_token_cost": 4e-07,
"cache_read_input_token_cost": 4e-07,
"deprecation_date": "2026-08-31",
Expand Down Expand Up @@ -23829,9 +23830,9 @@
"input_cost_per_audio_token": 3e-06,
"input_cost_per_token": 5e-07,
"litellm_provider": "vertex_ai-language-models",
"max_input_tokens": 1048576,
"max_output_tokens": 65535,
"max_tokens": 65535,
"max_input_tokens": 131072,
"max_output_tokens": 65536,
"max_tokens": 65536,
"mode": "realtime",
"output_cost_per_audio_token": 1.2e-05,
"output_cost_per_token": 2e-06,
Expand All @@ -23854,12 +23855,12 @@
"supports_audio_output": true,
"supports_function_calling": true,
"supports_parallel_function_calling": true,
"supports_pdf_input": true,
"supports_prompt_caching": true,
"supports_response_schema": true,
"supports_pdf_input": false,
"supports_prompt_caching": false,
"supports_response_schema": false,
"supports_system_messages": true,
"supports_tool_choice": true,
"supports_url_context": true,
"supports_url_context": false,
"supports_vision": true,
"supports_web_search": true,
"search_context_cost_per_query": {
Expand All @@ -23871,7 +23872,6 @@
"input_cost_per_image_token": 3e-06
},
"gemini-live-2.5-flash-preview-native-audio-09-2025": {
"cache_read_input_token_cost": 7.5e-08,
"input_cost_per_audio_token": 3e-06,
"input_cost_per_token": 5e-07,
"litellm_provider": "vertex_ai-language-models",
Expand Down Expand Up @@ -23900,7 +23900,7 @@
"supports_function_calling": true,
"supports_parallel_function_calling": true,
"supports_pdf_input": true,
"supports_prompt_caching": true,
"supports_prompt_caching": false,
"supports_response_schema": true,
"supports_system_messages": true,
"supports_tool_choice": true,
Expand All @@ -23915,7 +23915,6 @@
"gemini_native_audio": true
},
"gemini/gemini-live-2.5-flash-preview-native-audio-09-2025": {
"cache_read_input_token_cost": 7.5e-08,
"input_cost_per_audio_token": 3e-06,
"input_cost_per_token": 5e-07,
"litellm_provider": "gemini",
Expand Down Expand Up @@ -23945,7 +23944,7 @@
"supports_function_calling": true,
"supports_parallel_function_calling": true,
"supports_pdf_input": true,
"supports_prompt_caching": true,
"supports_prompt_caching": false,
"supports_response_schema": true,
"supports_system_messages": true,
"supports_tool_choice": true,
Expand Down
102 changes: 101 additions & 1 deletion tests/test_litellm/test_cost_calculator.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
PromptTokensDetailsWrapper,
Usage,
)
from litellm.utils import TranscriptionResponse
from litellm.utils import TranscriptionResponse, supports_prompt_caching


@pytest.fixture
Expand Down Expand Up @@ -288,6 +288,81 @@ def test_github_copilot_mai_code_1_flash_pricing(_local_model_cost_map, model):
assert completion_usd == pytest.approx(500 * 4.5e-06)


GPT_REALTIME_2_FAMILY: Final = (
"azure/gpt-realtime-2",
"azure/gpt-realtime-2.1",
"azure/gpt-realtime-2.1-mini",
"gpt-realtime-2",
"gpt-realtime-2.1",
"gpt-realtime-2.1-mini",
)


def test_gpt_realtime_2_family_prices_audio_cache_writes_and_reads_alike(_local_model_cost_map: None) -> None:
"""Azure publishes one cached-audio meter per gpt-realtime-2 deployment, charged at the same rate for
the write that populates the cache and the read that hits it. azure/gpt-realtime-2 carried only the
read side, so it was the one family member reporting no cache-creation audio price for a deployment
whose meter publishes one."""
Comment thread
greptile-apps[bot] marked this conversation as resolved.
Resolved
audio_cache_rates: Final = {
model: (
litellm.model_cost[model].get("cache_read_input_audio_token_cost"),
litellm.model_cost[model].get("cache_creation_input_audio_token_cost"),
)
for model in GPT_REALTIME_2_FAMILY
}

assert all(read is not None and write == read for read, write in audio_cache_rates.values()), audio_cache_rates
assert audio_cache_rates["azure/gpt-realtime-2"] == (4e-07, 4e-07)


GEMINI_LIVE_NATIVE_AUDIO_CASES: Final = (
("gemini-live-2.5-flash-native-audio", "vertex_ai"),
("gemini-live-2.5-flash-preview-native-audio-09-2025", "vertex_ai"),
("gemini/gemini-live-2.5-flash-preview-native-audio-09-2025", "gemini"),
)


@pytest.mark.parametrize(("model", "provider"), GEMINI_LIVE_NATIVE_AUDIO_CASES)
def test_gemini_live_native_audio_carries_no_cached_input_rate(
_local_model_cost_map: None, model: str, provider: str
) -> None:
"""Google publishes no cached-input price for the Live API. Its pricing table prints N/A in both
cached columns for every Gemini 2.5 Flash Live API row, and no Live or native-audio model appears
under either implicit or explicit context caching. Two of these entries priced a cached read at
7.5e-08 regardless, which billed 0.008 here. With no invented rate the cached tokens drop out of
the bill, which is inert in practice because Vertex reports no cachedContentTokenCount on a Live
session."""
assert litellm.get_model_info(model, custom_llm_provider=provider)["cache_read_input_token_cost"] is None

prompt_usd, _ = cost_per_token(
model=model,
prompt_tokens=101_000,
completion_tokens=0,
custom_llm_provider=provider,
usage_object=Usage(
prompt_tokens=101_000,
completion_tokens=0,
prompt_tokens_details=PromptTokensDetailsWrapper(cached_tokens=100_000),
),
)

assert prompt_usd == pytest.approx(1_000 * 5e-07)


@pytest.mark.parametrize(("model", "provider"), GEMINI_LIVE_NATIVE_AUDIO_CASES)
def test_gemini_live_native_audio_declares_prompt_caching_unsupported(
_local_model_cost_map: None, model: str, provider: str
) -> None:
"""The capability claim is what made the absent cached rate read as a pricing gap rather than a
vendor limitation. The flag has to say False rather than go missing: get_model_info maps an absent
key to None, which is how this map spells "nobody checked", where False records the vendor's
documented no. The 2.5 Flash control is load-bearing because supports_prompt_caching turns any
lookup error into False, so without it a broken lookup would read as a pass."""
assert litellm.get_model_info(model, custom_llm_provider=provider)["supports_prompt_caching"] is False
assert supports_prompt_caching(model=model, custom_llm_provider=provider) is False
assert supports_prompt_caching(model="gemini-2.5-flash", custom_llm_provider="vertex_ai") is True


def test_cost_calculator_with_usage(_local_model_cost_map, monkeypatch):

usage = Usage(
Expand Down Expand Up @@ -4378,6 +4453,31 @@ def test_gemini_live_native_audio_ga_realtime_cost(_local_model_cost_map: None)
assert cost == pytest.approx(expected_cost, rel=1e-9)


@pytest.mark.parametrize(
"model",
["gemini-live-2.5-flash-native-audio", "vertex_ai/gemini-live-2.5-flash-native-audio"],
)
def test_gemini_live_native_audio_limits_and_capabilities_match_vendor_model_card(
_local_model_cost_map: None, model: str
) -> None:
"""Google's card for model ID gemini-live-2.5-flash-native-audio gives a 128K context window and
64K maximum output tokens, and marks structured output and URL context as not supported. Its
modality list is text, image, audio and video, with no document input, so pdf input cannot be
advertised either. The entry claimed a 1M window, an off-by-one 65535 output cap, and all three
capabilities.

Both ids resolve to the one bare entry, which is why no vertex_ai/-prefixed twin is needed.
"""
info = litellm.get_model_info(model)

assert info["max_input_tokens"] == 131072
assert info["max_output_tokens"] == 65536
assert info["max_tokens"] == 65536
assert info["supports_response_schema"] is False
assert info["supports_url_context"] is False
assert info["supports_pdf_input"] is False


@pytest.mark.parametrize(
"priceless_entry",
[
Expand Down
Loading