diff --git a/litellm/rust_bridge/messages/route_host.py b/litellm/rust_bridge/messages/route_host.py index 6d8073b740c..225817a2905 100644 --- a/litellm/rust_bridge/messages/route_host.py +++ b/litellm/rust_bridge/messages/route_host.py @@ -9,6 +9,7 @@ from pydantic import TypeAdapter, ValidationError import litellm from litellm.litellm_core_utils.core_helpers import normalize_drop_params +from litellm.litellm_core_utils.core_helpers import process_response_headers from litellm.llms.anthropic.pass_through.utils import is_reasoning_auto_summary_enabled from litellm.router_utils.add_retry_fallback_headers import _add_headers_to_response from litellm.rust_bridge import failures @@ -54,7 +55,10 @@ def response( ) -> AnthropicMessagesResponse: response_value = dict(value) if headers: - _add_headers_to_response(response_value, dict(httpx.Headers(list(headers)).items())) + _add_headers_to_response( + response_value, + process_response_headers(httpx.Headers(list(headers))), + ) return cast( # cast-ok: AnthropicMessagesResponse is a TypedDict over the normalized native payload AnthropicMessagesResponse, response_value, diff --git a/tests/unit/rust_bridge/messages/test_route_host.py b/tests/unit/rust_bridge/messages/test_route_host.py index 1be42e2249d..4b4b0dd6219 100644 --- a/tests/unit/rust_bridge/messages/test_route_host.py +++ b/tests/unit/rust_bridge/messages/test_route_host.py @@ -1,12 +1,13 @@ +from dataclasses import astuple from types import MappingProxyType from typing import Final -from litellm.rust_bridge.messages.route_host import arguments, response -from litellm.rust_bridge.messages.entrypoints import LiteLLMMessagesRequest -from dataclasses import astuple import pytest + import litellm from litellm.rust_bridge.messages import route_host +from litellm.rust_bridge.messages.entrypoints import LiteLLMMessagesRequest +from litellm.rust_bridge.messages.route_host import arguments, response def test_response_is_a_detached_public_messages_dict() -> None: @@ -30,6 +31,17 @@ def test_response_is_a_detached_public_messages_dict() -> None: assert "_hidden_params" not in native +def test_response_projects_upstream_headers_into_hidden_params() -> None: + built: Final = response( + MappingProxyType({"id": "msg_native"}), + (("request-id", "req_upstream_123"), ("x-ratelimit-remaining-requests", "41")), + ) + + additional: Final = built["_hidden_params"]["additional_headers"] + assert additional["llm_provider-request-id"] == "req_upstream_123" + assert additional["x-ratelimit-remaining-requests"] == "41" + + def test_arguments_are_the_public_kwargs_view() -> None: kwargs: Final = MappingProxyType({"litellm_metadata": {"user_id": "u"}}) request: Final = LiteLLMMessagesRequest(