mirror of
https://github.com/BerriAI/litellm.git
synced 2025-04-25 10:44:24 +00:00
* test(azure_openai_o1.py): initial commit with testing for azure openai o1 preview model * fix(base_llm_unit_tests.py): handle azure o1 preview response format tests skip as o1 on azure doesn't support tool calling yet * fix: initial commit of azure o1 handler using openai caller simplifies calling + allows fake streaming logic alr. implemented for openai to just work * feat(azure/o1_handler.py): fake o1 streaming for azure o1 models azure does not currently support streaming for o1 * feat(o1_transformation.py): support overriding 'should_fake_stream' on azure/o1 via 'supports_native_streaming' param on model info enables user to toggle on when azure allows o1 streaming without needing to bump versions * style(router.py): remove 'give feedback/get help' messaging when router is used Prevents noisy messaging Closes https://github.com/BerriAI/litellm/issues/5942 * fix(types/utils.py): handle none logprobs Fixes https://github.com/BerriAI/litellm/issues/328 * fix(exception_mapping_utils.py): fix error str unbound error * refactor(azure_ai/): move to openai_like chat completion handler allows for easy swapping of api base url's (e.g. ai.services.com) Fixes https://github.com/BerriAI/litellm/issues/7275 * refactor(azure_ai/): move to base llm http handler * fix(azure_ai/): handle differing api endpoints * fix(azure_ai/): make sure all unit tests are passing * fix: fix linting errors * fix: fix linting errors * fix: fix linting error * fix: fix linting errors * fix(azure_ai/transformation.py): handle extra body param * fix(azure_ai/transformation.py): fix max retries param handling * fix: fix test * test(test_azure_o1.py): fix test * fix(llm_http_handler.py): support handling azure ai unprocessable entity error * fix(llm_http_handler.py): handle sync invalid param error for azure ai * fix(azure_ai/): streaming support with base_llm_http_handler * fix(llm_http_handler.py): working sync stream calls with unprocessable entity handling for azure ai * fix: fix linting errors * fix(llm_http_handler.py): fix linting error * fix(azure_ai/): handle cohere tool call invalid index param error
92 lines
2.9 KiB
Python
92 lines
2.9 KiB
Python
"""
|
|
Common helpers / utils across al OpenAI endpoints
|
|
"""
|
|
|
|
import json
|
|
from typing import Any, Dict, List, Optional, Union
|
|
|
|
import httpx
|
|
import openai
|
|
|
|
from litellm.llms.base_llm.chat.transformation import BaseLLMException
|
|
|
|
|
|
class OpenAIError(BaseLLMException):
|
|
def __init__(
|
|
self,
|
|
status_code: int,
|
|
message: str,
|
|
request: Optional[httpx.Request] = None,
|
|
response: Optional[httpx.Response] = None,
|
|
headers: Optional[Union[dict, httpx.Headers]] = None,
|
|
):
|
|
self.status_code = status_code
|
|
self.message = message
|
|
self.headers = headers
|
|
if request:
|
|
self.request = request
|
|
else:
|
|
self.request = httpx.Request(method="POST", url="https://api.openai.com/v1")
|
|
if response:
|
|
self.response = response
|
|
else:
|
|
self.response = httpx.Response(
|
|
status_code=status_code, request=self.request
|
|
)
|
|
super().__init__(
|
|
status_code=status_code,
|
|
message=self.message,
|
|
headers=self.headers,
|
|
request=self.request,
|
|
response=self.response,
|
|
)
|
|
|
|
|
|
####### Error Handling Utils for OpenAI API #######################
|
|
###################################################################
|
|
def drop_params_from_unprocessable_entity_error(
|
|
e: Union[openai.UnprocessableEntityError, httpx.HTTPStatusError],
|
|
data: Dict[str, Any],
|
|
) -> Dict[str, Any]:
|
|
"""
|
|
Helper function to read OpenAI UnprocessableEntityError and drop the params that raised an error from the error message.
|
|
|
|
Args:
|
|
e (UnprocessableEntityError): The UnprocessableEntityError exception
|
|
data (Dict[str, Any]): The original data dictionary containing all parameters
|
|
|
|
Returns:
|
|
Dict[str, Any]: A new dictionary with invalid parameters removed
|
|
"""
|
|
invalid_params: List[str] = []
|
|
if isinstance(e, httpx.HTTPStatusError):
|
|
error_json = e.response.json()
|
|
error_message = error_json.get("error", {})
|
|
error_body = error_message
|
|
else:
|
|
error_body = e.body
|
|
if (
|
|
error_body is not None
|
|
and isinstance(error_body, dict)
|
|
and error_body.get("message")
|
|
):
|
|
message = error_body.get("message", {})
|
|
if isinstance(message, str):
|
|
try:
|
|
message = json.loads(message)
|
|
except json.JSONDecodeError:
|
|
message = {"detail": message}
|
|
detail = message.get("detail")
|
|
|
|
if isinstance(detail, List) and len(detail) > 0 and isinstance(detail[0], dict):
|
|
for error_dict in detail:
|
|
if (
|
|
error_dict.get("loc")
|
|
and isinstance(error_dict.get("loc"), list)
|
|
and len(error_dict.get("loc")) == 2
|
|
):
|
|
invalid_params.append(error_dict["loc"][1])
|
|
|
|
new_data = {k: v for k, v in data.items() if k not in invalid_params}
|
|
|
|
return new_data
|