From 22bccc4f61cda0d1cd3ca6b7cd4b0db93bb57854 Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Mon, 23 Feb 2026 11:23:24 +0530 Subject: [PATCH] Fix entries with fast and us/ --- litellm/llms/anthropic/cost_calculation.py | 36 +++- ...odel_prices_and_context_window_backup.json | 198 +----------------- litellm/types/utils.py | 65 +++--- litellm/utils.py | 3 + model_prices_and_context_window.json | 198 +----------------- tests/test_litellm/test_utils.py | 11 +- 6 files changed, 94 insertions(+), 417 deletions(-) diff --git a/litellm/llms/anthropic/cost_calculation.py b/litellm/llms/anthropic/cost_calculation.py index 271406f2f7..a96d9e006c 100644 --- a/litellm/llms/anthropic/cost_calculation.py +++ b/litellm/llms/anthropic/cost_calculation.py @@ -9,6 +9,7 @@ from litellm.litellm_core_utils.llm_cost_calc.utils import generic_cost_per_toke if TYPE_CHECKING: from litellm.types.utils import ModelInfo, Usage +import litellm def cost_per_token(model: str, usage: "Usage") -> Tuple[float, float]: @@ -22,20 +23,33 @@ def cost_per_token(model: str, usage: "Usage") -> Tuple[float, float]: Returns: Tuple[float, float] - prompt_cost_in_usd, completion_cost_in_usd """ - model_with_prefix = model - - # First, prepend inference_geo if present - if hasattr(usage, "inference_geo") and usage.inference_geo and usage.inference_geo.lower() not in ["global", "not_available"]: - model_with_prefix = f"{usage.inference_geo}/{model_with_prefix}" - - # Then, prepend speed if it's "fast" - if hasattr(usage, "speed") and usage.speed == "fast": - model_with_prefix = f"fast/{model_with_prefix}" - prompt_cost, completion_cost = generic_cost_per_token( - model=model_with_prefix, usage=usage, custom_llm_provider="anthropic" + model=model, usage=usage, custom_llm_provider="anthropic" ) + # Apply provider_specific_entry multipliers for geo/speed routing + try: + model_info = litellm.get_model_info(model=model, custom_llm_provider="anthropic") + provider_specific_entry: dict = model_info.get("provider_specific_entry") or {} + + multiplier = 1.0 + if ( + hasattr(usage, "inference_geo") + and usage.inference_geo + and usage.inference_geo.lower() not in ["global", "not_available"] + ): + multiplier *= provider_specific_entry.get( + usage.inference_geo.lower(), 1.0 + ) + if hasattr(usage, "speed") and usage.speed == "fast": + multiplier *= provider_specific_entry.get("fast", 1.0) + + if multiplier != 1.0: + prompt_cost *= multiplier + completion_cost *= multiplier + except Exception: + pass + return prompt_cost, completion_cost diff --git a/litellm/model_prices_and_context_window_backup.json b/litellm/model_prices_and_context_window_backup.json index e54eaf89d7..f7ce1196cf 100644 --- a/litellm/model_prices_and_context_window_backup.json +++ b/litellm/model_prices_and_context_window_backup.json @@ -8295,37 +8295,6 @@ "supports_vision": true, "tool_use_system_prompt_tokens": 346 }, - "us/claude-sonnet-4-6": { - "cache_creation_input_token_cost": 4.125e-06, - "cache_creation_input_token_cost_above_200k_tokens": 8.25e-06, - "cache_read_input_token_cost": 3.3e-07, - "cache_read_input_token_cost_above_200k_tokens": 6.6e-07, - "input_cost_per_token": 3.3e-06, - "input_cost_per_token_above_200k_tokens": 6.6e-06, - "litellm_provider": "anthropic", - "max_input_tokens": 200000, - "max_output_tokens": 64000, - "max_tokens": 64000, - "mode": "chat", - "output_cost_per_token": 1.65e-05, - "output_cost_per_token_above_200k_tokens": 2.475e-05, - "search_context_cost_per_query": { - "search_context_size_high": 0.01, - "search_context_size_low": 0.01, - "search_context_size_medium": 0.01 - }, - "supports_assistant_prefill": true, - "supports_computer_use": true, - "supports_function_calling": true, - "supports_pdf_input": true, - "supports_prompt_caching": true, - "supports_reasoning": true, - "supports_response_schema": true, - "supports_tool_choice": true, - "supports_vision": true, - "tool_use_system_prompt_tokens": 346, - "inference_geo": "us" - }, "claude-sonnet-4-5-20250929-v1:0": { "cache_creation_input_token_cost": 3.75e-06, "cache_read_input_token_cost": 3e-07, @@ -8517,100 +8486,11 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "tool_use_system_prompt_tokens": 346 - }, - "fast/claude-opus-4-6": { - "cache_creation_input_token_cost": 6.25e-06, - "cache_creation_input_token_cost_above_200k_tokens": 1.25e-05, - "cache_creation_input_token_cost_above_1hr": 1e-05, - "cache_read_input_token_cost": 5e-07, - "cache_read_input_token_cost_above_200k_tokens": 1e-06, - "input_cost_per_token": 3e-05, - "input_cost_per_token_above_200k_tokens": 1e-05, - "litellm_provider": "anthropic", - "max_input_tokens": 1000000, - "max_output_tokens": 128000, - "max_tokens": 128000, - "mode": "chat", - "output_cost_per_token": 0.00015, - "output_cost_per_token_above_200k_tokens": 3.75e-05, - "search_context_cost_per_query": { - "search_context_size_high": 0.01, - "search_context_size_low": 0.01, - "search_context_size_medium": 0.01 - }, - "supports_assistant_prefill": false, - "supports_computer_use": true, - "supports_function_calling": true, - "supports_pdf_input": true, - "supports_prompt_caching": true, - "supports_reasoning": true, - "supports_response_schema": true, - "supports_tool_choice": true, - "supports_vision": true, - "tool_use_system_prompt_tokens": 346 - }, - "us/claude-opus-4-6": { - "cache_creation_input_token_cost": 6.875e-06, - "cache_creation_input_token_cost_above_200k_tokens": 1.375e-05, - "cache_creation_input_token_cost_above_1hr": 1.1e-05, - "cache_read_input_token_cost": 5.5e-07, - "cache_read_input_token_cost_above_200k_tokens": 1.1e-06, - "input_cost_per_token": 5.5e-06, - "input_cost_per_token_above_200k_tokens": 1.1e-05, - "litellm_provider": "anthropic", - "max_input_tokens": 200000, - "max_output_tokens": 128000, - "max_tokens": 128000, - "mode": "chat", - "output_cost_per_token": 2.75e-05, - "output_cost_per_token_above_200k_tokens": 4.125e-05, - "search_context_cost_per_query": { - "search_context_size_high": 0.01, - "search_context_size_low": 0.01, - "search_context_size_medium": 0.01 - }, - "supports_assistant_prefill": false, - "supports_computer_use": true, - "supports_function_calling": true, - "supports_pdf_input": true, - "supports_prompt_caching": true, - "supports_reasoning": true, - "supports_response_schema": true, - "supports_tool_choice": true, - "supports_vision": true, - "tool_use_system_prompt_tokens": 346 - }, - "fast/us/claude-opus-4-6": { - "cache_creation_input_token_cost": 6.875e-06, - "cache_creation_input_token_cost_above_200k_tokens": 1.375e-05, - "cache_creation_input_token_cost_above_1hr": 1.1e-05, - "cache_read_input_token_cost": 5.5e-07, - "cache_read_input_token_cost_above_200k_tokens": 1.1e-06, - "input_cost_per_token": 3e-05, - "input_cost_per_token_above_200k_tokens": 1.1e-05, - "litellm_provider": "anthropic", - "max_input_tokens": 200000, - "max_output_tokens": 128000, - "max_tokens": 128000, - "mode": "chat", - "output_cost_per_token": 0.00015, - "output_cost_per_token_above_200k_tokens": 4.125e-05, - "search_context_cost_per_query": { - "search_context_size_high": 0.01, - "search_context_size_low": 0.01, - "search_context_size_medium": 0.01 - }, - "supports_assistant_prefill": false, - "supports_computer_use": true, - "supports_function_calling": true, - "supports_pdf_input": true, - "supports_prompt_caching": true, - "supports_reasoning": true, - "supports_response_schema": true, - "supports_tool_choice": true, - "supports_vision": true, - "tool_use_system_prompt_tokens": 346 + "tool_use_system_prompt_tokens": 346, + "provider_specific_entry": { + "us": 1.1, + "fast": 1.1 + } }, "claude-opus-4-6-20260205": { "cache_creation_input_token_cost": 6.25e-06, @@ -8641,69 +8521,11 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "tool_use_system_prompt_tokens": 346 - }, - "fast/claude-opus-4-6-20260205": { - "cache_creation_input_token_cost": 6.25e-06, - "cache_creation_input_token_cost_above_200k_tokens": 1.25e-05, - "cache_creation_input_token_cost_above_1hr": 1e-05, - "cache_read_input_token_cost": 5e-07, - "cache_read_input_token_cost_above_200k_tokens": 1e-06, - "input_cost_per_token": 3e-05, - "input_cost_per_token_above_200k_tokens": 1e-05, - "litellm_provider": "anthropic", - "max_input_tokens": 1000000, - "max_output_tokens": 128000, - "max_tokens": 128000, - "mode": "chat", - "output_cost_per_token": 0.00015, - "output_cost_per_token_above_200k_tokens": 3.75e-05, - "search_context_cost_per_query": { - "search_context_size_high": 0.01, - "search_context_size_low": 0.01, - "search_context_size_medium": 0.01 - }, - "supports_assistant_prefill": false, - "supports_computer_use": true, - "supports_function_calling": true, - "supports_pdf_input": true, - "supports_prompt_caching": true, - "supports_reasoning": true, - "supports_response_schema": true, - "supports_tool_choice": true, - "supports_vision": true, - "tool_use_system_prompt_tokens": 346 - }, - "us/claude-opus-4-6-20260205": { - "cache_creation_input_token_cost": 6.875e-06, - "cache_creation_input_token_cost_above_200k_tokens": 1.375e-05, - "cache_creation_input_token_cost_above_1hr": 1.1e-05, - "cache_read_input_token_cost": 5.5e-07, - "cache_read_input_token_cost_above_200k_tokens": 1.1e-06, - "input_cost_per_token": 5.5e-06, - "input_cost_per_token_above_200k_tokens": 1.1e-05, - "litellm_provider": "anthropic", - "max_input_tokens": 200000, - "max_output_tokens": 128000, - "max_tokens": 128000, - "mode": "chat", - "output_cost_per_token": 2.75e-05, - "output_cost_per_token_above_200k_tokens": 4.125e-05, - "search_context_cost_per_query": { - "search_context_size_high": 0.01, - "search_context_size_low": 0.01, - "search_context_size_medium": 0.01 - }, - "supports_assistant_prefill": false, - "supports_computer_use": true, - "supports_function_calling": true, - "supports_pdf_input": true, - "supports_prompt_caching": true, - "supports_reasoning": true, - "supports_response_schema": true, - "supports_tool_choice": true, - "supports_vision": true, - "tool_use_system_prompt_tokens": 346 + "tool_use_system_prompt_tokens": 346, + "provider_specific_entry": { + "us": 1.1, + "fast": 1.1 + } }, "claude-sonnet-4-20250514": { "deprecation_date": "2026-05-14", diff --git a/litellm/types/utils.py b/litellm/types/utils.py index 7760a894c7..94c387dd22 100644 --- a/litellm/types/utils.py +++ b/litellm/types/utils.py @@ -1,47 +1,61 @@ import json import time from enum import Enum -from typing import (TYPE_CHECKING, Any, Dict, List, Literal, Mapping, Optional, - Union) +from typing import TYPE_CHECKING, Any, Dict, List, Literal, Mapping, Optional, Union from openai._models import BaseModel as OpenAIObject -from openai.types.audio.transcription_create_params import \ - FileTypes as FileTypes # type: ignore +from openai.types.audio.transcription_create_params import ( + FileTypes as FileTypes, # type: ignore +) from openai.types.chat.chat_completion import ChatCompletion as ChatCompletion -from openai.types.completion_usage import (CompletionTokensDetails, - CompletionUsage, - PromptTokensDetails) +from openai.types.completion_usage import ( + CompletionTokensDetails, + CompletionUsage, + PromptTokensDetails, +) from openai.types.moderation import Categories as Categories -from openai.types.moderation import \ - CategoryAppliedInputTypes as CategoryAppliedInputTypes +from openai.types.moderation import ( + CategoryAppliedInputTypes as CategoryAppliedInputTypes, +) from openai.types.moderation import CategoryScores as CategoryScores from openai.types.moderation_create_response import Moderation as Moderation -from openai.types.moderation_create_response import \ - ModerationCreateResponse as ModerationCreateResponse +from openai.types.moderation_create_response import ( + ModerationCreateResponse as ModerationCreateResponse, +) from pydantic import BaseModel, ConfigDict, Field, PrivateAttr, model_validator from typing_extensions import Required, TypedDict from litellm._uuid import uuid -from litellm.types.llms.base import (BaseLiteLLMOpenAIResponseObject, - LiteLLMPydanticObjectBase) +from litellm.types.llms.base import ( + BaseLiteLLMOpenAIResponseObject, + LiteLLMPydanticObjectBase, +) from litellm.types.mcp import MCPServerCostInfo from ..litellm_core_utils.core_helpers import map_finish_reason from .agents import LiteLLMSendMessageResponse from .guardrails import GuardrailEventHooks -from .llms.anthropic_messages.anthropic_response import \ - AnthropicMessagesResponse +from .llms.anthropic_messages.anthropic_response import AnthropicMessagesResponse from .llms.base import HiddenParams -from .llms.openai import (AllMessageValues, Batch, ChatCompletionAnnotation, - ChatCompletionRedactedThinkingBlock, - ChatCompletionThinkingBlock, - ChatCompletionToolCallChunk, ChatCompletionToolParam, - ChatCompletionUsageBlock, FileSearchTool, - FineTuningJob, ImageURLListItem, - OpenAIChatCompletionChunk, - OpenAIChatCompletionFinishReason, OpenAIFileObject, - OpenAIRealtimeStreamList, ResponsesAPIResponse, - WebSearchOptions) +from .llms.openai import ( + AllMessageValues, + Batch, + ChatCompletionAnnotation, + ChatCompletionRedactedThinkingBlock, + ChatCompletionThinkingBlock, + ChatCompletionToolCallChunk, + ChatCompletionToolParam, + ChatCompletionUsageBlock, + FileSearchTool, + FineTuningJob, + ImageURLListItem, + OpenAIChatCompletionChunk, + OpenAIChatCompletionFinishReason, + OpenAIFileObject, + OpenAIRealtimeStreamList, + ResponsesAPIResponse, + WebSearchOptions, +) from .rerank import RerankResponse as RerankResponse if TYPE_CHECKING: @@ -212,6 +226,7 @@ class ModelInfoBase(ProviderSpecificModelInfo, total=False): ] tpm: Optional[int] rpm: Optional[int] + provider_specific_entry: Optional[Dict[str, float]] class ModelInfo(ModelInfoBase, total=False): diff --git a/litellm/utils.py b/litellm/utils.py index 4771219d11..35d5c2fd80 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -5719,6 +5719,9 @@ def _get_model_info_helper( # noqa: PLR0915 annotation_cost_per_page=_model_info.get( "annotation_cost_per_page", None ), + provider_specific_entry=_model_info.get( + "provider_specific_entry", None + ), ) except Exception as e: verbose_logger.debug(f"Error getting model info: {e}") diff --git a/model_prices_and_context_window.json b/model_prices_and_context_window.json index e54eaf89d7..f7ce1196cf 100644 --- a/model_prices_and_context_window.json +++ b/model_prices_and_context_window.json @@ -8295,37 +8295,6 @@ "supports_vision": true, "tool_use_system_prompt_tokens": 346 }, - "us/claude-sonnet-4-6": { - "cache_creation_input_token_cost": 4.125e-06, - "cache_creation_input_token_cost_above_200k_tokens": 8.25e-06, - "cache_read_input_token_cost": 3.3e-07, - "cache_read_input_token_cost_above_200k_tokens": 6.6e-07, - "input_cost_per_token": 3.3e-06, - "input_cost_per_token_above_200k_tokens": 6.6e-06, - "litellm_provider": "anthropic", - "max_input_tokens": 200000, - "max_output_tokens": 64000, - "max_tokens": 64000, - "mode": "chat", - "output_cost_per_token": 1.65e-05, - "output_cost_per_token_above_200k_tokens": 2.475e-05, - "search_context_cost_per_query": { - "search_context_size_high": 0.01, - "search_context_size_low": 0.01, - "search_context_size_medium": 0.01 - }, - "supports_assistant_prefill": true, - "supports_computer_use": true, - "supports_function_calling": true, - "supports_pdf_input": true, - "supports_prompt_caching": true, - "supports_reasoning": true, - "supports_response_schema": true, - "supports_tool_choice": true, - "supports_vision": true, - "tool_use_system_prompt_tokens": 346, - "inference_geo": "us" - }, "claude-sonnet-4-5-20250929-v1:0": { "cache_creation_input_token_cost": 3.75e-06, "cache_read_input_token_cost": 3e-07, @@ -8517,100 +8486,11 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "tool_use_system_prompt_tokens": 346 - }, - "fast/claude-opus-4-6": { - "cache_creation_input_token_cost": 6.25e-06, - "cache_creation_input_token_cost_above_200k_tokens": 1.25e-05, - "cache_creation_input_token_cost_above_1hr": 1e-05, - "cache_read_input_token_cost": 5e-07, - "cache_read_input_token_cost_above_200k_tokens": 1e-06, - "input_cost_per_token": 3e-05, - "input_cost_per_token_above_200k_tokens": 1e-05, - "litellm_provider": "anthropic", - "max_input_tokens": 1000000, - "max_output_tokens": 128000, - "max_tokens": 128000, - "mode": "chat", - "output_cost_per_token": 0.00015, - "output_cost_per_token_above_200k_tokens": 3.75e-05, - "search_context_cost_per_query": { - "search_context_size_high": 0.01, - "search_context_size_low": 0.01, - "search_context_size_medium": 0.01 - }, - "supports_assistant_prefill": false, - "supports_computer_use": true, - "supports_function_calling": true, - "supports_pdf_input": true, - "supports_prompt_caching": true, - "supports_reasoning": true, - "supports_response_schema": true, - "supports_tool_choice": true, - "supports_vision": true, - "tool_use_system_prompt_tokens": 346 - }, - "us/claude-opus-4-6": { - "cache_creation_input_token_cost": 6.875e-06, - "cache_creation_input_token_cost_above_200k_tokens": 1.375e-05, - "cache_creation_input_token_cost_above_1hr": 1.1e-05, - "cache_read_input_token_cost": 5.5e-07, - "cache_read_input_token_cost_above_200k_tokens": 1.1e-06, - "input_cost_per_token": 5.5e-06, - "input_cost_per_token_above_200k_tokens": 1.1e-05, - "litellm_provider": "anthropic", - "max_input_tokens": 200000, - "max_output_tokens": 128000, - "max_tokens": 128000, - "mode": "chat", - "output_cost_per_token": 2.75e-05, - "output_cost_per_token_above_200k_tokens": 4.125e-05, - "search_context_cost_per_query": { - "search_context_size_high": 0.01, - "search_context_size_low": 0.01, - "search_context_size_medium": 0.01 - }, - "supports_assistant_prefill": false, - "supports_computer_use": true, - "supports_function_calling": true, - "supports_pdf_input": true, - "supports_prompt_caching": true, - "supports_reasoning": true, - "supports_response_schema": true, - "supports_tool_choice": true, - "supports_vision": true, - "tool_use_system_prompt_tokens": 346 - }, - "fast/us/claude-opus-4-6": { - "cache_creation_input_token_cost": 6.875e-06, - "cache_creation_input_token_cost_above_200k_tokens": 1.375e-05, - "cache_creation_input_token_cost_above_1hr": 1.1e-05, - "cache_read_input_token_cost": 5.5e-07, - "cache_read_input_token_cost_above_200k_tokens": 1.1e-06, - "input_cost_per_token": 3e-05, - "input_cost_per_token_above_200k_tokens": 1.1e-05, - "litellm_provider": "anthropic", - "max_input_tokens": 200000, - "max_output_tokens": 128000, - "max_tokens": 128000, - "mode": "chat", - "output_cost_per_token": 0.00015, - "output_cost_per_token_above_200k_tokens": 4.125e-05, - "search_context_cost_per_query": { - "search_context_size_high": 0.01, - "search_context_size_low": 0.01, - "search_context_size_medium": 0.01 - }, - "supports_assistant_prefill": false, - "supports_computer_use": true, - "supports_function_calling": true, - "supports_pdf_input": true, - "supports_prompt_caching": true, - "supports_reasoning": true, - "supports_response_schema": true, - "supports_tool_choice": true, - "supports_vision": true, - "tool_use_system_prompt_tokens": 346 + "tool_use_system_prompt_tokens": 346, + "provider_specific_entry": { + "us": 1.1, + "fast": 1.1 + } }, "claude-opus-4-6-20260205": { "cache_creation_input_token_cost": 6.25e-06, @@ -8641,69 +8521,11 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "tool_use_system_prompt_tokens": 346 - }, - "fast/claude-opus-4-6-20260205": { - "cache_creation_input_token_cost": 6.25e-06, - "cache_creation_input_token_cost_above_200k_tokens": 1.25e-05, - "cache_creation_input_token_cost_above_1hr": 1e-05, - "cache_read_input_token_cost": 5e-07, - "cache_read_input_token_cost_above_200k_tokens": 1e-06, - "input_cost_per_token": 3e-05, - "input_cost_per_token_above_200k_tokens": 1e-05, - "litellm_provider": "anthropic", - "max_input_tokens": 1000000, - "max_output_tokens": 128000, - "max_tokens": 128000, - "mode": "chat", - "output_cost_per_token": 0.00015, - "output_cost_per_token_above_200k_tokens": 3.75e-05, - "search_context_cost_per_query": { - "search_context_size_high": 0.01, - "search_context_size_low": 0.01, - "search_context_size_medium": 0.01 - }, - "supports_assistant_prefill": false, - "supports_computer_use": true, - "supports_function_calling": true, - "supports_pdf_input": true, - "supports_prompt_caching": true, - "supports_reasoning": true, - "supports_response_schema": true, - "supports_tool_choice": true, - "supports_vision": true, - "tool_use_system_prompt_tokens": 346 - }, - "us/claude-opus-4-6-20260205": { - "cache_creation_input_token_cost": 6.875e-06, - "cache_creation_input_token_cost_above_200k_tokens": 1.375e-05, - "cache_creation_input_token_cost_above_1hr": 1.1e-05, - "cache_read_input_token_cost": 5.5e-07, - "cache_read_input_token_cost_above_200k_tokens": 1.1e-06, - "input_cost_per_token": 5.5e-06, - "input_cost_per_token_above_200k_tokens": 1.1e-05, - "litellm_provider": "anthropic", - "max_input_tokens": 200000, - "max_output_tokens": 128000, - "max_tokens": 128000, - "mode": "chat", - "output_cost_per_token": 2.75e-05, - "output_cost_per_token_above_200k_tokens": 4.125e-05, - "search_context_cost_per_query": { - "search_context_size_high": 0.01, - "search_context_size_low": 0.01, - "search_context_size_medium": 0.01 - }, - "supports_assistant_prefill": false, - "supports_computer_use": true, - "supports_function_calling": true, - "supports_pdf_input": true, - "supports_prompt_caching": true, - "supports_reasoning": true, - "supports_response_schema": true, - "supports_tool_choice": true, - "supports_vision": true, - "tool_use_system_prompt_tokens": 346 + "tool_use_system_prompt_tokens": 346, + "provider_specific_entry": { + "us": 1.1, + "fast": 1.1 + } }, "claude-sonnet-4-20250514": { "deprecation_date": "2026-05-14", diff --git a/tests/test_litellm/test_utils.py b/tests/test_litellm/test_utils.py index 3ae4588278..6ae848307f 100644 --- a/tests/test_litellm/test_utils.py +++ b/tests/test_litellm/test_utils.py @@ -13,12 +13,12 @@ sys.path.insert( import litellm from litellm.proxy.utils import is_valid_api_key from litellm.types.utils import ( + CallTypes, Delta, LlmProviders, ModelResponseStream, StreamingChoices, ) -from litellm.types.utils import CallTypes from litellm.utils import ( ProviderConfigManager, TextCompletionStreamWrapper, @@ -714,6 +714,7 @@ def test_aaamodel_prices_and_context_window_json_is_valid(): "supports_preset": {"type": "boolean"}, "tool_use_system_prompt_tokens": {"type": "number"}, "tpm": {"type": "number"}, + "provider_specific_entry": {"type": "object"}, "supported_endpoints": { "type": "array", "items": { @@ -2337,7 +2338,7 @@ def test_register_model_with_scientific_notation(): Test that the register_model function can handle scientific notation in the model name. """ import uuid - + # Use a truly unique model name with uuid to avoid conflicts when tests run in parallel test_model_name = f"test-scientific-notation-model-{uuid.uuid4().hex[:12]}" @@ -2981,8 +2982,8 @@ class TestProxyLoggingBudgetAlerts: via metadata.soft_budget_alerting_emails to work even when global alerting is disabled. """ from litellm.caching.caching import DualCache - from litellm.proxy.utils import ProxyLogging from litellm.proxy._types import CallInfo, Litellm_EntityType + from litellm.proxy.utils import ProxyLogging proxy_logging = ProxyLogging(user_api_key_cache=DualCache()) proxy_logging.alerting = None # Global alerting is disabled @@ -3018,8 +3019,8 @@ class TestProxyLoggingBudgetAlerts: and do not send emails when alerting is None. """ from litellm.caching.caching import DualCache - from litellm.proxy.utils import ProxyLogging from litellm.proxy._types import CallInfo, Litellm_EntityType + from litellm.proxy.utils import ProxyLogging proxy_logging = ProxyLogging(user_api_key_cache=DualCache()) proxy_logging.alerting = None @@ -3050,8 +3051,8 @@ class TestProxyLoggingBudgetAlerts: Test that soft_budget alerts with empty alert_emails list still respect alerting=None. """ from litellm.caching.caching import DualCache - from litellm.proxy.utils import ProxyLogging from litellm.proxy._types import CallInfo, Litellm_EntityType + from litellm.proxy.utils import ProxyLogging proxy_logging = ProxyLogging(user_api_key_cache=DualCache()) proxy_logging.alerting = None