mirror of
https://github.com/BerriAI/litellm.git
synced 2026-09-16 23:41:43 +00:00
Merge c1f809c1e0 into c2c2a623c0
This commit is contained in:
commit
1b8f236a5f
2 changed files with 60 additions and 1 deletions
|
|
@ -922,7 +922,13 @@ def _calculate_input_cost(
|
|||
|
||||
### AUDIO COST
|
||||
if prompt_tokens_details["audio_tokens"]:
|
||||
audio_cost_key: Final = _get_service_tier_cost_key("input_cost_per_audio_token", service_tier)
|
||||
tier_audio_cost_key: Final = _get_service_tier_cost_key("input_cost_per_audio_token", service_tier)
|
||||
has_audio_price: Final = (
|
||||
model_info.get(tier_audio_cost_key) is not None
|
||||
or model_info.get("input_cost_per_audio_token") is not None
|
||||
or model_info.get("input_cost_per_audio_per_second") is not None
|
||||
)
|
||||
audio_cost_key: Final = tier_audio_cost_key if has_audio_price else "input_cost_per_token"
|
||||
prompt_cost += calculate_cost_component(model_info, audio_cost_key, prompt_tokens_details["audio_tokens"])
|
||||
|
||||
### IMAGE TOKEN COST
|
||||
|
|
|
|||
|
|
@ -2525,6 +2525,59 @@ def test_string_cost_values_edge_cases():
|
|||
assert round(completion_cost, 12) == round(expected_completion_cost, 12)
|
||||
|
||||
|
||||
def test_audio_input_tokens_fall_back_to_base_rate_when_no_audio_price():
|
||||
"""Audio input tokens must bill at input_cost_per_token when the model has no audio rate.
|
||||
|
||||
Regression: models like gemini-2.5-pro report audio prompt tokens separately from text
|
||||
but ship without input_cost_per_audio_token, which previously billed those tokens at $0.
|
||||
"""
|
||||
model_info: ModelInfo = {
|
||||
"input_cost_per_token": 1.25e-6,
|
||||
"output_cost_per_token": 1e-5,
|
||||
}
|
||||
|
||||
usage = Usage(
|
||||
prompt_tokens=9700,
|
||||
completion_tokens=0,
|
||||
total_tokens=9700,
|
||||
prompt_tokens_details=PromptTokensDetailsWrapper(
|
||||
audio_tokens=9600, cached_tokens=0, text_tokens=100, image_tokens=None
|
||||
),
|
||||
)
|
||||
|
||||
prompt_cost, _ = generic_cost_per_token(
|
||||
model="gemini-2.5-pro", usage=usage, custom_llm_provider="vertex_ai", model_info=model_info
|
||||
)
|
||||
|
||||
expected_prompt_cost = (100 + 9600) * 1.25e-6
|
||||
assert round(prompt_cost, 12) == round(expected_prompt_cost, 12)
|
||||
|
||||
|
||||
def test_audio_input_tokens_use_audio_rate_when_present():
|
||||
"""When input_cost_per_audio_token exists it takes precedence over the base rate."""
|
||||
model_info: ModelInfo = {
|
||||
"input_cost_per_token": 1.25e-6,
|
||||
"input_cost_per_audio_token": 5e-6,
|
||||
"output_cost_per_token": 1e-5,
|
||||
}
|
||||
|
||||
usage = Usage(
|
||||
prompt_tokens=9700,
|
||||
completion_tokens=0,
|
||||
total_tokens=9700,
|
||||
prompt_tokens_details=PromptTokensDetailsWrapper(
|
||||
audio_tokens=9600, cached_tokens=0, text_tokens=100, image_tokens=None
|
||||
),
|
||||
)
|
||||
|
||||
prompt_cost, _ = generic_cost_per_token(
|
||||
model="gemini-2.5-pro", usage=usage, custom_llm_provider="vertex_ai", model_info=model_info
|
||||
)
|
||||
|
||||
expected_prompt_cost = 100 * 1.25e-6 + 9600 * 5e-6
|
||||
assert round(prompt_cost, 12) == round(expected_prompt_cost, 12)
|
||||
|
||||
|
||||
def test_string_cost_values_with_threshold():
|
||||
"""Test that string cost values work correctly with threshold pricing."""
|
||||
from unittest.mock import patch
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue