""" This file contains common utils for anthropic calls. """ from typing import Optional, Union import httpx import litellm from litellm.llms.base_llm.base_utils import BaseLLMModelInfo from litellm.llms.base_llm.chat.transformation import BaseLLMException from litellm.secret_managers.main import get_secret_str class AnthropicError(BaseLLMException): def __init__( self, status_code: int, message, headers: Optional[httpx.Headers] = None, ): super().__init__(status_code=status_code, message=message, headers=headers) class AnthropicModelInfo(BaseLLMModelInfo): @staticmethod def get_api_base(api_base: Optional[str] = None) -> Optional[str]: return ( api_base or get_secret_str("ANTHROPIC_API_BASE") or "https://api.anthropic.com" ) @staticmethod def get_api_key(api_key: Optional[str] = None) -> Optional[str]: return api_key or get_secret_str("ANTHROPIC_API_KEY") @staticmethod def get_base_model(model: Optional[str] = None) -> Optional[str]: return model.replace("anthropic/", "") if model else None def get_models( self, api_key: Optional[str] = None, api_base: Optional[str] = None ) -> list[str]: api_base = AnthropicModelInfo.get_api_base(api_base) api_key = AnthropicModelInfo.get_api_key(api_key) if api_base is None or api_key is None: raise ValueError( "ANTHROPIC_API_BASE or ANTHROPIC_API_KEY is not set. Please set the environment variable, to query Anthropic's `/models` endpoint." ) response = litellm.module_level_client.get( url=f"{api_base}/v1/models", headers={"x-api-key": api_key, "anthropic-version": "2023-06-01"}, ) try: response.raise_for_status() except httpx.HTTPStatusError: raise Exception( f"Failed to fetch models from Anthropic. Status code: {response.status_code}, Response: {response.text}" ) models = response.json()["data"] litellm_model_names = [] for model in models: stripped_model_name = model["id"] litellm_model_name = "anthropic/" + stripped_model_name litellm_model_names.append(litellm_model_name) return litellm_model_names def process_anthropic_headers(headers: Union[httpx.Headers, dict]) -> dict: openai_headers = {} if "anthropic-ratelimit-requests-limit" in headers: openai_headers["x-ratelimit-limit-requests"] = headers[ "anthropic-ratelimit-requests-limit" ] if "anthropic-ratelimit-requests-remaining" in headers: openai_headers["x-ratelimit-remaining-requests"] = headers[ "anthropic-ratelimit-requests-remaining" ] if "anthropic-ratelimit-tokens-limit" in headers: openai_headers["x-ratelimit-limit-tokens"] = headers[ "anthropic-ratelimit-tokens-limit" ] if "anthropic-ratelimit-tokens-remaining" in headers: openai_headers["x-ratelimit-remaining-tokens"] = headers[ "anthropic-ratelimit-tokens-remaining" ] llm_response_headers = { "{}-{}".format("llm_provider", k): v for k, v in headers.items() } additional_headers = {**llm_response_headers, **openai_headers} return additional_headers