From 4ab960ad1407c75660f4e534a837f736b70d6206 Mon Sep 17 00:00:00 2001 From: Ryan Crabbe Date: Fri, 30 Jan 2026 10:06:20 -0800 Subject: [PATCH 1/2] perf: cache _get_relevant_args_to_use_for_logging() as module-level frozenset MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The set of valid LLM API parameter names for logging was being rebuilt on every request from 8 OpenAI SDK type annotations + set operations. Since these are static TypedDict annotations that never change at runtime, compute once at import time and store as a class-level frozenset. Line profiler: get_standard_logging_model_parameters() dropped from 774ms to 77ms across 12K calls (90% reduction, ~25µs/req saved). --- litellm/litellm_core_utils/model_param_helper.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/litellm/litellm_core_utils/model_param_helper.py b/litellm/litellm_core_utils/model_param_helper.py index 91f2f1341cf..4d45c47c224 100644 --- a/litellm/litellm_core_utils/model_param_helper.py +++ b/litellm/litellm_core_utils/model_param_helper.py @@ -17,15 +17,16 @@ from litellm.types.rerank import RerankRequest class ModelParamHelper: + # Cached at class level — deterministic set built from static OpenAI type annotations + _relevant_logging_args: frozenset = frozenset() + @staticmethod def get_standard_logging_model_parameters( model_parameters: dict, ) -> dict: """ """ standard_logging_model_parameters: dict = {} - supported_model_parameters = ( - ModelParamHelper._get_relevant_args_to_use_for_logging() - ) + supported_model_parameters = ModelParamHelper._relevant_logging_args for key, value in model_parameters.items(): if key in supported_model_parameters: @@ -172,3 +173,8 @@ class ModelParamHelper: Get the kwargs to exclude from the cache key """ return set(["metadata"]) + + +ModelParamHelper._relevant_logging_args = frozenset( + ModelParamHelper._get_relevant_args_to_use_for_logging() +) From 9c1d994a5bdc88642c84fdc1a00b265b1e5b8135 Mon Sep 17 00:00:00 2001 From: Ryan Crabbe Date: Fri, 30 Jan 2026 10:15:34 -0800 Subject: [PATCH 2/2] test: add tests for cached ModelParamHelper logging args Verify cached frozenset matches dynamic computation and that prompt content keys (messages, prompt, input) are excluded from logged model parameters. --- tests/test_litellm/test_model_param_helper.py | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 tests/test_litellm/test_model_param_helper.py diff --git a/tests/test_litellm/test_model_param_helper.py b/tests/test_litellm/test_model_param_helper.py new file mode 100644 index 00000000000..c6e4b864a22 --- /dev/null +++ b/tests/test_litellm/test_model_param_helper.py @@ -0,0 +1,33 @@ +from litellm.litellm_core_utils.model_param_helper import ModelParamHelper + + +def test_cached_relevant_logging_args_matches_dynamic(): + """Verify the cached frozenset matches the dynamically computed set.""" + cached = ModelParamHelper._relevant_logging_args + dynamic = ModelParamHelper._get_relevant_args_to_use_for_logging() + assert cached == dynamic + assert isinstance(cached, frozenset) + + +def test_get_standard_logging_model_parameters_filters(): + """Verify model parameters are filtered to only supported keys.""" + params = {"temperature": 0.7, "messages": [{"role": "user"}], "max_tokens": 100} + result = ModelParamHelper.get_standard_logging_model_parameters(params) + assert "temperature" in result + assert "max_tokens" in result + assert "messages" not in result # excluded prompt content + + +def test_get_standard_logging_model_parameters_excludes_prompt_content(): + """Verify all prompt content keys are excluded.""" + params = { + "messages": [{"role": "user", "content": "hi"}], + "prompt": "hello", + "input": "test", + "temperature": 0.5, + } + result = ModelParamHelper.get_standard_logging_model_parameters(params) + assert "messages" not in result + assert "prompt" not in result + assert "input" not in result + assert result == {"temperature": 0.5}