mirror of
https://github.com/BerriAI/litellm.git
synced 2025-04-25 02:34:29 +00:00
All checks were successful
Read Version from pyproject.toml / read-version (push) Successful in 11s
* fix(main.py): support passing max retries to azure/openai embedding integrations Fixes https://github.com/BerriAI/litellm/issues/7003 * feat(team_endpoints.py): allow updating team model aliases Closes https://github.com/BerriAI/litellm/issues/6956 * feat(router.py): allow specifying model id as fallback - skips any cooldown check Allows a default model to be checked if all models in cooldown s/o @micahjsmith * docs(reliability.md): add fallback to specific model to docs * fix(utils.py): new 'is_prompt_caching_valid_prompt' helper util Allows user to identify if messages/tools have prompt caching Related issue: https://github.com/BerriAI/litellm/issues/6784 * feat(router.py): store model id for prompt caching valid prompt Allows routing to that model id on subsequent requests * fix(router.py): only cache if prompt is valid prompt caching prompt prevents storing unnecessary items in cache * feat(router.py): support routing prompt caching enabled models to previous deployments Closes https://github.com/BerriAI/litellm/issues/6784 * test: fix linting errors * feat(databricks/): convert basemodel to dict and exclude none values allow passing pydantic message to databricks * fix(utils.py): ensure all chat completion messages are dict * (feat) Track `custom_llm_provider` in LiteLLMSpendLogs (#7081) * add custom_llm_provider to SpendLogsPayload * add custom_llm_provider to SpendLogs * add custom llm provider to SpendLogs payload * test_spend_logs_payload * Add MLflow to the side bar (#7031) Signed-off-by: B-Step62 <yuki.watanabe@databricks.com> * (bug fix) SpendLogs update DB catch all possible DB errors for retrying (#7082) * catch DB_CONNECTION_ERROR_TYPES * fix DB retry mechanism for SpendLog updates * use DB_CONNECTION_ERROR_TYPES in auth checks * fix exp back off for writing SpendLogs * use _raise_failed_update_spend_exception to ensure errors print as NON blocking * test_update_spend_logs_multiple_batches_with_failure * (Feat) Add StructuredOutputs support for Fireworks.AI (#7085) * fix model cost map fireworks ai "supports_response_schema": true, * fix supports_response_schema * fix map openai params fireworks ai * test_map_response_format * test_map_response_format * added deepinfra/Meta-Llama-3.1-405B-Instruct (#7084) * bump: version 1.53.9 → 1.54.0 * fix deepinfra * litellm db fixes LiteLLM_UserTable (#7089) * ci/cd queue new release * fix llama-3.3-70b-versatile * refactor - use consistent file naming convention `AI21/` -> `ai21` (#7090) * fix refactor - use consistent file naming convention * ci/cd run again * fix naming structure * fix use consistent naming (#7092) --------- Signed-off-by: B-Step62 <yuki.watanabe@databricks.com> Co-authored-by: Ishaan Jaff <ishaanjaffer0324@gmail.com> Co-authored-by: Yuki Watanabe <31463517+B-Step62@users.noreply.github.com> Co-authored-by: ali sayyah <ali.sayyah2@gmail.com>
66 lines
1.9 KiB
Python
66 lines
1.9 KiB
Python
import sys
|
|
import os
|
|
import traceback
|
|
from dotenv import load_dotenv
|
|
from fastapi import Request
|
|
from datetime import datetime
|
|
|
|
sys.path.insert(
|
|
0, os.path.abspath("../..")
|
|
) # Adds the parent directory to the system path
|
|
from litellm import Router
|
|
import pytest
|
|
import litellm
|
|
from unittest.mock import patch, MagicMock, AsyncMock
|
|
from create_mock_standard_logging_payload import create_standard_logging_payload
|
|
from litellm.types.utils import StandardLoggingPayload
|
|
import unittest
|
|
from pydantic import BaseModel
|
|
from litellm.router_utils.prompt_caching_cache import PromptCachingCache
|
|
|
|
|
|
class ExampleModel(BaseModel):
|
|
field1: str
|
|
field2: int
|
|
|
|
|
|
def test_serialize_pydantic_object():
|
|
model = ExampleModel(field1="value", field2=42)
|
|
serialized = PromptCachingCache.serialize_object(model)
|
|
assert serialized == {"field1": "value", "field2": 42}
|
|
|
|
|
|
def test_serialize_dict():
|
|
obj = {"b": 2, "a": 1}
|
|
serialized = PromptCachingCache.serialize_object(obj)
|
|
assert serialized == '{"a":1,"b":2}' # JSON string with sorted keys
|
|
|
|
|
|
def test_serialize_nested_dict():
|
|
obj = {"z": {"b": 2, "a": 1}, "x": [1, 2, {"c": 3}]}
|
|
serialized = PromptCachingCache.serialize_object(obj)
|
|
expected = '{"x":[1,2,{"c":3}],"z":{"a":1,"b":2}}' # JSON string with sorted keys
|
|
assert serialized == expected
|
|
|
|
|
|
def test_serialize_list():
|
|
obj = ["item1", {"a": 1, "b": 2}, 42]
|
|
serialized = PromptCachingCache.serialize_object(obj)
|
|
expected = ["item1", '{"a":1,"b":2}', 42]
|
|
assert serialized == expected
|
|
|
|
|
|
def test_serialize_fallback():
|
|
obj = 12345 # Simple non-serializable object
|
|
serialized = PromptCachingCache.serialize_object(obj)
|
|
assert serialized == 12345
|
|
|
|
|
|
def test_serialize_non_serializable():
|
|
class CustomClass:
|
|
def __str__(self):
|
|
return "custom_object"
|
|
|
|
obj = CustomClass()
|
|
serialized = PromptCachingCache.serialize_object(obj)
|
|
assert serialized == "custom_object" # Fallback to string conversion
|