From aad13556685023f2fc41afd98e03ffd16be1dcb4 Mon Sep 17 00:00:00 2001 From: "Ethan T." Date: Fri, 13 Mar 2026 13:32:41 +0800 Subject: [PATCH] fix: handle None values in spend logging transaction keys to prevent TypeError Sanitize model and custom_llm_provider values in daily spend transaction key construction across all entity types (user, team, org, tag, end_user, agent). When these fields are None (e.g. from embedding requests with null bytes), f-string interpolation produces the literal string "None" which causes inconsistent transaction key grouping. Use .get() with or "" fallback to coerce None to empty string, consistent with the existing sorted() key handling. Fixes #17792 --- litellm/proxy/db/db_spend_update_writer.py | 24 ++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/litellm/proxy/db/db_spend_update_writer.py b/litellm/proxy/db/db_spend_update_writer.py index a305d5be1e6..d7699c2fa07 100644 --- a/litellm/proxy/db/db_spend_update_writer.py +++ b/litellm/proxy/db/db_spend_update_writer.py @@ -1970,7 +1970,9 @@ class DBSpendUpdateWriter: return endpoint_str = base_daily_transaction.get("endpoint") or "" - daily_transaction_key = f"{payload['user']}_{base_daily_transaction['date']}_{payload['api_key']}_{payload['model']}_{payload['custom_llm_provider']}_{endpoint_str}" + model_str = payload.get("model") or "" + provider_str = payload.get("custom_llm_provider") or "" + daily_transaction_key = f"{payload['user']}_{base_daily_transaction['date']}_{payload['api_key']}_{model_str}_{provider_str}_{endpoint_str}" daily_transaction = DailyUserSpendTransaction( user_id=payload["user"], **base_daily_transaction ) @@ -2003,7 +2005,9 @@ class DBSpendUpdateWriter: return endpoint_str = base_daily_transaction.get("endpoint") or "" - daily_transaction_key = f"{payload['team_id']}_{base_daily_transaction['date']}_{payload['api_key']}_{payload['model']}_{payload['custom_llm_provider']}_{endpoint_str}" + model_str = payload.get("model") or "" + provider_str = payload.get("custom_llm_provider") or "" + daily_transaction_key = f"{payload['team_id']}_{base_daily_transaction['date']}_{payload['api_key']}_{model_str}_{provider_str}_{endpoint_str}" daily_transaction = DailyTeamSpendTransaction( team_id=payload["team_id"], **base_daily_transaction ) @@ -2046,7 +2050,9 @@ class DBSpendUpdateWriter: return endpoint_str = base_daily_transaction.get("endpoint") or "" - daily_transaction_key = f"{org_id}_{base_daily_transaction['date']}_{payload_with_org['api_key']}_{payload_with_org['model']}_{payload_with_org['custom_llm_provider']}_{endpoint_str}" + model_str = payload_with_org.get("model") or "" + provider_str = payload_with_org.get("custom_llm_provider") or "" + daily_transaction_key = f"{org_id}_{base_daily_transaction['date']}_{payload_with_org['api_key']}_{model_str}_{provider_str}_{endpoint_str}" daily_transaction = DailyOrganizationSpendTransaction( organization_id=org_id, **base_daily_transaction ) @@ -2089,7 +2095,9 @@ class DBSpendUpdateWriter: return endpoint_str = base_daily_transaction.get("endpoint") or "" - daily_transaction_key = f"{end_user_id}_{base_daily_transaction['date']}_{payload_with_end_user_id['api_key']}_{payload_with_end_user_id['model']}_{payload_with_end_user_id['custom_llm_provider']}_{endpoint_str}" + model_str = payload_with_end_user_id.get("model") or "" + provider_str = payload_with_end_user_id.get("custom_llm_provider") or "" + daily_transaction_key = f"{end_user_id}_{base_daily_transaction['date']}_{payload_with_end_user_id['api_key']}_{model_str}_{provider_str}_{endpoint_str}" daily_transaction = DailyEndUserSpendTransaction( end_user_id=end_user_id, **base_daily_transaction ) @@ -2124,7 +2132,9 @@ class DBSpendUpdateWriter: if base_daily_transaction is None: return endpoint_str = base_daily_transaction.get("endpoint") or "" - daily_transaction_key = f"{payload['agent_id']}_{base_daily_transaction['date']}_{payload_with_agent_id['api_key']}_{payload_with_agent_id['model']}_{payload_with_agent_id['custom_llm_provider']}_{endpoint_str}" + model_str = payload_with_agent_id.get("model") or "" + provider_str = payload_with_agent_id.get("custom_llm_provider") or "" + daily_transaction_key = f"{payload['agent_id']}_{base_daily_transaction['date']}_{payload_with_agent_id['api_key']}_{model_str}_{provider_str}_{endpoint_str}" daily_transaction = DailyAgentSpendTransaction( agent_id=payload["agent_id"], **base_daily_transaction ) @@ -2165,7 +2175,9 @@ class DBSpendUpdateWriter: raise ValueError(f"Invalid request_tags: {payload['request_tags']}") for tag in request_tags: endpoint_str = base_daily_transaction.get("endpoint") or "" - daily_transaction_key = f"{tag}_{base_daily_transaction['date']}_{payload['api_key']}_{payload['model']}_{payload['custom_llm_provider']}_{endpoint_str}" + model_str = payload.get("model") or "" + provider_str = payload.get("custom_llm_provider") or "" + daily_transaction_key = f"{tag}_{base_daily_transaction['date']}_{payload['api_key']}_{model_str}_{provider_str}_{endpoint_str}" daily_transaction = DailyTagSpendTransaction( tag=tag, **base_daily_transaction, request_id=payload["request_id"] )