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
This commit is contained in:
Ethan T. 2026-03-13 13:32:41 +08:00
parent 9cd7ad2634
commit aad1355668

View file

@ -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"]
)