From edf047b6bb9f0592dfb819b76177c4c7b5d6354c Mon Sep 17 00:00:00 2001 From: kayoch1n Date: Wed, 3 Sep 2025 10:00:16 +0800 Subject: [PATCH 1/4] Replace "/" with "-" in model name when being used as a h11 header name --- litellm/proxy/common_utils/callback_utils.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/litellm/proxy/common_utils/callback_utils.py b/litellm/proxy/common_utils/callback_utils.py index e718255750..46c9afef3c 100644 --- a/litellm/proxy/common_utils/callback_utils.py +++ b/litellm/proxy/common_utils/callback_utils.py @@ -316,18 +316,21 @@ def get_remaining_tokens_and_requests_from_request_data(data: Dict) -> Dict[str, headers = {} _metadata = data.get("metadata", None) or {} model_group = get_model_group_from_request_data(data) + + # The h11 package considers "/" or ":" invalid and raise a LocalProtocolError + h11_model_group_name = model_group.replace('/', '-').replace(':', '-') # Remaining Requests remaining_requests_variable_name = f"litellm-key-remaining-requests-{model_group}" remaining_requests = _metadata.get(remaining_requests_variable_name, None) if remaining_requests: - headers[f"x-litellm-key-remaining-requests-{model_group}"] = remaining_requests + headers[f"x-litellm-key-remaining-requests-{h11_model_group_name}"] = remaining_requests # Remaining Tokens remaining_tokens_variable_name = f"litellm-key-remaining-tokens-{model_group}" remaining_tokens = _metadata.get(remaining_tokens_variable_name, None) if remaining_tokens: - headers[f"x-litellm-key-remaining-tokens-{model_group}"] = remaining_tokens + headers[f"x-litellm-key-remaining-tokens-{h11_model_group_name}"] = remaining_tokens return headers From ffbe5cd899d883bed3f1c354a85d0992729ba535 Mon Sep 17 00:00:00 2001 From: kayoch1n Date: Wed, 3 Sep 2025 10:57:09 +0800 Subject: [PATCH 2/4] Add a testcase --- .../proxy/common_utils/test_callback_utils.py | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 tests/test_litellm/proxy/common_utils/test_callback_utils.py diff --git a/tests/test_litellm/proxy/common_utils/test_callback_utils.py b/tests/test_litellm/proxy/common_utils/test_callback_utils.py new file mode 100644 index 0000000000..ffcab13571 --- /dev/null +++ b/tests/test_litellm/proxy/common_utils/test_callback_utils.py @@ -0,0 +1,27 @@ +import sys +import os + +sys.path.insert( + 0, os.path.abspath("../../..") +) # Adds the parent directory to the system path + +from litellm.proxy.common_utils.callback_utils import get_remaining_tokens_and_requests_from_request_data + +def test_get_remaining_tokens_and_requests_from_request_data(): + model_group = "openrouter/google/gemini-2.0-flash-001" + casedata = { + "metadata": { + "model_group": model_group, + f"litellm-key-remaining-requests-{model_group}": 100, + f"litellm-key-remaining-tokens-{model_group}": 200 + } + } + + headers = get_remaining_tokens_and_requests_from_request_data(casedata) + + expected_name = "openrouter-google-gemini-2.0-flash-001" + assert headers == { + f"x-litellm-key-remaining-requests-{expected_name}": 100, + f"x-litellm-key-remaining-tokens-{expected_name}": 200 + } + From 1a97a80c519ab57413293fd45849613838ed0a8e Mon Sep 17 00:00:00 2001 From: kayoch1n Date: Wed, 3 Sep 2025 11:18:57 +0800 Subject: [PATCH 3/4] Format code --- litellm/proxy/common_utils/callback_utils.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/litellm/proxy/common_utils/callback_utils.py b/litellm/proxy/common_utils/callback_utils.py index 46c9afef3c..d52592952b 100644 --- a/litellm/proxy/common_utils/callback_utils.py +++ b/litellm/proxy/common_utils/callback_utils.py @@ -316,21 +316,27 @@ def get_remaining_tokens_and_requests_from_request_data(data: Dict) -> Dict[str, headers = {} _metadata = data.get("metadata", None) or {} model_group = get_model_group_from_request_data(data) - + # The h11 package considers "/" or ":" invalid and raise a LocalProtocolError - h11_model_group_name = model_group.replace('/', '-').replace(':', '-') + h11_model_group_name = ( + model_group.replace("/", "-").replace(":", "-") if model_group else None + ) # Remaining Requests remaining_requests_variable_name = f"litellm-key-remaining-requests-{model_group}" remaining_requests = _metadata.get(remaining_requests_variable_name, None) if remaining_requests: - headers[f"x-litellm-key-remaining-requests-{h11_model_group_name}"] = remaining_requests + headers[f"x-litellm-key-remaining-requests-{h11_model_group_name}"] = ( + remaining_requests + ) # Remaining Tokens remaining_tokens_variable_name = f"litellm-key-remaining-tokens-{model_group}" remaining_tokens = _metadata.get(remaining_tokens_variable_name, None) if remaining_tokens: - headers[f"x-litellm-key-remaining-tokens-{h11_model_group_name}"] = remaining_tokens + headers[f"x-litellm-key-remaining-tokens-{h11_model_group_name}"] = ( + remaining_tokens + ) return headers From 76555cad81633b9bba5938419af22644da8674a0 Mon Sep 17 00:00:00 2001 From: kayoch1n Date: Wed, 3 Sep 2025 11:20:52 +0800 Subject: [PATCH 4/4] Format code --- .../proxy/common_utils/test_callback_utils.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tests/test_litellm/proxy/common_utils/test_callback_utils.py b/tests/test_litellm/proxy/common_utils/test_callback_utils.py index ffcab13571..b9ed4b9b50 100644 --- a/tests/test_litellm/proxy/common_utils/test_callback_utils.py +++ b/tests/test_litellm/proxy/common_utils/test_callback_utils.py @@ -5,7 +5,10 @@ sys.path.insert( 0, os.path.abspath("../../..") ) # Adds the parent directory to the system path -from litellm.proxy.common_utils.callback_utils import get_remaining_tokens_and_requests_from_request_data +from litellm.proxy.common_utils.callback_utils import ( + get_remaining_tokens_and_requests_from_request_data, +) + def test_get_remaining_tokens_and_requests_from_request_data(): model_group = "openrouter/google/gemini-2.0-flash-001" @@ -13,7 +16,7 @@ def test_get_remaining_tokens_and_requests_from_request_data(): "metadata": { "model_group": model_group, f"litellm-key-remaining-requests-{model_group}": 100, - f"litellm-key-remaining-tokens-{model_group}": 200 + f"litellm-key-remaining-tokens-{model_group}": 200, } } @@ -22,6 +25,5 @@ def test_get_remaining_tokens_and_requests_from_request_data(): expected_name = "openrouter-google-gemini-2.0-flash-001" assert headers == { f"x-litellm-key-remaining-requests-{expected_name}": 100, - f"x-litellm-key-remaining-tokens-{expected_name}": 200 + f"x-litellm-key-remaining-tokens-{expected_name}": 200, } -