mirror of
https://github.com/BerriAI/litellm.git
synced 2026-10-09 03:18:44 +00:00
Merge 813a2714fd into cd63c7e5a7
This commit is contained in:
commit
e62fb7a5e2
2 changed files with 104 additions and 8 deletions
|
|
@ -274,16 +274,31 @@ class ResponsesAPIRequestUtils:
|
|||
)
|
||||
non_default_params["previous_response_id"] = decoded_previous_response_id
|
||||
|
||||
if "metadata" in non_default_params:
|
||||
from litellm.utils import add_openai_metadata
|
||||
litellm_metadata_raw: Final = params.get("litellm_metadata")
|
||||
litellm_metadata: Final = litellm_metadata_raw if isinstance(litellm_metadata_raw, dict) else {}
|
||||
|
||||
converted_metadata: Final = add_openai_metadata(non_default_params["metadata"])
|
||||
if converted_metadata is not None:
|
||||
non_default_params["metadata"] = converted_metadata
|
||||
else:
|
||||
non_default_params.pop("metadata", None)
|
||||
proxy_requester_metadata: Final = litellm_metadata.get("requester_metadata")
|
||||
metadata_in_params: Final = non_default_params.get("metadata")
|
||||
is_proxy_internal_metadata: Final = any(key.startswith("user_api_key_") for key in litellm_metadata)
|
||||
|
||||
return cast(ResponsesAPIOptionalRequestParams, non_default_params)
|
||||
metadata_source: Final = (
|
||||
proxy_requester_metadata
|
||||
if isinstance(proxy_requester_metadata, dict)
|
||||
else (
|
||||
metadata_in_params if not is_proxy_internal_metadata and isinstance(metadata_in_params, dict) else None
|
||||
)
|
||||
)
|
||||
|
||||
from litellm.utils import add_openai_metadata
|
||||
|
||||
converted_metadata: Final = add_openai_metadata(metadata_source) if metadata_source is not None else None
|
||||
non_default_params_with_metadata: Final = (
|
||||
{**non_default_params, "metadata": converted_metadata}
|
||||
if converted_metadata
|
||||
else {key: value for key, value in non_default_params.items() if key != "metadata"}
|
||||
)
|
||||
|
||||
return cast(ResponsesAPIOptionalRequestParams, non_default_params_with_metadata)
|
||||
|
||||
# fmt: off
|
||||
@overload
|
||||
|
|
|
|||
|
|
@ -118,6 +118,87 @@ class TestResponsesAPIRequestUtils:
|
|||
assert result["max_output_tokens"] == 100
|
||||
assert result["prompt"] == {"id": "pmpt_456"}
|
||||
|
||||
def test_get_requested_response_api_optional_param_strips_empty_metadata(self):
|
||||
"""Regression #35780: empty metadata dict must not reach upstream."""
|
||||
result = ResponsesAPIRequestUtils.get_requested_response_api_optional_param(
|
||||
{"temperature": 0.7, "metadata": {}}
|
||||
)
|
||||
assert "metadata" not in result
|
||||
|
||||
def test_get_requested_response_api_optional_param_strips_internal_metadata(self):
|
||||
"""Regression #35780: proxy/router internal metadata must not reach upstream."""
|
||||
result = ResponsesAPIRequestUtils.get_requested_response_api_optional_param(
|
||||
{
|
||||
"temperature": 0.7,
|
||||
"metadata": {
|
||||
"model_group": "test-model",
|
||||
"deployment": "openai/gpt-4o",
|
||||
"model_info": {"id": "dep-1"},
|
||||
"user_api_key_user_id": "user-1",
|
||||
},
|
||||
"litellm_metadata": {
|
||||
"user_api_key_team_id": "team-1",
|
||||
"tags": ["internal-tag"],
|
||||
},
|
||||
}
|
||||
)
|
||||
assert "metadata" not in result
|
||||
|
||||
def test_get_requested_response_api_optional_param_preserves_caller_metadata(self):
|
||||
"""Caller-supplied string metadata should still be forwarded."""
|
||||
result = ResponsesAPIRequestUtils.get_requested_response_api_optional_param(
|
||||
{
|
||||
"temperature": 0.7,
|
||||
"metadata": {"customer_id": "cust-123", "campaign": "spring"},
|
||||
}
|
||||
)
|
||||
assert result["metadata"] == {"customer_id": "cust-123", "campaign": "spring"}
|
||||
|
||||
def test_get_requested_response_api_optional_param_uses_requester_metadata(self):
|
||||
"""Proxy snapshots caller metadata under litellm_metadata.requester_metadata."""
|
||||
result = ResponsesAPIRequestUtils.get_requested_response_api_optional_param(
|
||||
{
|
||||
"temperature": 0.7,
|
||||
"metadata": {
|
||||
"model_group": "test-model",
|
||||
"user_api_key_user_id": "user-1",
|
||||
},
|
||||
"litellm_metadata": {
|
||||
"requester_metadata": {"customer_id": "cust-456"},
|
||||
"user_api_key_team_id": "team-1",
|
||||
},
|
||||
}
|
||||
)
|
||||
assert result["metadata"] == {"customer_id": "cust-456"}
|
||||
|
||||
def test_get_requested_response_api_optional_param_preserves_sibling_metadata_keys(self):
|
||||
result = ResponsesAPIRequestUtils.get_requested_response_api_optional_param(
|
||||
{
|
||||
"temperature": 0.7,
|
||||
"metadata": {
|
||||
"customer_id": "cust-123",
|
||||
"requester_metadata": {"nested": "value"},
|
||||
},
|
||||
}
|
||||
)
|
||||
assert result["metadata"] == {"customer_id": "cust-123"}
|
||||
|
||||
def test_get_requested_response_api_optional_param_proxy_snapshot_no_double_unwrap(self):
|
||||
result = ResponsesAPIRequestUtils.get_requested_response_api_optional_param(
|
||||
{
|
||||
"temperature": 0.7,
|
||||
"metadata": {"model_group": "test-model"},
|
||||
"litellm_metadata": {
|
||||
"requester_metadata": {
|
||||
"customer_id": "cust-789",
|
||||
"requester_metadata": {"nested": "value"},
|
||||
},
|
||||
"user_api_key_team_id": "team-1",
|
||||
},
|
||||
}
|
||||
)
|
||||
assert result["metadata"] == {"customer_id": "cust-789"}
|
||||
|
||||
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