Files
lijiaoqiao/llm-gateway-competitors/litellm-wheel-src/litellm/llms/databricks/responses/transformation.py
2026-03-26 20:06:14 +08:00

105 lines
3.6 KiB
Python

"""
Databricks Responses API configuration.
Inherits from OpenAIResponsesAPIConfig since Databricks' Responses API
is compatible with OpenAI's for GPT models.
Reference: https://docs.databricks.com/aws/en/machine-learning/foundation-model-apis/api-reference
"""
import os
from typing import TYPE_CHECKING, Any, Dict, Optional, Union
from litellm.llms.databricks.common_utils import DatabricksBase
from litellm.llms.openai.responses.transformation import OpenAIResponsesAPIConfig
from litellm.types.llms.openai import ResponseInputParam
from litellm.types.router import GenericLiteLLMParams
from litellm.types.utils import LlmProviders
if TYPE_CHECKING:
from litellm.litellm_core_utils.litellm_logging import Logging as _LiteLLMLoggingObj
LiteLLMLoggingObj = _LiteLLMLoggingObj
else:
LiteLLMLoggingObj = Any
class DatabricksResponsesAPIConfig(DatabricksBase, OpenAIResponsesAPIConfig):
"""
Configuration for Databricks Responses API.
Inherits from OpenAIResponsesAPIConfig since Databricks' Responses API
is largely compatible with OpenAI's for GPT models.
Note: The Responses API on Databricks is only compatible with OpenAI GPT models.
"""
@property
def custom_llm_provider(self) -> LlmProviders:
return LlmProviders.DATABRICKS
def validate_environment(
self,
headers: dict,
model: str,
litellm_params: Optional[GenericLiteLLMParams],
) -> dict:
litellm_params = litellm_params or GenericLiteLLMParams()
api_key = litellm_params.api_key or os.getenv("DATABRICKS_API_KEY")
api_base = litellm_params.api_base or os.getenv("DATABRICKS_API_BASE")
# Reuse Databricks auth logic (OAuth M2M, PAT, SDK fallback).
# custom_endpoint=False allows SDK auth fallback; the appended
# /chat/completions suffix is harmless since we discard api_base
# here and build the URL separately in get_complete_url().
_, headers = self.databricks_validate_environment(
api_key=api_key,
api_base=api_base,
endpoint_type="chat_completions",
custom_endpoint=False,
headers=headers,
)
headers["Content-Type"] = "application/json"
return headers
def get_complete_url(
self,
api_base: Optional[str],
litellm_params: dict,
) -> str:
api_base = api_base or os.getenv("DATABRICKS_API_BASE")
api_base = self._get_api_base(api_base)
api_base = api_base.rstrip("/")
return f"{api_base}/responses"
def transform_responses_api_request(
self,
model: str,
input: Union[str, ResponseInputParam],
response_api_optional_request_params: Dict,
litellm_params: GenericLiteLLMParams,
headers: dict,
) -> Dict:
"""
Transform request for Databricks Responses API.
Strips the 'databricks/' prefix from model name if present,
then delegates to OpenAI's transformation.
"""
# Strip provider prefix if present (e.g., "databricks/databricks-gpt-5-nano" -> "databricks-gpt-5-nano")
if model.startswith("databricks/"):
model = model[len("databricks/") :]
return super().transform_responses_api_request(
model=model,
input=input,
response_api_optional_request_params=response_api_optional_request_params,
litellm_params=litellm_params,
headers=headers,
)
def supports_native_websocket(self) -> bool:
"""Databricks does not support native WebSocket for Responses API"""
return False