mirror of
https://github.com/BerriAI/litellm.git
synced 2026-09-13 23:11:40 +00:00
Merge 96b7fbb1fc into 1c61c2606e
This commit is contained in:
commit
6f9cff6a21
2 changed files with 79 additions and 10 deletions
|
|
@ -1,6 +1,7 @@
|
|||
import base64
|
||||
import re
|
||||
from collections.abc import Iterable, Mapping, Sequence
|
||||
from functools import reduce
|
||||
from typing import Any, Final, Optional, TypeVar, Union, cast, get_type_hints, overload
|
||||
|
||||
from pydantic import BaseModel
|
||||
|
|
@ -8,6 +9,7 @@ from typing_extensions import TypeIs # noqa: TID251 # narrows untyped wire pay
|
|||
|
||||
import litellm
|
||||
from litellm._logging import verbose_logger
|
||||
from litellm.litellm_core_utils.dot_notation_indexing import delete_nested_value, is_nested_path
|
||||
from litellm.llms.base_llm.responses.transformation import BaseResponsesAPIConfig
|
||||
from litellm.types.llms.openai import (
|
||||
AllMessageValues,
|
||||
|
|
@ -29,6 +31,11 @@ from litellm.types.utils import (
|
|||
)
|
||||
|
||||
|
||||
def _apply_nested_drop_params(params: dict[str, object], additional_drop_params: list[str] | None) -> dict[str, object]:
|
||||
nested_paths: Final = tuple(path for path in additional_drop_params or () if is_nested_path(path))
|
||||
return reduce(lambda acc, path: delete_nested_value(acc, path), nested_paths, params)
|
||||
|
||||
|
||||
def _output_token_detail(details: object, field: str) -> int | None:
|
||||
value: Final = getattr(details, field, None)
|
||||
return value if isinstance(value, int) else None
|
||||
|
|
@ -265,20 +272,24 @@ class ResponsesAPIRequestUtils:
|
|||
special_params: Final[dict[str, object]] = params.pop("kwargs", {})
|
||||
|
||||
additional_drop_params: Final[list[str] | None] = params.pop("additional_drop_params", None)
|
||||
non_default_params: Final = PreProcessNonDefaultParams.base_pre_process_non_default_params(
|
||||
passed_params=params,
|
||||
special_params=special_params,
|
||||
custom_llm_provider=custom_llm_provider,
|
||||
additional_drop_params=additional_drop_params,
|
||||
default_param_values={k: None for k in valid_keys},
|
||||
additional_endpoint_specific_params=["input"],
|
||||
non_default_params: Final = _apply_nested_drop_params(
|
||||
PreProcessNonDefaultParams.base_pre_process_non_default_params(
|
||||
passed_params=params,
|
||||
special_params=special_params,
|
||||
custom_llm_provider=custom_llm_provider,
|
||||
additional_drop_params=additional_drop_params,
|
||||
default_param_values={k: None for k in valid_keys},
|
||||
additional_endpoint_specific_params=["input"],
|
||||
),
|
||||
additional_drop_params,
|
||||
)
|
||||
|
||||
# decode previous_response_id if it's a litellm encoded id
|
||||
if "previous_response_id" in non_default_params:
|
||||
previous_response_id: Final = non_default_params.get("previous_response_id")
|
||||
if isinstance(previous_response_id, str):
|
||||
decoded_previous_response_id: Final = (
|
||||
ResponsesAPIRequestUtils.decode_previous_response_id_to_original_previous_response_id(
|
||||
non_default_params["previous_response_id"]
|
||||
previous_response_id
|
||||
)
|
||||
)
|
||||
non_default_params["previous_response_id"] = decoded_previous_response_id
|
||||
|
|
@ -286,7 +297,8 @@ class ResponsesAPIRequestUtils:
|
|||
if "metadata" in non_default_params:
|
||||
from litellm.utils import add_openai_metadata
|
||||
|
||||
converted_metadata: Final = add_openai_metadata(non_default_params["metadata"])
|
||||
raw_metadata: Final = non_default_params["metadata"]
|
||||
converted_metadata: Final = add_openai_metadata(raw_metadata if _is_object_dict(raw_metadata) else None)
|
||||
if converted_metadata is not None:
|
||||
non_default_params["metadata"] = converted_metadata
|
||||
else:
|
||||
|
|
|
|||
|
|
@ -119,6 +119,63 @@ class TestResponsesAPIRequestUtils:
|
|||
assert result["max_output_tokens"] == 100
|
||||
assert result["prompt"] == {"id": "pmpt_456"}
|
||||
|
||||
def test_get_requested_response_api_optional_param_drops_nested_path(self):
|
||||
"""Nested additional_drop_params paths like reasoning.summary must be honored"""
|
||||
params = {
|
||||
"temperature": 0.1,
|
||||
"reasoning": {"effort": "high", "summary": "auto"},
|
||||
"additional_drop_params": ["reasoning.summary"],
|
||||
}
|
||||
|
||||
result = ResponsesAPIRequestUtils.get_requested_response_api_optional_param(params)
|
||||
|
||||
assert result["reasoning"] == {"effort": "high"}
|
||||
assert result["temperature"] == 0.1
|
||||
|
||||
def test_get_requested_response_api_optional_param_drops_array_path(self):
|
||||
"""Array wildcard paths like tools[*].input_examples must be honored"""
|
||||
params = {
|
||||
"tools": [{"type": "function", "name": "t", "input_examples": ["x"]}],
|
||||
"additional_drop_params": ["tools[*].input_examples"],
|
||||
}
|
||||
|
||||
result = ResponsesAPIRequestUtils.get_requested_response_api_optional_param(params)
|
||||
|
||||
assert result["tools"] == [{"type": "function", "name": "t"}]
|
||||
|
||||
def test_get_requested_response_api_optional_param_drops_top_level(self):
|
||||
"""Top-level additional_drop_params keys must still be honored"""
|
||||
params = {
|
||||
"reasoning": {"effort": "high", "summary": "auto"},
|
||||
"additional_drop_params": ["reasoning"],
|
||||
}
|
||||
|
||||
result = ResponsesAPIRequestUtils.get_requested_response_api_optional_param(params)
|
||||
|
||||
assert "reasoning" not in result
|
||||
|
||||
def test_get_requested_response_api_optional_param_non_matching_nested_path(self):
|
||||
"""A nested path that does not match anything leaves params untouched"""
|
||||
params = {
|
||||
"reasoning": {"effort": "high", "summary": "auto"},
|
||||
"additional_drop_params": ["reasoning.nope"],
|
||||
}
|
||||
|
||||
result = ResponsesAPIRequestUtils.get_requested_response_api_optional_param(params)
|
||||
|
||||
assert result["reasoning"] == {"effort": "high", "summary": "auto"}
|
||||
|
||||
def test_get_requested_response_api_optional_param_none_drop_params(self):
|
||||
"""additional_drop_params=None is a no-op"""
|
||||
params = {
|
||||
"reasoning": {"effort": "high", "summary": "auto"},
|
||||
"additional_drop_params": None,
|
||||
}
|
||||
|
||||
result = ResponsesAPIRequestUtils.get_requested_response_api_optional_param(params)
|
||||
|
||||
assert result["reasoning"] == {"effort": "high", "summary": "auto"}
|
||||
|
||||
def test_decode_previous_response_id_to_original_previous_response_id(self):
|
||||
"""Test decoding a LiteLLM encoded previous_response_id to the original previous_response_id"""
|
||||
# Setup
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue