mirror of
https://github.com/BerriAI/litellm.git
synced 2025-04-25 10:44:24 +00:00
* ci(config.yml): add a 'check_code_quality' step Addresses https://github.com/BerriAI/litellm/issues/5991 * ci(config.yml): check why circle ci doesn't pick up this test * ci(config.yml): fix to run 'check_code_quality' tests * fix(__init__.py): fix unprotected import * fix(__init__.py): don't remove unused imports * build(ruff.toml): update ruff.toml to ignore unused imports * fix: fix: ruff + pyright - fix linting + type-checking errors * fix: fix linting errors * fix(lago.py): fix module init error * fix: fix linting errors * ci(config.yml): cd into correct dir for checks * fix(proxy_server.py): fix linting error * fix(utils.py): fix bare except causes ruff linting errors * fix: ruff - fix remaining linting errors * fix(clickhouse.py): use standard logging object * fix(__init__.py): fix unprotected import * fix: ruff - fix linting errors * fix: fix linting errors * ci(config.yml): cleanup code qa step (formatting handled in local_testing) * fix(_health_endpoints.py): fix ruff linting errors * ci(config.yml): just use ruff in check_code_quality pipeline for now * build(custom_guardrail.py): include missing file * style(embedding_handler.py): fix ruff check
62 lines
2.1 KiB
Python
62 lines
2.1 KiB
Python
import io
|
|
import json
|
|
from typing import IO, Optional, Tuple, Union
|
|
|
|
|
|
class InMemoryFile(io.BytesIO):
|
|
def __init__(self, content: bytes, name: str):
|
|
super().__init__(content)
|
|
self.name = name
|
|
|
|
|
|
def replace_model_in_jsonl(
|
|
file_content: Union[bytes, Tuple[str, bytes, str]], new_model_name: str
|
|
) -> Optional[InMemoryFile]:
|
|
try:
|
|
# Decode the bytes to a string and split into lines
|
|
# If file_content is a file-like object, read the bytes
|
|
if hasattr(file_content, "read"):
|
|
file_content_bytes = file_content.read() # type: ignore
|
|
elif isinstance(file_content, tuple):
|
|
file_content_bytes = file_content[1]
|
|
else:
|
|
file_content_bytes = file_content
|
|
|
|
# Decode the bytes to a string and split into lines
|
|
if isinstance(file_content_bytes, bytes):
|
|
file_content_str = file_content_bytes.decode("utf-8")
|
|
else:
|
|
file_content_str = file_content_bytes
|
|
lines = file_content_str.splitlines()
|
|
modified_lines = []
|
|
for line in lines:
|
|
# Parse each line as a JSON object
|
|
json_object = json.loads(line.strip())
|
|
|
|
# Replace the model name if it exists
|
|
if "body" in json_object:
|
|
json_object["body"]["model"] = new_model_name
|
|
|
|
# Convert the modified JSON object back to a string
|
|
modified_lines.append(json.dumps(json_object))
|
|
|
|
# Reassemble the modified lines and return as bytes
|
|
modified_file_content = "\n".join(modified_lines).encode("utf-8")
|
|
return InMemoryFile(modified_file_content, name="modified_file.jsonl") # type: ignore
|
|
|
|
except (json.JSONDecodeError, UnicodeDecodeError, TypeError):
|
|
return None
|
|
|
|
|
|
def _get_router_metadata_variable_name(function_name) -> str:
|
|
"""
|
|
Helper to return what the "metadata" field should be called in the request data
|
|
|
|
For all /thread or /assistant endpoints we need to call this "litellm_metadata"
|
|
|
|
For ALL other endpoints we call this "metadata
|
|
"""
|
|
if "batch" in function_name:
|
|
return "litellm_metadata"
|
|
else:
|
|
return "metadata"
|