From ead74dff114454ca5eba36c33bd09e36fedc3e4c Mon Sep 17 00:00:00 2001 From: Chesars Date: Tue, 10 Feb 2026 23:41:53 -0300 Subject: [PATCH] refactor: move credential helpers to provider common_utils modules Move get_openai_credentials() to litellm/llms/openai/common_utils.py and get_azure_credentials() to litellm/llms/azure/common_utils.py so they can be reused by batches/main.py and other modules. Signatures now take individual params instead of GenericLiteLLMParams. --- litellm/files/main.py | 153 ++++++++++++++-------------- litellm/llms/azure/common_utils.py | 38 ++++++- litellm/llms/openai/common_utils.py | 39 ++++++- 3 files changed, 154 insertions(+), 76 deletions(-) diff --git a/litellm/files/main.py b/litellm/files/main.py index 879e6fe69c0..f626f9b3466 100644 --- a/litellm/files/main.py +++ b/litellm/files/main.py @@ -7,11 +7,10 @@ https://platform.openai.com/docs/api-reference/files import asyncio import contextvars -import os import time import uuid as uuid_module from functools import partial -from typing import Any, Coroutine, Dict, Literal, NamedTuple, Optional, Union, cast +from typing import Any, Coroutine, Dict, Literal, Optional, Union, cast import httpx @@ -20,10 +19,12 @@ from litellm import get_secret_str from litellm.litellm_core_utils.get_llm_provider_logic import get_llm_provider from litellm.litellm_core_utils.litellm_logging import Logging as LiteLLMLoggingObj from litellm.llms.anthropic.files.handler import AnthropicFilesHandler +from litellm.llms.azure.common_utils import get_azure_credentials from litellm.llms.azure.files.handler import AzureOpenAIFilesAPI from litellm.llms.bedrock.files.handler import BedrockFilesHandler from litellm.llms.custom_httpx.http_handler import AsyncHTTPHandler, HTTPHandler from litellm.llms.custom_httpx.llm_http_handler import BaseLLMHTTPHandler +from litellm.llms.openai.common_utils import get_openai_credentials from litellm.llms.openai.openai import FileDeleted, FileObject, OpenAIFilesAPI from litellm.llms.vertex_ai.files.handler import VertexAIFilesHandler from litellm.types.llms.openai import ( @@ -57,68 +58,6 @@ anthropic_files_instance = AnthropicFilesHandler() ################################################# -class OpenAICredentials(NamedTuple): - api_base: Optional[str] - api_key: Optional[str] - organization: Optional[str] - - -class AzureCredentials(NamedTuple): - api_base: Optional[str] - api_key: Optional[str] - api_version: Optional[str] - - -def _get_openai_credentials( - optional_params: GenericLiteLLMParams, -) -> OpenAICredentials: - """Resolve OpenAI credentials from optional_params, litellm globals, and env vars.""" - api_base = ( - optional_params.api_base - or litellm.api_base - or os.getenv("OPENAI_BASE_URL") - or os.getenv("OPENAI_API_BASE") - or "https://api.openai.com/v1" - ) - organization = ( - optional_params.organization - or litellm.organization - or os.getenv("OPENAI_ORGANIZATION", None) - or None - ) - api_key = ( - optional_params.api_key - or litellm.api_key - or litellm.openai_key - or os.getenv("OPENAI_API_KEY") - ) - return OpenAICredentials(api_base=api_base, api_key=api_key, organization=organization) - - -def _get_azure_credentials( - optional_params: GenericLiteLLMParams, -) -> AzureCredentials: - """Resolve Azure credentials from optional_params, litellm globals, and env vars.""" - api_base = ( - optional_params.api_base - or litellm.api_base - or get_secret_str("AZURE_API_BASE") - ) - api_version = ( - optional_params.api_version - or litellm.api_version - or get_secret_str("AZURE_API_VERSION") - ) - api_key = ( - optional_params.api_key - or litellm.api_key - or litellm.azure_key - or get_secret_str("AZURE_OPENAI_API_KEY") - or get_secret_str("AZURE_API_KEY") - ) - return AzureCredentials(api_base=api_base, api_key=api_key, api_version=api_version) - - @client async def acreate_file( file: FileTypes, @@ -247,7 +186,11 @@ def create_file( timeout=timeout, ) elif custom_llm_provider in OPENAI_COMPATIBLE_BATCH_AND_FILES_PROVIDERS: - openai_creds = _get_openai_credentials(optional_params) + openai_creds = get_openai_credentials( + api_base=optional_params.api_base, + api_key=optional_params.api_key, + organization=optional_params.organization, + ) response = openai_files_instance.create_file( _is_async=_is_async, api_base=openai_creds.api_base, @@ -258,7 +201,11 @@ def create_file( create_file_data=_create_file_request, ) elif custom_llm_provider == "azure": - azure_creds = _get_azure_credentials(optional_params) + azure_creds = get_azure_credentials( + api_base=optional_params.api_base, + api_key=optional_params.api_key, + api_version=optional_params.api_version, + ) response = azure_files_instance.create_file( _is_async=_is_async, api_base=azure_creds.api_base, @@ -269,6 +216,32 @@ def create_file( create_file_data=_create_file_request, litellm_params=litellm_params_dict, ) + elif custom_llm_provider == "vertex_ai": + api_base = optional_params.api_base or "" + vertex_ai_project = ( + optional_params.vertex_project + or litellm.vertex_project + or get_secret_str("VERTEXAI_PROJECT") + ) + vertex_ai_location = ( + optional_params.vertex_location + or litellm.vertex_location + or get_secret_str("VERTEXAI_LOCATION") + ) + vertex_credentials = optional_params.vertex_credentials or get_secret_str( + "VERTEXAI_CREDENTIALS" + ) + + response = vertex_ai_files_instance.create_file( + _is_async=_is_async, + api_base=api_base, + vertex_project=vertex_ai_project, + vertex_location=vertex_ai_location, + vertex_credentials=vertex_credentials, + timeout=timeout, + max_retries=optional_params.max_retries, + create_file_data=_create_file_request, + ) else: raise litellm.exceptions.BadRequestError( message="LiteLLM doesn't support {} for 'create_file'. Only ['openai', 'azure', 'vertex_ai', 'manus'] are supported.".format( @@ -362,7 +335,11 @@ def file_retrieve( _is_async = kwargs.pop("is_async", False) is True if custom_llm_provider in OPENAI_COMPATIBLE_BATCH_AND_FILES_PROVIDERS: - openai_creds = _get_openai_credentials(optional_params) + openai_creds = get_openai_credentials( + api_base=optional_params.api_base, + api_key=optional_params.api_key, + organization=optional_params.organization, + ) response = openai_files_instance.retrieve_file( file_id=file_id, _is_async=_is_async, @@ -373,7 +350,11 @@ def file_retrieve( organization=openai_creds.organization, ) elif custom_llm_provider == "azure": - azure_creds = _get_azure_credentials(optional_params) + azure_creds = get_azure_credentials( + api_base=optional_params.api_base, + api_key=optional_params.api_key, + api_version=optional_params.api_version, + ) response = azure_files_instance.retrieve_file( _is_async=_is_async, api_base=azure_creds.api_base, @@ -530,7 +511,11 @@ def file_delete( timeout = 600.0 _is_async = kwargs.pop("is_async", False) is True if custom_llm_provider in OPENAI_COMPATIBLE_BATCH_AND_FILES_PROVIDERS: - openai_creds = _get_openai_credentials(optional_params) + openai_creds = get_openai_credentials( + api_base=optional_params.api_base, + api_key=optional_params.api_key, + organization=optional_params.organization, + ) response = openai_files_instance.delete_file( file_id=file_id, _is_async=_is_async, @@ -541,7 +526,11 @@ def file_delete( organization=openai_creds.organization, ) elif custom_llm_provider == "azure": - azure_creds = _get_azure_credentials(optional_params) + azure_creds = get_azure_credentials( + api_base=optional_params.api_base, + api_key=optional_params.api_key, + api_version=optional_params.api_version, + ) response = azure_files_instance.delete_file( _is_async=_is_async, api_base=azure_creds.api_base, @@ -729,7 +718,11 @@ def file_list( ) return response elif custom_llm_provider in OPENAI_COMPATIBLE_BATCH_AND_FILES_PROVIDERS: - openai_creds = _get_openai_credentials(optional_params) + openai_creds = get_openai_credentials( + api_base=optional_params.api_base, + api_key=optional_params.api_key, + organization=optional_params.organization, + ) response = openai_files_instance.list_files( purpose=purpose, _is_async=_is_async, @@ -740,7 +733,11 @@ def file_list( organization=openai_creds.organization, ) elif custom_llm_provider == "azure": - azure_creds = _get_azure_credentials(optional_params) + azure_creds = get_azure_credentials( + api_base=optional_params.api_base, + api_key=optional_params.api_key, + api_version=optional_params.api_version, + ) response = azure_files_instance.list_files( _is_async=_is_async, api_base=azure_creds.api_base, @@ -876,7 +873,11 @@ def file_content( return response if custom_llm_provider in OPENAI_COMPATIBLE_BATCH_AND_FILES_PROVIDERS: - openai_creds = _get_openai_credentials(optional_params) + openai_creds = get_openai_credentials( + api_base=optional_params.api_base, + api_key=optional_params.api_key, + organization=optional_params.organization, + ) response = openai_files_instance.file_content( _is_async=_is_async, file_content_request=_file_content_request, @@ -887,7 +888,11 @@ def file_content( organization=openai_creds.organization, ) elif custom_llm_provider == "azure": - azure_creds = _get_azure_credentials(optional_params) + azure_creds = get_azure_credentials( + api_base=optional_params.api_base, + api_key=optional_params.api_key, + api_version=optional_params.api_version, + ) response = azure_files_instance.file_content( _is_async=_is_async, api_base=azure_creds.api_base, diff --git a/litellm/llms/azure/common_utils.py b/litellm/llms/azure/common_utils.py index 25b218fca8c..7ed4306e299 100644 --- a/litellm/llms/azure/common_utils.py +++ b/litellm/llms/azure/common_utils.py @@ -1,6 +1,6 @@ import json import os -from typing import Any, Callable, Dict, Literal, Optional, Union, cast +from typing import Any, Callable, Dict, Literal, NamedTuple, Optional, Union, cast import httpx from openai import AsyncAzureOpenAI, AsyncOpenAI, AzureOpenAI, OpenAI @@ -789,3 +789,39 @@ class BaseAzureLLM(BaseOpenAILLM): return param_value return os.getenv(env_var_key) + +class AzureCredentials(NamedTuple): + api_base: Optional[str] + api_key: Optional[str] + api_version: Optional[str] + + +def get_azure_credentials( + api_base: Optional[str] = None, + api_key: Optional[str] = None, + api_version: Optional[str] = None, +) -> AzureCredentials: + """Resolve Azure credentials from params, litellm globals, and env vars.""" + resolved_api_base = ( + api_base + or litellm.api_base + or get_secret_str("AZURE_API_BASE") + ) + resolved_api_version = ( + api_version + or litellm.api_version + or get_secret_str("AZURE_API_VERSION") + ) + resolved_api_key = ( + api_key + or litellm.api_key + or litellm.azure_key + or get_secret_str("AZURE_OPENAI_API_KEY") + or get_secret_str("AZURE_API_KEY") + ) + return AzureCredentials( + api_base=resolved_api_base, + api_key=resolved_api_key, + api_version=resolved_api_version, + ) + diff --git a/litellm/llms/openai/common_utils.py b/litellm/llms/openai/common_utils.py index 61f150f1c2e..069448eba07 100644 --- a/litellm/llms/openai/common_utils.py +++ b/litellm/llms/openai/common_utils.py @@ -5,8 +5,9 @@ Common helpers / utils across al OpenAI endpoints import hashlib import inspect import json +import os import ssl -from typing import TYPE_CHECKING, Any, Dict, List, Literal, Optional, Tuple, Union +from typing import TYPE_CHECKING, Any, Dict, List, Literal, NamedTuple, Optional, Tuple, Union import httpx import openai @@ -244,3 +245,39 @@ class BaseOpenAILLM: ) +class OpenAICredentials(NamedTuple): + api_base: Optional[str] + api_key: Optional[str] + organization: Optional[str] + + +def get_openai_credentials( + api_base: Optional[str] = None, + api_key: Optional[str] = None, + organization: Optional[str] = None, +) -> OpenAICredentials: + """Resolve OpenAI credentials from params, litellm globals, and env vars.""" + resolved_api_base = ( + api_base + or litellm.api_base + or os.getenv("OPENAI_BASE_URL") + or os.getenv("OPENAI_API_BASE") + or "https://api.openai.com/v1" + ) + resolved_organization = ( + organization + or litellm.organization + or os.getenv("OPENAI_ORGANIZATION", None) + or None + ) + resolved_api_key = ( + api_key + or litellm.api_key + or litellm.openai_key + or os.getenv("OPENAI_API_KEY") + ) + return OpenAICredentials( + api_base=resolved_api_base, + api_key=resolved_api_key, + organization=resolved_organization, + )