from typing import Literal, Optional, Tuple import httpx class OpenAILikeError(Exception): def __init__(self, status_code, message): self.status_code = status_code self.message = message self.request = httpx.Request(method="POST", url="https://www.litellm.ai") self.response = httpx.Response(status_code=status_code, request=self.request) super().__init__( self.message ) # Call the base class constructor with the parameters it needs class OpenAILikeBase: def __init__(self, **kwargs): pass def _validate_environment( self, api_key: Optional[str], api_base: Optional[str], endpoint_type: Literal["chat_completions", "embeddings"], headers: Optional[dict], custom_endpoint: Optional[bool], ) -> Tuple[str, dict]: if api_key is None and headers is None: raise OpenAILikeError( status_code=400, message="Missing API Key - A call is being made to LLM Provider but no key is set either in the environment variables ({LLM_PROVIDER}_API_KEY) or via params", ) if api_base is None: raise OpenAILikeError( status_code=400, message="Missing API Base - A call is being made to LLM Provider but no api base is set either in the environment variables ({LLM_PROVIDER}_API_KEY) or via params", ) if headers is None: headers = { "Content-Type": "application/json", } if ( api_key is not None and "Authorization" not in headers ): # [TODO] remove 'validate_environment' from OpenAI base. should use llm providers config for this only. headers.update({"Authorization": "Bearer {}".format(api_key)}) if not custom_endpoint: if endpoint_type == "chat_completions": api_base = "{}/chat/completions".format(api_base) elif endpoint_type == "embeddings": api_base = "{}/embeddings".format(api_base) return api_base, headers