From 60341e870bdf3a45a31e4279b63c23148305b1ab Mon Sep 17 00:00:00 2001 From: Dushyant Acharya Date: Sun, 13 Sep 2026 12:30:19 +0530 Subject: [PATCH] fix(proxy/logging): case-insensitive User-Agent header lookup in _get_user_agent_tags Ensures User-Agent request tags are extracted regardless of header key casing. Closes #40979 --- litellm/litellm_core_utils/litellm_logging.py | 23 ++++++++++--------- .../test_litellm_logging.py | 16 +++++++++++++ 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/litellm/litellm_core_utils/litellm_logging.py b/litellm/litellm_core_utils/litellm_logging.py index 48e8a44b9a4..a7bec73d7d1 100644 --- a/litellm/litellm_core_utils/litellm_logging.py +++ b/litellm/litellm_core_utils/litellm_logging.py @@ -7113,17 +7113,18 @@ class StandardLoggingPayloadSetup: request_headers: Final = cast( # cast-ok: request headers are untyped framework data dict[str, str | None], headers ) - if "user-agent" in request_headers: - user_agent: Final = request_headers["user-agent"] - if user_agent is not None: - if user_agent_tags is None: - user_agent_tags = [] - user_agent_part: str | None = None - if "/" in user_agent: - user_agent_part = user_agent.split("/")[0] - if user_agent_part is not None: - user_agent_tags.append("User-Agent: " + user_agent_part) - user_agent_tags.append("User-Agent: " + user_agent) + user_agent: Final[str | None] = next( + (v for k, v in request_headers.items() if k.lower() == "user-agent" and isinstance(v, str)), + None, + ) + if user_agent is not None: + user_agent_tags = [] + user_agent_part: str | None = None + if "/" in user_agent: + user_agent_part = user_agent.split("/")[0] + if user_agent_part is not None: + user_agent_tags.append("User-Agent: " + user_agent_part) + user_agent_tags.append("User-Agent: " + user_agent) return user_agent_tags @staticmethod diff --git a/tests/unit/litellm_core_utils/test_litellm_logging.py b/tests/unit/litellm_core_utils/test_litellm_logging.py index e786753e1a8..9c749c22ff0 100644 --- a/tests/unit/litellm_core_utils/test_litellm_logging.py +++ b/tests/unit/litellm_core_utils/test_litellm_logging.py @@ -3412,6 +3412,22 @@ def test_get_user_agent_tags(): assert "User-Agent: litellm/0.1.0" in tags +def test_get_user_agent_tags_case_insensitive(): + from litellm.litellm_core_utils.litellm_logging import StandardLoggingPayloadSetup + + tags = StandardLoggingPayloadSetup._get_user_agent_tags( + proxy_server_request={ + "headers": { + "User-Agent": "curl/7.68.0", + } + } + ) + + assert tags is not None + assert "User-Agent: curl" in tags + assert "User-Agent: curl/7.68.0" in tags + + def test_get_request_tags(): from litellm.litellm_core_utils.litellm_logging import StandardLoggingPayloadSetup