Add openai evals in base http handler

This commit is contained in:
Sameer Kankute 2026-02-17 17:39:44 +05:30
parent 5cc0036c87
commit 71385a4e12
2 changed files with 689 additions and 3 deletions

View File

@ -1732,6 +1732,25 @@ def __getattr__(name: str) -> Any:
_globals["_service_logger"] = litellm._service_logger
return _globals["_service_logger"]
# Lazy load evals module functions
if name in ["acreate_eval", "alist_evals", "aget_eval", "aupdate_eval", "adelete_eval", "acancel_eval",
"create_eval", "list_evals", "get_eval", "update_eval", "delete_eval", "cancel_eval"]:
from litellm.evals.main import (
acreate_eval,
alist_evals,
aget_eval,
aupdate_eval,
adelete_eval,
acancel_eval,
create_eval,
list_evals,
get_eval,
update_eval,
delete_eval,
cancel_eval,
)
return locals()[name]
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")

View File

@ -21,6 +21,9 @@ import litellm.litellm_core_utils
import litellm.types
import litellm.types.utils
from litellm._logging import verbose_logger
from litellm.anthropic_beta_headers_manager import (
update_headers_with_filtered_beta,
)
from litellm.constants import REALTIME_WEBSOCKET_MAX_MESSAGE_SIZE_BYTES
from litellm.litellm_core_utils.realtime_streaming import RealTimeStreaming
from litellm.llms.base_llm.anthropic_messages.transformation import (
@ -81,9 +84,6 @@ from litellm.types.llms.anthropic_skills import (
ListSkillsResponse,
Skill,
)
from litellm.anthropic_beta_headers_manager import (
update_headers_with_filtered_beta,
)
from litellm.types.llms.openai import (
CreateBatchRequest,
CreateFileRequest,
@ -132,7 +132,14 @@ if TYPE_CHECKING:
from aiohttp import ClientSession
from litellm.litellm_core_utils.litellm_logging import Logging as _LiteLLMLoggingObj
from litellm.llms.base_llm.evals.transformation import BaseEvalsAPIConfig
from litellm.llms.base_llm.passthrough.transformation import BasePassthroughConfig
from litellm.types.llms.openai_evals import (
CancelEvalResponse,
DeleteEvalResponse,
Eval,
ListEvalsResponse,
)
LiteLLMLoggingObj = _LiteLLMLoggingObj
else:
@ -4599,6 +4606,7 @@ class BaseLLMHTTPHandler:
BaseSkillsAPIConfig,
"BasePassthroughConfig",
"BaseContainerConfig",
BaseEvalsAPIConfig,
],
):
status_code = getattr(e, "status_code", 500)
@ -9316,3 +9324,662 @@ class BaseLLMHTTPHandler:
raw_response=response,
logging_obj=logging_obj,
)
# ===================================
# Evals API Handlers
# ===================================
def create_eval_handler(
self,
url: str,
request_body: Dict,
evals_api_provider_config: "BaseEvalsAPIConfig",
custom_llm_provider: str,
litellm_params: GenericLiteLLMParams,
logging_obj: LiteLLMLoggingObj,
extra_headers: Optional[Dict[str, Any]] = None,
timeout: Optional[Union[float, httpx.Timeout]] = None,
client: Optional[Union[HTTPHandler, AsyncHTTPHandler]] = None,
_is_async: bool = False,
shared_session: Optional["ClientSession"] = None,
) -> Union["Eval", Coroutine[Any, Any, "Eval"]]:
"""Create an eval"""
if _is_async:
return self.async_create_eval_handler(
url=url,
request_body=request_body,
evals_api_provider_config=evals_api_provider_config,
custom_llm_provider=custom_llm_provider,
litellm_params=litellm_params,
logging_obj=logging_obj,
extra_headers=extra_headers,
timeout=timeout,
client=client,
shared_session=shared_session,
)
if client is None or not isinstance(client, HTTPHandler):
sync_httpx_client = _get_httpx_client(
params={"ssl_verify": litellm_params.get("ssl_verify", None)}
)
else:
sync_httpx_client = client
headers = extra_headers or {}
logging_obj.pre_call(
input=request_body.get("display_name", ""),
api_key="",
additional_args={
"complete_input_dict": request_body,
"api_base": url,
"headers": headers,
},
)
try:
response = sync_httpx_client.post(
url=url, headers=headers, json=request_body, timeout=timeout
)
except Exception as e:
raise self._handle_error(
e=e,
provider_config=evals_api_provider_config,
)
return evals_api_provider_config.transform_create_eval_response(
raw_response=response,
logging_obj=logging_obj,
)
async def async_create_eval_handler(
self,
url: str,
request_body: Dict,
evals_api_provider_config: "BaseEvalsAPIConfig",
custom_llm_provider: str,
litellm_params: GenericLiteLLMParams,
logging_obj: LiteLLMLoggingObj,
extra_headers: Optional[Dict[str, Any]] = None,
timeout: Optional[Union[float, httpx.Timeout]] = None,
client: Optional[Union[HTTPHandler, AsyncHTTPHandler]] = None,
shared_session: Optional["ClientSession"] = None,
) -> "Eval":
"""Async create an eval"""
if client is None or not isinstance(client, AsyncHTTPHandler):
async_httpx_client = get_async_httpx_client(
llm_provider=litellm.LlmProviders(custom_llm_provider),
params={"ssl_verify": litellm_params.get("ssl_verify", None)},
)
else:
async_httpx_client = client
headers = extra_headers or {}
logging_obj.pre_call(
input=request_body.get("name", ""),
api_key="",
additional_args={
"complete_input_dict": request_body,
"api_base": url,
"headers": headers,
},
)
try:
response = await async_httpx_client.post(
url=url, headers=headers, json=request_body, timeout=timeout
)
except Exception as e:
raise self._handle_error(
e=e,
provider_config=evals_api_provider_config,
)
return evals_api_provider_config.transform_create_eval_response(
raw_response=response,
logging_obj=logging_obj,
)
def list_evals_handler(
self,
url: str,
query_params: Dict,
evals_api_provider_config: "BaseEvalsAPIConfig",
custom_llm_provider: str,
litellm_params: GenericLiteLLMParams,
logging_obj: LiteLLMLoggingObj,
extra_headers: Optional[Dict[str, Any]] = None,
timeout: Optional[Union[float, httpx.Timeout]] = None,
client: Optional[Union[HTTPHandler, AsyncHTTPHandler]] = None,
_is_async: bool = False,
shared_session: Optional["ClientSession"] = None,
) -> Union["ListEvalsResponse", Coroutine[Any, Any, "ListEvalsResponse"]]:
"""List evals"""
if _is_async:
return self.async_list_evals_handler(
url=url,
query_params=query_params,
evals_api_provider_config=evals_api_provider_config,
custom_llm_provider=custom_llm_provider,
litellm_params=litellm_params,
logging_obj=logging_obj,
extra_headers=extra_headers,
timeout=timeout,
client=client,
shared_session=shared_session,
)
if client is None or not isinstance(client, HTTPHandler):
sync_httpx_client = _get_httpx_client(
params={"ssl_verify": litellm_params.get("ssl_verify", None)}
)
else:
sync_httpx_client = client
headers = extra_headers or {}
logging_obj.pre_call(
input="",
api_key="",
additional_args={
"complete_input_dict": query_params,
"api_base": url,
"headers": headers,
},
)
try:
response = sync_httpx_client.get(
url=url, headers=headers, params=query_params
)
except Exception as e:
raise self._handle_error(
e=e,
provider_config=evals_api_provider_config,
)
return evals_api_provider_config.transform_list_evals_response(
raw_response=response,
logging_obj=logging_obj,
)
async def async_list_evals_handler(
self,
url: str,
query_params: Dict,
evals_api_provider_config: "BaseEvalsAPIConfig",
custom_llm_provider: str,
litellm_params: GenericLiteLLMParams,
logging_obj: LiteLLMLoggingObj,
extra_headers: Optional[Dict[str, Any]] = None,
timeout: Optional[Union[float, httpx.Timeout]] = None,
client: Optional[Union[HTTPHandler, AsyncHTTPHandler]] = None,
shared_session: Optional["ClientSession"] = None,
) -> "ListEvalsResponse":
"""Async list evals"""
if client is None or not isinstance(client, AsyncHTTPHandler):
async_httpx_client = get_async_httpx_client(
llm_provider=litellm.LlmProviders(custom_llm_provider),
params={"ssl_verify": litellm_params.get("ssl_verify", None)},
)
else:
async_httpx_client = client
headers = extra_headers or {}
logging_obj.pre_call(
input="",
api_key="",
additional_args={
"complete_input_dict": query_params,
"api_base": url,
"headers": headers,
},
)
try:
response = await async_httpx_client.get(
url=url, headers=headers, params=query_params
)
except Exception as e:
raise self._handle_error(
e=e,
provider_config=evals_api_provider_config,
)
return evals_api_provider_config.transform_list_evals_response(
raw_response=response,
logging_obj=logging_obj,
)
def get_eval_handler(
self,
url: str,
evals_api_provider_config: "BaseEvalsAPIConfig",
custom_llm_provider: str,
litellm_params: GenericLiteLLMParams,
logging_obj: LiteLLMLoggingObj,
extra_headers: Optional[Dict[str, Any]] = None,
timeout: Optional[Union[float, httpx.Timeout]] = None,
client: Optional[Union[HTTPHandler, AsyncHTTPHandler]] = None,
_is_async: bool = False,
shared_session: Optional["ClientSession"] = None,
) -> Union["Eval", Coroutine[Any, Any, "Eval"]]:
"""Get an eval"""
if _is_async:
return self.async_get_eval_handler(
url=url,
evals_api_provider_config=evals_api_provider_config,
custom_llm_provider=custom_llm_provider,
litellm_params=litellm_params,
logging_obj=logging_obj,
extra_headers=extra_headers,
timeout=timeout,
client=client,
shared_session=shared_session,
)
if client is None or not isinstance(client, HTTPHandler):
sync_httpx_client = _get_httpx_client(
params={"ssl_verify": litellm_params.get("ssl_verify", None)}
)
else:
sync_httpx_client = client
headers = extra_headers or {}
logging_obj.pre_call(
input="",
api_key="",
additional_args={
"api_base": url,
"headers": headers,
},
)
try:
response = sync_httpx_client.get(url=url, headers=headers)
except Exception as e:
raise self._handle_error(
e=e,
provider_config=evals_api_provider_config,
)
return evals_api_provider_config.transform_get_eval_response(
raw_response=response,
logging_obj=logging_obj,
)
async def async_get_eval_handler(
self,
url: str,
evals_api_provider_config: "BaseEvalsAPIConfig",
custom_llm_provider: str,
litellm_params: GenericLiteLLMParams,
logging_obj: LiteLLMLoggingObj,
extra_headers: Optional[Dict[str, Any]] = None,
timeout: Optional[Union[float, httpx.Timeout]] = None,
client: Optional[Union[HTTPHandler, AsyncHTTPHandler]] = None,
shared_session: Optional["ClientSession"] = None,
) -> "Eval":
"""Async get an eval"""
if client is None or not isinstance(client, AsyncHTTPHandler):
async_httpx_client = get_async_httpx_client(
llm_provider=litellm.LlmProviders(custom_llm_provider),
params={"ssl_verify": litellm_params.get("ssl_verify", None)},
)
else:
async_httpx_client = client
headers = extra_headers or {}
logging_obj.pre_call(
input="",
api_key="",
additional_args={
"api_base": url,
"headers": headers,
},
)
try:
response = await async_httpx_client.get(
url=url, headers=headers
)
except Exception as e:
raise self._handle_error(
e=e,
provider_config=evals_api_provider_config,
)
return evals_api_provider_config.transform_get_eval_response(
raw_response=response,
logging_obj=logging_obj,
)
def update_eval_handler(
self,
url: str,
request_body: Dict,
evals_api_provider_config: "BaseEvalsAPIConfig",
custom_llm_provider: str,
litellm_params: GenericLiteLLMParams,
logging_obj: LiteLLMLoggingObj,
extra_headers: Optional[Dict[str, Any]] = None,
timeout: Optional[Union[float, httpx.Timeout]] = None,
client: Optional[Union[HTTPHandler, AsyncHTTPHandler]] = None,
_is_async: bool = False,
shared_session: Optional["ClientSession"] = None,
) -> Union["Eval", Coroutine[Any, Any, "Eval"]]:
"""Update an eval"""
if _is_async:
return self.async_update_eval_handler(
url=url,
request_body=request_body,
evals_api_provider_config=evals_api_provider_config,
custom_llm_provider=custom_llm_provider,
litellm_params=litellm_params,
logging_obj=logging_obj,
extra_headers=extra_headers,
timeout=timeout,
client=client,
shared_session=shared_session,
)
if client is None or not isinstance(client, HTTPHandler):
sync_httpx_client = _get_httpx_client(
params={"ssl_verify": litellm_params.get("ssl_verify", None)}
)
else:
sync_httpx_client = client
headers = extra_headers or {}
logging_obj.pre_call(
input=request_body.get("display_name", ""),
api_key="",
additional_args={
"complete_input_dict": request_body,
"api_base": url,
"headers": headers,
},
)
try:
response = sync_httpx_client.post(
url=url, headers=headers, json=request_body, timeout=timeout
)
except Exception as e:
raise self._handle_error(
e=e,
provider_config=evals_api_provider_config,
)
return evals_api_provider_config.transform_update_eval_response(
raw_response=response,
logging_obj=logging_obj,
)
async def async_update_eval_handler(
self,
url: str,
request_body: Dict,
evals_api_provider_config: "BaseEvalsAPIConfig",
custom_llm_provider: str,
litellm_params: GenericLiteLLMParams,
logging_obj: LiteLLMLoggingObj,
extra_headers: Optional[Dict[str, Any]] = None,
timeout: Optional[Union[float, httpx.Timeout]] = None,
client: Optional[Union[HTTPHandler, AsyncHTTPHandler]] = None,
shared_session: Optional["ClientSession"] = None,
) -> "Eval":
"""Async update an eval"""
if client is None or not isinstance(client, AsyncHTTPHandler):
async_httpx_client = get_async_httpx_client(
llm_provider=litellm.LlmProviders(custom_llm_provider),
params={"ssl_verify": litellm_params.get("ssl_verify", None)},
)
else:
async_httpx_client = client
headers = extra_headers or {}
logging_obj.pre_call(
input=request_body.get("display_name", ""),
api_key="",
additional_args={
"complete_input_dict": request_body,
"api_base": url,
"headers": headers,
},
)
try:
response = await async_httpx_client.post(
url=url, headers=headers, json=request_body, timeout=timeout
)
except Exception as e:
raise self._handle_error(
e=e,
provider_config=evals_api_provider_config,
)
return evals_api_provider_config.transform_update_eval_response(
raw_response=response,
logging_obj=logging_obj,
)
def delete_eval_handler(
self,
url: str,
evals_api_provider_config: "BaseEvalsAPIConfig",
custom_llm_provider: str,
litellm_params: GenericLiteLLMParams,
logging_obj: LiteLLMLoggingObj,
extra_headers: Optional[Dict[str, Any]] = None,
timeout: Optional[Union[float, httpx.Timeout]] = None,
client: Optional[Union[HTTPHandler, AsyncHTTPHandler]] = None,
_is_async: bool = False,
shared_session: Optional["ClientSession"] = None,
) -> Union["DeleteEvalResponse", Coroutine[Any, Any, "DeleteEvalResponse"]]:
"""Delete an eval"""
if _is_async:
return self.async_delete_eval_handler(
url=url,
evals_api_provider_config=evals_api_provider_config,
custom_llm_provider=custom_llm_provider,
litellm_params=litellm_params,
logging_obj=logging_obj,
extra_headers=extra_headers,
timeout=timeout,
client=client,
shared_session=shared_session,
)
if client is None or not isinstance(client, HTTPHandler):
sync_httpx_client = _get_httpx_client(
params={"ssl_verify": litellm_params.get("ssl_verify", None)}
)
else:
sync_httpx_client = client
headers = extra_headers or {}
logging_obj.pre_call(
input="",
api_key="",
additional_args={
"api_base": url,
"headers": headers,
},
)
try:
response = sync_httpx_client.delete(
url=url, headers=headers, timeout=timeout
)
except Exception as e:
raise self._handle_error(
e=e,
provider_config=evals_api_provider_config,
)
return evals_api_provider_config.transform_delete_eval_response(
raw_response=response,
logging_obj=logging_obj,
)
async def async_delete_eval_handler(
self,
url: str,
evals_api_provider_config: "BaseEvalsAPIConfig",
custom_llm_provider: str,
litellm_params: GenericLiteLLMParams,
logging_obj: LiteLLMLoggingObj,
extra_headers: Optional[Dict[str, Any]] = None,
timeout: Optional[Union[float, httpx.Timeout]] = None,
client: Optional[Union[HTTPHandler, AsyncHTTPHandler]] = None,
shared_session: Optional["ClientSession"] = None,
) -> "DeleteEvalResponse":
"""Async delete an eval"""
if client is None or not isinstance(client, AsyncHTTPHandler):
async_httpx_client = get_async_httpx_client(
llm_provider=litellm.LlmProviders(custom_llm_provider),
params={"ssl_verify": litellm_params.get("ssl_verify", None)},
)
else:
async_httpx_client = client
headers = extra_headers or {}
logging_obj.pre_call(
input="",
api_key="",
additional_args={
"api_base": url,
"headers": headers,
},
)
try:
response = await async_httpx_client.delete(
url=url, headers=headers, timeout=timeout
)
except Exception as e:
raise self._handle_error(
e=e,
provider_config=evals_api_provider_config,
)
return evals_api_provider_config.transform_delete_eval_response(
raw_response=response,
logging_obj=logging_obj,
)
def cancel_eval_handler(
self,
url: str,
evals_api_provider_config: "BaseEvalsAPIConfig",
custom_llm_provider: str,
litellm_params: GenericLiteLLMParams,
logging_obj: LiteLLMLoggingObj,
extra_headers: Optional[Dict[str, Any]] = None,
timeout: Optional[Union[float, httpx.Timeout]] = None,
client: Optional[Union[HTTPHandler, AsyncHTTPHandler]] = None,
_is_async: bool = False,
shared_session: Optional["ClientSession"] = None,
) -> Union["CancelEvalResponse", Coroutine[Any, Any, "CancelEvalResponse"]]:
"""Cancel an eval"""
if _is_async:
return self.async_cancel_eval_handler(
url=url,
evals_api_provider_config=evals_api_provider_config,
custom_llm_provider=custom_llm_provider,
litellm_params=litellm_params,
logging_obj=logging_obj,
extra_headers=extra_headers,
timeout=timeout,
client=client,
shared_session=shared_session,
)
if client is None or not isinstance(client, HTTPHandler):
sync_httpx_client = _get_httpx_client(
params={"ssl_verify": litellm_params.get("ssl_verify", None)}
)
else:
sync_httpx_client = client
headers = extra_headers or {}
logging_obj.pre_call(
input="",
api_key="",
additional_args={
"api_base": url,
"headers": headers,
},
)
try:
response = sync_httpx_client.post(
url=url, headers=headers, json={}, timeout=timeout
)
except Exception as e:
raise self._handle_error(
e=e,
provider_config=evals_api_provider_config,
)
return evals_api_provider_config.transform_cancel_eval_response(
raw_response=response,
logging_obj=logging_obj,
)
async def async_cancel_eval_handler(
self,
url: str,
evals_api_provider_config: "BaseEvalsAPIConfig",
custom_llm_provider: str,
litellm_params: GenericLiteLLMParams,
logging_obj: LiteLLMLoggingObj,
extra_headers: Optional[Dict[str, Any]] = None,
timeout: Optional[Union[float, httpx.Timeout]] = None,
client: Optional[Union[HTTPHandler, AsyncHTTPHandler]] = None,
shared_session: Optional["ClientSession"] = None,
) -> "CancelEvalResponse":
"""Async cancel an eval"""
if client is None or not isinstance(client, AsyncHTTPHandler):
async_httpx_client = get_async_httpx_client(
llm_provider=litellm.LlmProviders(custom_llm_provider),
params={"ssl_verify": litellm_params.get("ssl_verify", None)},
)
else:
async_httpx_client = client
headers = extra_headers or {}
logging_obj.pre_call(
input="",
api_key="",
additional_args={
"api_base": url,
"headers": headers,
},
)
try:
response = await async_httpx_client.post(
url=url, headers=headers, json={}, timeout=timeout
)
except Exception as e:
raise self._handle_error(
e=e,
provider_config=evals_api_provider_config,
)
return evals_api_provider_config.transform_cancel_eval_response(
raw_response=response,
logging_obj=logging_obj,
)