LiteLLM Minor Fixes & Improvements (11/27/2024) (#6943)

* fix(http_parsing_utils.py): remove `ast.literal_eval()` from http utils

Security fix - https://huntr.com/bounties/96a32812-213c-4819-ba4e-36143d35e95b?token=bf414bbd77f8b346556e
64ab2dd9301ea44339910877ea50401c76f977e36cdd78272f5fb4ca852a88a7e832828aae1192df98680544ee24aa98f3cf6980d8
bab641a66b7ccbc02c0e7d4ddba2db4dbe7318889dc0098d8db2d639f345f574159814627bb084563bad472e2f990f825bff0878a9
e281e72c88b4bc5884d637d186c0d67c9987c57c3f0caf395aff07b89ad2b7220d1dd7d1b427fd2260b5f01090efce5250f8b56ea2
c0ec19916c24b23825d85ce119911275944c840a1340d69e23ca6a462da610

* fix(converse/transformation.py): support bedrock apac cross region inference

Fixes https://github.com/BerriAI/litellm/issues/6905

* fix(user_api_key_auth.py): add auth check for websocket endpoint

Fixes https://github.com/BerriAI/litellm/issues/6926

* fix(user_api_key_auth.py): use `model` from query param

* fix: fix linting error

* test: run flaky tests first
This commit is contained in:
Krish Dholakia 2024-11-28 00:32:46 +05:30 committed by GitHub
parent 2d2931a215
commit 21156ff5d0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 210 additions and 49 deletions

View file

@ -1,6 +1,6 @@
import ast
import json
from typing import List, Optional
from typing import Dict, List, Optional
from fastapi import Request, UploadFile, status
@ -8,31 +8,43 @@ from litellm._logging import verbose_proxy_logger
from litellm.types.router import Deployment
async def _read_request_body(request: Optional[Request]) -> dict:
async def _read_request_body(request: Optional[Request]) -> Dict:
"""
Asynchronous function to read the request body and parse it as JSON or literal data.
Safely read the request body and parse it as JSON.
Parameters:
- request: The request object to read the body from
Returns:
- dict: Parsed request data as a dictionary
- dict: Parsed request data as a dictionary or an empty dictionary if parsing fails
"""
try:
request_data: dict = {}
if request is None:
return request_data
return {}
# Read the request body
body = await request.body()
if body == b"" or body is None:
return request_data
# Return empty dict if body is empty or None
if not body:
return {}
# Decode the body to a string
body_str = body.decode()
try:
request_data = ast.literal_eval(body_str)
except Exception:
request_data = json.loads(body_str)
return request_data
except Exception:
# Attempt JSON parsing (safe for untrusted input)
return json.loads(body_str)
except json.JSONDecodeError:
# Log detailed information for debugging
verbose_proxy_logger.exception("Invalid JSON payload received.")
return {}
except Exception as e:
# Catch unexpected errors to avoid crashes
verbose_proxy_logger.exception(
"Unexpected error reading request body - {}".format(e)
)
return {}