diff --git a/litellm/litellm_core_utils/litellm_logging.py b/litellm/litellm_core_utils/litellm_logging.py index c77e572ec5f..c0eb3c0d729 100644 --- a/litellm/litellm_core_utils/litellm_logging.py +++ b/litellm/litellm_core_utils/litellm_logging.py @@ -601,7 +601,7 @@ class Logging(LiteLLMLoggingBaseClass): if "litellm_metadata" in kwargs and isinstance( kwargs["litellm_metadata"], dict ): - if "metadata" not in base_litellm_params: + if not base_litellm_params.get("metadata"): base_litellm_params["metadata"] = dict(kwargs["litellm_metadata"]) else: base_litellm_params["metadata"] = dict(base_litellm_params["metadata"]) diff --git a/tests/test_litellm/litellm_core_utils/test_litellm_logging.py b/tests/test_litellm/litellm_core_utils/test_litellm_logging.py index 5cf2da8e135..393f7035dbf 100644 --- a/tests/test_litellm/litellm_core_utils/test_litellm_logging.py +++ b/tests/test_litellm/litellm_core_utils/test_litellm_logging.py @@ -271,6 +271,19 @@ class TestUpdateFromKwargs: assert result_meta["from_caller"] is True assert result_meta["user_api_key_hash"] == "hashed-xyz" + def test_merge_handles_metadata_none(self, logging_obj): + """When metadata=None is explicitly in kwargs alongside litellm_metadata, + the merge should not crash (dict(None) would TypeError).""" + kwargs = { + "metadata": None, + "litellm_metadata": {"user_api_key_hash": "hashed-abc"}, + } + + logging_obj.update_from_kwargs(kwargs=kwargs) + + result_meta = logging_obj.litellm_params["metadata"] + assert result_meta["user_api_key_hash"] == "hashed-abc" + def test_caller_litellm_params_win_over_kwargs(self, logging_obj): """Explicit litellm_params from the caller should override auto-extracted values.""" kwargs = {"metadata": {"from_kwargs": True}} @@ -1937,7 +1950,7 @@ def test_function_setup_litellm_metadata_populates_metadata(): ), "litellm_params['metadata'] should be a copy, not the same object" -def test_function_setup_metadata_takes_precedence_over_litellm_metadata(): +def test_function_setup_merges_litellm_metadata_without_overwriting(): """ Test that when BOTH metadata and litellm_metadata are present (e.g., user sets Anthropic API metadata AND proxy adds litellm_metadata), existing metadata keys