From ccecc10c8269234b185c37b6d312340a21c5f9f2 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Thu, 19 Feb 2026 11:27:09 -0800 Subject: [PATCH] [Fix] Include all SpendLogsMetadata keys in spend logs payload The dict comprehension in _get_spend_logs_metadata was only including metadata keys that existed in the input dict. After user_api_key_project_id was added to SpendLogsMetadata, payloads missing that key in input would not include it in output, causing test_spend_logs_payload to fail. Use metadata.get(key) instead of filtering with `if key in metadata` to ensure all SpendLogsMetadata keys are always present (defaulting to None), consistent with the metadata-is-None branch. Co-Authored-By: Claude Opus 4.6 (1M context) --- litellm/proxy/spend_tracking/spend_tracking_utils.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/litellm/proxy/spend_tracking/spend_tracking_utils.py b/litellm/proxy/spend_tracking/spend_tracking_utils.py index c36e50eb97a..6b5bb1614c5 100644 --- a/litellm/proxy/spend_tracking/spend_tracking_utils.py +++ b/litellm/proxy/spend_tracking/spend_tracking_utils.py @@ -96,9 +96,8 @@ def _get_spend_logs_metadata( # Filter the metadata dictionary to include only the specified keys clean_metadata = SpendLogsMetadata( **{ # type: ignore - key: metadata[key] + key: metadata.get(key) for key in SpendLogsMetadata.__annotations__.keys() - if key in metadata } ) clean_metadata["applied_guardrails"] = applied_guardrails