From ccfffc5de989acbc4472521459ad7ec46cf72b5f Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Tue, 6 Jan 2026 15:54:03 -0800 Subject: [PATCH 1/5] Add endpoint to aggregate activity tables --- .../litellm_proxy_extras/schema.prisma | 24 ++++-- litellm/proxy/_types.py | 1 + litellm/proxy/db/db_spend_update_writer.py | 43 +++++++--- .../common_daily_activity.py | 35 ++++++++ litellm/proxy/schema.prisma | 24 ++++-- .../common_daily_activity.py | 3 + schema.prisma | 24 ++++-- .../proxy/db/test_db_spend_update_writer.py | 76 +++++++++++++++-- .../test_common_daily_activity.py | 84 +++++++++++++++++++ 9 files changed, 275 insertions(+), 39 deletions(-) diff --git a/litellm-proxy-extras/litellm_proxy_extras/schema.prisma b/litellm-proxy-extras/litellm_proxy_extras/schema.prisma index e565135bbc..c9de8d9c29 100644 --- a/litellm-proxy-extras/litellm_proxy_extras/schema.prisma +++ b/litellm-proxy-extras/litellm_proxy_extras/schema.prisma @@ -422,6 +422,7 @@ model LiteLLM_DailyUserSpend { model_group String? custom_llm_provider String? mcp_namespaced_tool_name String? + endpoint String? prompt_tokens BigInt @default(0) completion_tokens BigInt @default(0) cache_read_input_tokens BigInt @default(0) @@ -433,12 +434,13 @@ model LiteLLM_DailyUserSpend { created_at DateTime @default(now()) updated_at DateTime @updatedAt - @@unique([user_id, date, api_key, model, custom_llm_provider, mcp_namespaced_tool_name]) + @@unique([user_id, date, api_key, model, custom_llm_provider, mcp_namespaced_tool_name, endpoint]) @@index([date]) @@index([user_id]) @@index([api_key]) @@index([model]) @@index([mcp_namespaced_tool_name]) + @@index([endpoint]) } // Track daily organization spend metrics per model and key @@ -451,6 +453,7 @@ model LiteLLM_DailyOrganizationSpend { model_group String? custom_llm_provider String? mcp_namespaced_tool_name String? + endpoint String? prompt_tokens BigInt @default(0) completion_tokens BigInt @default(0) cache_read_input_tokens BigInt @default(0) @@ -462,12 +465,13 @@ model LiteLLM_DailyOrganizationSpend { created_at DateTime @default(now()) updated_at DateTime @updatedAt - @@unique([organization_id, date, api_key, model, custom_llm_provider, mcp_namespaced_tool_name]) + @@unique([organization_id, date, api_key, model, custom_llm_provider, mcp_namespaced_tool_name, endpoint]) @@index([date]) @@index([organization_id]) @@index([api_key]) @@index([model]) @@index([mcp_namespaced_tool_name]) + @@index([endpoint]) } // Track daily end user (customer) spend metrics per model and key @@ -480,6 +484,7 @@ model LiteLLM_DailyEndUserSpend { model_group String? custom_llm_provider String? mcp_namespaced_tool_name String? + endpoint String? prompt_tokens BigInt @default(0) completion_tokens BigInt @default(0) cache_read_input_tokens BigInt @default(0) @@ -490,12 +495,13 @@ model LiteLLM_DailyEndUserSpend { failed_requests BigInt @default(0) created_at DateTime @default(now()) updated_at DateTime @updatedAt - @@unique([end_user_id, date, api_key, model, custom_llm_provider, mcp_namespaced_tool_name]) + @@unique([end_user_id, date, api_key, model, custom_llm_provider, mcp_namespaced_tool_name, endpoint]) @@index([date]) @@index([end_user_id]) @@index([api_key]) @@index([model]) @@index([mcp_namespaced_tool_name]) + @@index([endpoint]) } // Track daily agent spend metrics per model and key @@ -508,6 +514,7 @@ model LiteLLM_DailyAgentSpend { model_group String? custom_llm_provider String? mcp_namespaced_tool_name String? + endpoint String? prompt_tokens BigInt @default(0) completion_tokens BigInt @default(0) cache_read_input_tokens BigInt @default(0) @@ -518,12 +525,13 @@ model LiteLLM_DailyAgentSpend { failed_requests BigInt @default(0) created_at DateTime @default(now()) updated_at DateTime @updatedAt - @@unique([agent_id, date, api_key, model, custom_llm_provider, mcp_namespaced_tool_name]) + @@unique([agent_id, date, api_key, model, custom_llm_provider, mcp_namespaced_tool_name, endpoint]) @@index([date]) @@index([agent_id]) @@index([api_key]) @@index([model]) @@index([mcp_namespaced_tool_name]) + @@index([endpoint]) } // Track daily team spend metrics per model and key @@ -536,6 +544,7 @@ model LiteLLM_DailyTeamSpend { model_group String? custom_llm_provider String? mcp_namespaced_tool_name String? + endpoint String? prompt_tokens BigInt @default(0) completion_tokens BigInt @default(0) cache_read_input_tokens BigInt @default(0) @@ -547,12 +556,13 @@ model LiteLLM_DailyTeamSpend { created_at DateTime @default(now()) updated_at DateTime @updatedAt - @@unique([team_id, date, api_key, model, custom_llm_provider, mcp_namespaced_tool_name]) + @@unique([team_id, date, api_key, model, custom_llm_provider, mcp_namespaced_tool_name, endpoint]) @@index([date]) @@index([team_id]) @@index([api_key]) @@index([model]) @@index([mcp_namespaced_tool_name]) + @@index([endpoint]) } // Track daily team spend metrics per model and key @@ -566,6 +576,7 @@ model LiteLLM_DailyTagSpend { model_group String? custom_llm_provider String? mcp_namespaced_tool_name String? + endpoint String? prompt_tokens BigInt @default(0) completion_tokens BigInt @default(0) cache_read_input_tokens BigInt @default(0) @@ -577,12 +588,13 @@ model LiteLLM_DailyTagSpend { created_at DateTime @default(now()) updated_at DateTime @updatedAt - @@unique([tag, date, api_key, model, custom_llm_provider, mcp_namespaced_tool_name]) + @@unique([tag, date, api_key, model, custom_llm_provider, mcp_namespaced_tool_name, endpoint]) @@index([date]) @@index([tag]) @@index([api_key]) @@index([model]) @@index([mcp_namespaced_tool_name]) + @@index([endpoint]) } diff --git a/litellm/proxy/_types.py b/litellm/proxy/_types.py index 954c26e2cb..267ff1e3a8 100644 --- a/litellm/proxy/_types.py +++ b/litellm/proxy/_types.py @@ -3734,6 +3734,7 @@ class BaseDailySpendTransaction(TypedDict): model_group: Optional[str] mcp_namespaced_tool_name: Optional[str] custom_llm_provider: Optional[str] + endpoint: Optional[str] # token count metrics prompt_tokens: int diff --git a/litellm/proxy/db/db_spend_update_writer.py b/litellm/proxy/db/db_spend_update_writer.py index 5c5cd7c19f..429e56c805 100644 --- a/litellm/proxy/db/db_spend_update_writer.py +++ b/litellm/proxy/db/db_spend_update_writer.py @@ -42,6 +42,7 @@ from litellm.proxy.db.db_transaction_queue.daily_spend_update_queue import ( from litellm.proxy.db.db_transaction_queue.pod_lock_manager import PodLockManager from litellm.proxy.db.db_transaction_queue.redis_update_buffer import RedisUpdateBuffer from litellm.proxy.db.db_transaction_queue.spend_update_queue import SpendUpdateQueue +from litellm.proxy.route_llm_request import ROUTE_ENDPOINT_MAPPING if TYPE_CHECKING: from litellm.proxy.utils import PrismaClient, ProxyLogging @@ -1205,6 +1206,7 @@ class DBSpendUpdateWriter: "mcp_namespaced_tool_name" ) or "", + "endpoint": transaction.get("endpoint") or "", } } @@ -1225,6 +1227,7 @@ class DBSpendUpdateWriter: "custom_llm_provider": transaction.get( "custom_llm_provider" ), + "endpoint": transaction.get("endpoint"), "prompt_tokens": transaction["prompt_tokens"], "completion_tokens": transaction["completion_tokens"], "spend": transaction["spend"], @@ -1287,6 +1290,9 @@ class DBSpendUpdateWriter: if entity_type == "tag" and "request_id" in transaction: update_data["request_id"] = transaction.get("request_id") + # Add endpoint to update_data so existing rows get their endpoint field updated + update_data["endpoint"] = transaction.get("endpoint") or "" + table.upsert( where=where_clause, data={ @@ -1347,7 +1353,7 @@ class DBSpendUpdateWriter: entity_type="user", entity_id_field="user_id", table_name="litellm_dailyuserspend", - unique_constraint_name="user_id_date_api_key_model_custom_llm_provider_mcp_namespaced_tool_name", + unique_constraint_name="user_id_date_api_key_model_custom_llm_provider_mcp_namespaced_tool_name_endpoint", ) @staticmethod @@ -1368,7 +1374,7 @@ class DBSpendUpdateWriter: entity_type="team", entity_id_field="team_id", table_name="litellm_dailyteamspend", - unique_constraint_name="team_id_date_api_key_model_custom_llm_provider_mcp_namespaced_tool_name", + unique_constraint_name="team_id_date_api_key_model_custom_llm_provider_mcp_namespaced_tool_name_endpoint", ) @staticmethod @@ -1389,7 +1395,7 @@ class DBSpendUpdateWriter: entity_type="org", entity_id_field="organization_id", table_name="litellm_dailyorganizationspend", - unique_constraint_name="organization_id_date_api_key_model_custom_llm_provider_mcp_namespaced_tool_name", + unique_constraint_name="organization_id_date_api_key_model_custom_llm_provider_mcp_namespaced_tool_name_endpoint", ) @staticmethod @@ -1410,7 +1416,7 @@ class DBSpendUpdateWriter: entity_type="end_user", entity_id_field="end_user_id", table_name="litellm_dailyenduserspend", - unique_constraint_name="end_user_id_date_api_key_model_custom_llm_provider_mcp_namespaced_tool_name", + unique_constraint_name="end_user_id_date_api_key_model_custom_llm_provider_mcp_namespaced_tool_name_endpoint", ) @staticmethod @@ -1431,7 +1437,7 @@ class DBSpendUpdateWriter: entity_type="agent", entity_id_field="agent_id", table_name="litellm_dailyagentspend", - unique_constraint_name="agent_id_date_api_key_model_custom_llm_provider_mcp_namespaced_tool_name", + unique_constraint_name="agent_id_date_api_key_model_custom_llm_provider_mcp_namespaced_tool_name_endpoint", ) @staticmethod @@ -1452,7 +1458,7 @@ class DBSpendUpdateWriter: entity_type="tag", entity_id_field="tag", table_name="litellm_dailytagspend", - unique_constraint_name="tag_date_api_key_model_custom_llm_provider_mcp_namespaced_tool_name", + unique_constraint_name="tag_date_api_key_model_custom_llm_provider_mcp_namespaced_tool_name_endpoint", ) async def _common_add_spend_log_transaction_to_daily_transaction( @@ -1513,6 +1519,12 @@ class DBSpendUpdateWriter: ) return None try: + # Map call_type to endpoint using ROUTE_ENDPOINT_MAPPING + call_type = payload.get("call_type", None) + endpoint = None + if call_type: + endpoint = ROUTE_ENDPOINT_MAPPING.get(call_type, None) + daily_transaction = BaseDailySpendTransaction( date=date, api_key=payload["api_key"], @@ -1520,6 +1532,7 @@ class DBSpendUpdateWriter: model_group=payload.get("model_group", None), mcp_namespaced_tool_name=payload.get("mcp_namespaced_tool_name", None), custom_llm_provider=payload.get("custom_llm_provider", None), + endpoint=endpoint, prompt_tokens=payload["prompt_tokens"], completion_tokens=payload["completion_tokens"], spend=payload["spend"], @@ -1563,7 +1576,8 @@ class DBSpendUpdateWriter: if base_daily_transaction is None: return - daily_transaction_key = f"{payload['user']}_{base_daily_transaction['date']}_{payload['api_key']}_{payload['model']}_{payload['custom_llm_provider']}" + 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}" daily_transaction = DailyUserSpendTransaction( user_id=payload["user"], **base_daily_transaction ) @@ -1595,7 +1609,8 @@ class DBSpendUpdateWriter: ) return - daily_transaction_key = f"{payload['team_id']}_{base_daily_transaction['date']}_{payload['api_key']}_{payload['model']}_{payload['custom_llm_provider']}" + 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}" daily_transaction = DailyTeamSpendTransaction( team_id=payload["team_id"], **base_daily_transaction ) @@ -1637,7 +1652,8 @@ class DBSpendUpdateWriter: if base_daily_transaction is None: return - 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 = 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}" daily_transaction = DailyOrganizationSpendTransaction( organization_id=org_id, **base_daily_transaction ) @@ -1679,7 +1695,8 @@ class DBSpendUpdateWriter: if base_daily_transaction is None: return - 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 = 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}" daily_transaction = DailyEndUserSpendTransaction( end_user_id=end_user_id, **base_daily_transaction ) @@ -1723,7 +1740,8 @@ class DBSpendUpdateWriter: ) if base_daily_transaction is None: return - 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 = 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}" daily_transaction = DailyAgentSpendTransaction( agent_id=payload['agent_id'], **base_daily_transaction ) @@ -1763,7 +1781,8 @@ class DBSpendUpdateWriter: else: raise ValueError(f"Invalid request_tags: {payload['request_tags']}") for tag in request_tags: - daily_transaction_key = f"{tag}_{base_daily_transaction['date']}_{payload['api_key']}_{payload['model']}_{payload['custom_llm_provider']}" + 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}" daily_transaction = DailyTagSpendTransaction( tag=tag, **base_daily_transaction, request_id=payload["request_id"] ) diff --git a/litellm/proxy/management_endpoints/common_daily_activity.py b/litellm/proxy/management_endpoints/common_daily_activity.py index cd28cbb714..f52abf86b9 100644 --- a/litellm/proxy/management_endpoints/common_daily_activity.py +++ b/litellm/proxy/management_endpoints/common_daily_activity.py @@ -227,6 +227,41 @@ def update_breakdown_metrics( ) ) + # Update endpoint breakdown + if record.endpoint: + if record.endpoint not in breakdown.endpoints: + breakdown.endpoints[record.endpoint] = MetricWithMetadata( + metrics=SpendMetrics(), + metadata={}, + ) + breakdown.endpoints[record.endpoint].metrics = update_metrics( + breakdown.endpoints[record.endpoint].metrics, record + ) + + # Update API key breakdown for this endpoint + if record.api_key not in breakdown.endpoints[record.endpoint].api_key_breakdown: + breakdown.endpoints[record.endpoint].api_key_breakdown[record.api_key] = ( + KeyMetricWithMetadata( + metrics=SpendMetrics(), + metadata=KeyMetadata( + key_alias=api_key_metadata.get(record.api_key, {}).get( + "key_alias", None + ), + team_id=api_key_metadata.get(record.api_key, {}).get( + "team_id", None + ), + ), + ) + ) + breakdown.endpoints[record.endpoint].api_key_breakdown[record.api_key].metrics = ( + update_metrics( + breakdown.endpoints[record.endpoint] + .api_key_breakdown[record.api_key] + .metrics, + record, + ) + ) + # Update api key breakdown if record.api_key not in breakdown.api_keys: breakdown.api_keys[record.api_key] = KeyMetricWithMetadata( diff --git a/litellm/proxy/schema.prisma b/litellm/proxy/schema.prisma index e565135bbc..c9de8d9c29 100644 --- a/litellm/proxy/schema.prisma +++ b/litellm/proxy/schema.prisma @@ -422,6 +422,7 @@ model LiteLLM_DailyUserSpend { model_group String? custom_llm_provider String? mcp_namespaced_tool_name String? + endpoint String? prompt_tokens BigInt @default(0) completion_tokens BigInt @default(0) cache_read_input_tokens BigInt @default(0) @@ -433,12 +434,13 @@ model LiteLLM_DailyUserSpend { created_at DateTime @default(now()) updated_at DateTime @updatedAt - @@unique([user_id, date, api_key, model, custom_llm_provider, mcp_namespaced_tool_name]) + @@unique([user_id, date, api_key, model, custom_llm_provider, mcp_namespaced_tool_name, endpoint]) @@index([date]) @@index([user_id]) @@index([api_key]) @@index([model]) @@index([mcp_namespaced_tool_name]) + @@index([endpoint]) } // Track daily organization spend metrics per model and key @@ -451,6 +453,7 @@ model LiteLLM_DailyOrganizationSpend { model_group String? custom_llm_provider String? mcp_namespaced_tool_name String? + endpoint String? prompt_tokens BigInt @default(0) completion_tokens BigInt @default(0) cache_read_input_tokens BigInt @default(0) @@ -462,12 +465,13 @@ model LiteLLM_DailyOrganizationSpend { created_at DateTime @default(now()) updated_at DateTime @updatedAt - @@unique([organization_id, date, api_key, model, custom_llm_provider, mcp_namespaced_tool_name]) + @@unique([organization_id, date, api_key, model, custom_llm_provider, mcp_namespaced_tool_name, endpoint]) @@index([date]) @@index([organization_id]) @@index([api_key]) @@index([model]) @@index([mcp_namespaced_tool_name]) + @@index([endpoint]) } // Track daily end user (customer) spend metrics per model and key @@ -480,6 +484,7 @@ model LiteLLM_DailyEndUserSpend { model_group String? custom_llm_provider String? mcp_namespaced_tool_name String? + endpoint String? prompt_tokens BigInt @default(0) completion_tokens BigInt @default(0) cache_read_input_tokens BigInt @default(0) @@ -490,12 +495,13 @@ model LiteLLM_DailyEndUserSpend { failed_requests BigInt @default(0) created_at DateTime @default(now()) updated_at DateTime @updatedAt - @@unique([end_user_id, date, api_key, model, custom_llm_provider, mcp_namespaced_tool_name]) + @@unique([end_user_id, date, api_key, model, custom_llm_provider, mcp_namespaced_tool_name, endpoint]) @@index([date]) @@index([end_user_id]) @@index([api_key]) @@index([model]) @@index([mcp_namespaced_tool_name]) + @@index([endpoint]) } // Track daily agent spend metrics per model and key @@ -508,6 +514,7 @@ model LiteLLM_DailyAgentSpend { model_group String? custom_llm_provider String? mcp_namespaced_tool_name String? + endpoint String? prompt_tokens BigInt @default(0) completion_tokens BigInt @default(0) cache_read_input_tokens BigInt @default(0) @@ -518,12 +525,13 @@ model LiteLLM_DailyAgentSpend { failed_requests BigInt @default(0) created_at DateTime @default(now()) updated_at DateTime @updatedAt - @@unique([agent_id, date, api_key, model, custom_llm_provider, mcp_namespaced_tool_name]) + @@unique([agent_id, date, api_key, model, custom_llm_provider, mcp_namespaced_tool_name, endpoint]) @@index([date]) @@index([agent_id]) @@index([api_key]) @@index([model]) @@index([mcp_namespaced_tool_name]) + @@index([endpoint]) } // Track daily team spend metrics per model and key @@ -536,6 +544,7 @@ model LiteLLM_DailyTeamSpend { model_group String? custom_llm_provider String? mcp_namespaced_tool_name String? + endpoint String? prompt_tokens BigInt @default(0) completion_tokens BigInt @default(0) cache_read_input_tokens BigInt @default(0) @@ -547,12 +556,13 @@ model LiteLLM_DailyTeamSpend { created_at DateTime @default(now()) updated_at DateTime @updatedAt - @@unique([team_id, date, api_key, model, custom_llm_provider, mcp_namespaced_tool_name]) + @@unique([team_id, date, api_key, model, custom_llm_provider, mcp_namespaced_tool_name, endpoint]) @@index([date]) @@index([team_id]) @@index([api_key]) @@index([model]) @@index([mcp_namespaced_tool_name]) + @@index([endpoint]) } // Track daily team spend metrics per model and key @@ -566,6 +576,7 @@ model LiteLLM_DailyTagSpend { model_group String? custom_llm_provider String? mcp_namespaced_tool_name String? + endpoint String? prompt_tokens BigInt @default(0) completion_tokens BigInt @default(0) cache_read_input_tokens BigInt @default(0) @@ -577,12 +588,13 @@ model LiteLLM_DailyTagSpend { created_at DateTime @default(now()) updated_at DateTime @updatedAt - @@unique([tag, date, api_key, model, custom_llm_provider, mcp_namespaced_tool_name]) + @@unique([tag, date, api_key, model, custom_llm_provider, mcp_namespaced_tool_name, endpoint]) @@index([date]) @@index([tag]) @@index([api_key]) @@index([model]) @@index([mcp_namespaced_tool_name]) + @@index([endpoint]) } diff --git a/litellm/types/proxy/management_endpoints/common_daily_activity.py b/litellm/types/proxy/management_endpoints/common_daily_activity.py index 08ffc5d097..948401fb8b 100644 --- a/litellm/types/proxy/management_endpoints/common_daily_activity.py +++ b/litellm/types/proxy/management_endpoints/common_daily_activity.py @@ -68,6 +68,9 @@ class BreakdownMetrics(BaseModel): providers: Dict[str, MetricWithMetadata] = Field( default_factory=dict ) # provider -> {metrics, metadata} + endpoints: Dict[str, MetricWithMetadata] = Field( + default_factory=dict + ) # endpoint -> {metrics, metadata} api_keys: Dict[str, KeyMetricWithMetadata] = Field( default_factory=dict ) # api_key -> {metrics, metadata} diff --git a/schema.prisma b/schema.prisma index e565135bbc..c9de8d9c29 100644 --- a/schema.prisma +++ b/schema.prisma @@ -422,6 +422,7 @@ model LiteLLM_DailyUserSpend { model_group String? custom_llm_provider String? mcp_namespaced_tool_name String? + endpoint String? prompt_tokens BigInt @default(0) completion_tokens BigInt @default(0) cache_read_input_tokens BigInt @default(0) @@ -433,12 +434,13 @@ model LiteLLM_DailyUserSpend { created_at DateTime @default(now()) updated_at DateTime @updatedAt - @@unique([user_id, date, api_key, model, custom_llm_provider, mcp_namespaced_tool_name]) + @@unique([user_id, date, api_key, model, custom_llm_provider, mcp_namespaced_tool_name, endpoint]) @@index([date]) @@index([user_id]) @@index([api_key]) @@index([model]) @@index([mcp_namespaced_tool_name]) + @@index([endpoint]) } // Track daily organization spend metrics per model and key @@ -451,6 +453,7 @@ model LiteLLM_DailyOrganizationSpend { model_group String? custom_llm_provider String? mcp_namespaced_tool_name String? + endpoint String? prompt_tokens BigInt @default(0) completion_tokens BigInt @default(0) cache_read_input_tokens BigInt @default(0) @@ -462,12 +465,13 @@ model LiteLLM_DailyOrganizationSpend { created_at DateTime @default(now()) updated_at DateTime @updatedAt - @@unique([organization_id, date, api_key, model, custom_llm_provider, mcp_namespaced_tool_name]) + @@unique([organization_id, date, api_key, model, custom_llm_provider, mcp_namespaced_tool_name, endpoint]) @@index([date]) @@index([organization_id]) @@index([api_key]) @@index([model]) @@index([mcp_namespaced_tool_name]) + @@index([endpoint]) } // Track daily end user (customer) spend metrics per model and key @@ -480,6 +484,7 @@ model LiteLLM_DailyEndUserSpend { model_group String? custom_llm_provider String? mcp_namespaced_tool_name String? + endpoint String? prompt_tokens BigInt @default(0) completion_tokens BigInt @default(0) cache_read_input_tokens BigInt @default(0) @@ -490,12 +495,13 @@ model LiteLLM_DailyEndUserSpend { failed_requests BigInt @default(0) created_at DateTime @default(now()) updated_at DateTime @updatedAt - @@unique([end_user_id, date, api_key, model, custom_llm_provider, mcp_namespaced_tool_name]) + @@unique([end_user_id, date, api_key, model, custom_llm_provider, mcp_namespaced_tool_name, endpoint]) @@index([date]) @@index([end_user_id]) @@index([api_key]) @@index([model]) @@index([mcp_namespaced_tool_name]) + @@index([endpoint]) } // Track daily agent spend metrics per model and key @@ -508,6 +514,7 @@ model LiteLLM_DailyAgentSpend { model_group String? custom_llm_provider String? mcp_namespaced_tool_name String? + endpoint String? prompt_tokens BigInt @default(0) completion_tokens BigInt @default(0) cache_read_input_tokens BigInt @default(0) @@ -518,12 +525,13 @@ model LiteLLM_DailyAgentSpend { failed_requests BigInt @default(0) created_at DateTime @default(now()) updated_at DateTime @updatedAt - @@unique([agent_id, date, api_key, model, custom_llm_provider, mcp_namespaced_tool_name]) + @@unique([agent_id, date, api_key, model, custom_llm_provider, mcp_namespaced_tool_name, endpoint]) @@index([date]) @@index([agent_id]) @@index([api_key]) @@index([model]) @@index([mcp_namespaced_tool_name]) + @@index([endpoint]) } // Track daily team spend metrics per model and key @@ -536,6 +544,7 @@ model LiteLLM_DailyTeamSpend { model_group String? custom_llm_provider String? mcp_namespaced_tool_name String? + endpoint String? prompt_tokens BigInt @default(0) completion_tokens BigInt @default(0) cache_read_input_tokens BigInt @default(0) @@ -547,12 +556,13 @@ model LiteLLM_DailyTeamSpend { created_at DateTime @default(now()) updated_at DateTime @updatedAt - @@unique([team_id, date, api_key, model, custom_llm_provider, mcp_namespaced_tool_name]) + @@unique([team_id, date, api_key, model, custom_llm_provider, mcp_namespaced_tool_name, endpoint]) @@index([date]) @@index([team_id]) @@index([api_key]) @@index([model]) @@index([mcp_namespaced_tool_name]) + @@index([endpoint]) } // Track daily team spend metrics per model and key @@ -566,6 +576,7 @@ model LiteLLM_DailyTagSpend { model_group String? custom_llm_provider String? mcp_namespaced_tool_name String? + endpoint String? prompt_tokens BigInt @default(0) completion_tokens BigInt @default(0) cache_read_input_tokens BigInt @default(0) @@ -577,12 +588,13 @@ model LiteLLM_DailyTagSpend { created_at DateTime @default(now()) updated_at DateTime @updatedAt - @@unique([tag, date, api_key, model, custom_llm_provider, mcp_namespaced_tool_name]) + @@unique([tag, date, api_key, model, custom_llm_provider, mcp_namespaced_tool_name, endpoint]) @@index([date]) @@index([tag]) @@index([api_key]) @@index([model]) @@index([mcp_namespaced_tool_name]) + @@index([endpoint]) } diff --git a/tests/test_litellm/proxy/db/test_db_spend_update_writer.py b/tests/test_litellm/proxy/db/test_db_spend_update_writer.py index e9d2313ece..72403b0ba7 100644 --- a/tests/test_litellm/proxy/db/test_db_spend_update_writer.py +++ b/tests/test_litellm/proxy/db/test_db_spend_update_writer.py @@ -107,7 +107,7 @@ async def test_update_daily_spend_with_null_entity_id(): entity_type="user", entity_id_field="user_id", table_name="litellm_dailyuserspend", - unique_constraint_name="user_id_date_api_key_model_custom_llm_provider", + unique_constraint_name="user_id_date_api_key_model_custom_llm_provider_mcp_namespaced_tool_name_endpoint", ) # Verify that table.upsert was called @@ -115,12 +115,14 @@ async def test_update_daily_spend_with_null_entity_id(): # Verify the where clause contains null entity_id call_args = mock_table.upsert.call_args[1] - where_clause = call_args["where"]["user_id_date_api_key_model_custom_llm_provider"] + where_clause = call_args["where"]["user_id_date_api_key_model_custom_llm_provider_mcp_namespaced_tool_name_endpoint"] assert where_clause["user_id"] is None assert where_clause["date"] == "2024-01-01" assert where_clause["api_key"] == "test-api-key" assert where_clause["model"] == "gpt-4" assert where_clause["custom_llm_provider"] == "openai" + assert where_clause["mcp_namespaced_tool_name"] == "" + assert where_clause["endpoint"] == "" # Verify the create data contains null entity_id create_data = call_args["data"]["create"] @@ -129,6 +131,8 @@ async def test_update_daily_spend_with_null_entity_id(): assert create_data["api_key"] == "test-api-key" assert create_data["model"] == "gpt-4" assert create_data["custom_llm_provider"] == "openai" + assert create_data["mcp_namespaced_tool_name"] == "" + assert create_data["endpoint"] is None assert create_data["prompt_tokens"] == 10 assert create_data["completion_tokens"] == 20 assert create_data["spend"] == 0.1 @@ -171,13 +175,14 @@ async def test_update_daily_spend_sorting(): } upsert_calls.append(call( where={ - "user_id_date_api_key_model_custom_llm_provider": { + "user_id_date_api_key_model_custom_llm_provider_mcp_namespaced_tool_name_endpoint": { "user_id": f"user{i+11}", # user11 ... user60, sorted order "date": "2024-01-01", "api_key": "test-api-key", "model": "gpt-4", "custom_llm_provider": "openai", "mcp_namespaced_tool_name": "", + "endpoint": "", } }, data={ @@ -189,6 +194,7 @@ async def test_update_daily_spend_sorting(): "model_group": None, "mcp_namespaced_tool_name": "", "custom_llm_provider": "openai", + "endpoint": None, "prompt_tokens": 10, "completion_tokens": 20, "spend": 0.1, @@ -203,6 +209,7 @@ async def test_update_daily_spend_sorting(): "api_requests": {"increment": 1}, "successful_requests": {"increment": 1}, "failed_requests": {"increment": 0}, + "endpoint": "", }, }, )) @@ -216,7 +223,7 @@ async def test_update_daily_spend_sorting(): entity_type="user", entity_id_field="user_id", table_name="litellm_dailyuserspend", - unique_constraint_name="user_id_date_api_key_model_custom_llm_provider", + unique_constraint_name="user_id_date_api_key_model_custom_llm_provider_mcp_namespaced_tool_name_endpoint", ) # Verify that table.upsert was called @@ -372,7 +379,7 @@ async def test_update_daily_spend_with_none_values_in_sorting_fields(): entity_type="user", entity_id_field="user_id", table_name="litellm_dailyuserspend", - unique_constraint_name="user_id_date_api_key_model_custom_llm_provider", + unique_constraint_name="user_id_date_api_key_model_custom_llm_provider_mcp_namespaced_tool_name_endpoint", ) # Verify that table.upsert was called (should be called 5 times, once for each transaction) @@ -588,7 +595,7 @@ async def test_add_spend_log_transaction_to_daily_org_transaction_injects_org_id update_dict = call_args["update"] assert len(update_dict) == 1 for key, transaction in update_dict.items(): - assert key == f"{org_id}_2024-01-01_test-key_gpt-4_openai" + assert key == f"{org_id}_2024-01-01_test-key_gpt-4_openai_" assert transaction["organization_id"] == org_id assert transaction["date"] == "2024-01-01" assert transaction["api_key"] == "test-key" @@ -665,7 +672,7 @@ async def test_add_spend_log_transaction_to_daily_end_user_transaction_injects_e update_dict = call_args["update"] assert len(update_dict) == 1 for key, transaction in update_dict.items(): - assert key == f"{end_user_id}_2024-01-01_test-key_gpt-4_openai" + assert key == f"{end_user_id}_2024-01-01_test-key_gpt-4_openai_" assert transaction["end_user_id"] == end_user_id assert transaction["date"] == "2024-01-01" assert transaction["api_key"] == "test-key" @@ -741,7 +748,7 @@ async def test_add_spend_log_transaction_to_daily_agent_transaction_injects_agen update_dict = call_args["update"] assert len(update_dict) == 1 for key, transaction in update_dict.items(): - assert key == f"{agent_id}_2024-01-01_test-key_gpt-4_openai" + assert key == f"{agent_id}_2024-01-01_test-key_gpt-4_openai_" assert transaction["agent_id"] == agent_id assert transaction["date"] == "2024-01-01" assert transaction["api_key"] == "test-key" @@ -780,4 +787,55 @@ async def test_add_spend_log_transaction_to_daily_agent_transaction_skips_when_a prisma_client=mock_prisma, ) - writer.daily_agent_spend_update_queue.add_update.assert_not_called() \ No newline at end of file + writer.daily_agent_spend_update_queue.add_update.assert_not_called() + + +@pytest.mark.asyncio +async def test_endpoint_field_is_correctly_mapped_from_call_type(): + """ + Test that the endpoint field is correctly mapped from call_type using ROUTE_ENDPOINT_MAPPING. + Verifies that when call_type is provided, the endpoint is set in the transaction and included in the key. + """ + writer = DBSpendUpdateWriter() + mock_prisma = MagicMock() + mock_prisma.get_request_status = MagicMock(return_value="success") + + payload = { + "request_id": "req-endpoint-test", + "user": "test-user", + "call_type": "acompletion", # Maps to "/chat/completions" + "startTime": "2024-01-01T12:00:00", + "api_key": "test-key", + "model": "gpt-4", + "custom_llm_provider": "openai", + "model_group": "gpt-4-group", + "prompt_tokens": 100, + "completion_tokens": 50, + "spend": 0.15, + "metadata": '{"usage_object": {}}', + } + + writer.daily_spend_update_queue.add_update = AsyncMock() + + await writer.add_spend_log_transaction_to_daily_user_transaction( + payload=payload, + prisma_client=mock_prisma, + ) + + writer.daily_spend_update_queue.add_update.assert_called_once() + + call_args = writer.daily_spend_update_queue.add_update.call_args[1] + update_dict = call_args["update"] + assert len(update_dict) == 1 + + for key, transaction in update_dict.items(): + # Verify endpoint is included in the key + assert key == f"test-user_2024-01-01_test-key_gpt-4_openai_/chat/completions" + + # Verify endpoint is set in the transaction + assert transaction["endpoint"] == "/chat/completions" + assert transaction["user_id"] == "test-user" + assert transaction["date"] == "2024-01-01" + assert transaction["api_key"] == "test-key" + assert transaction["model"] == "gpt-4" + assert transaction["custom_llm_provider"] == "openai" \ No newline at end of file diff --git a/tests/test_litellm/proxy/management_endpoints/test_common_daily_activity.py b/tests/test_litellm/proxy/management_endpoints/test_common_daily_activity.py index bbdc4b1edf..93457631d2 100644 --- a/tests/test_litellm/proxy/management_endpoints/test_common_daily_activity.py +++ b/tests/test_litellm/proxy/management_endpoints/test_common_daily_activity.py @@ -12,6 +12,7 @@ from litellm.proxy.management_endpoints.common_daily_activity import ( _is_user_agent_tag, compute_tag_metadata_totals, get_daily_activity, + get_daily_activity_aggregated, ) @@ -124,3 +125,86 @@ def test_compute_tag_metadata_totals(): result = compute_tag_metadata_totals([]) assert result.spend == 0.0 assert result.prompt_tokens == 0 + + +@pytest.mark.asyncio +async def test_get_daily_activity_aggregated_with_endpoint_breakdown(): + """Test that endpoint breakdown is included in aggregated daily activity.""" + # Mock PrismaClient + mock_prisma = MagicMock() + mock_prisma.db = MagicMock() + + # Create mock records with endpoint fields + class MockRecord: + def __init__(self, date, endpoint, api_key, model, spend, prompt_tokens, completion_tokens): + self.date = date + self.endpoint = endpoint + self.api_key = api_key + self.model = model + self.model_group = None + self.custom_llm_provider = "openai" + self.mcp_namespaced_tool_name = None + self.spend = spend + self.prompt_tokens = prompt_tokens + self.completion_tokens = completion_tokens + self.total_tokens = prompt_tokens + completion_tokens + self.cache_read_input_tokens = 0 + self.cache_creation_input_tokens = 0 + self.api_requests = 1 + self.successful_requests = 1 + self.failed_requests = 0 + + mock_records = [ + MockRecord("2024-01-01", "/v1/chat/completions", "key-1", "gpt-4", 10.0, 100, 50), + MockRecord("2024-01-01", "/v1/chat/completions", "key-1", "gpt-4", 5.0, 50, 25), + MockRecord("2024-01-01", "/v1/embeddings", "key-2", "text-embedding-ada-002", 3.0, 30, 0), + ] + + # Mock the table methods + mock_table = MagicMock() + mock_table.find_many = AsyncMock(return_value=mock_records) + mock_prisma.db.litellm_dailyuserspend = mock_table + mock_prisma.db.litellm_verificationtoken = MagicMock() + mock_prisma.db.litellm_verificationtoken.find_many = AsyncMock(return_value=[]) + + # Call the function + result = await get_daily_activity_aggregated( + prisma_client=mock_prisma, + table_name="litellm_dailyuserspend", + entity_id_field="user_id", + entity_id=None, + entity_metadata_field=None, + start_date="2024-01-01", + end_date="2024-01-01", + model=None, + api_key=None, + ) + + # Verify the results + assert len(result.results) == 1 + daily_data = result.results[0] + assert daily_data.date.strftime("%Y-%m-%d") == "2024-01-01" + + # Verify endpoint breakdown exists + assert "endpoints" in daily_data.breakdown.model_fields + assert len(daily_data.breakdown.endpoints) == 2 + + # Verify /v1/chat/completions endpoint breakdown + assert "/v1/chat/completions" in daily_data.breakdown.endpoints + chat_endpoint = daily_data.breakdown.endpoints["/v1/chat/completions"] + assert chat_endpoint.metrics.spend == 15.0 # 10.0 + 5.0 + assert chat_endpoint.metrics.prompt_tokens == 150 # 100 + 50 + assert chat_endpoint.metrics.completion_tokens == 75 # 50 + 25 + + # Verify /v1/embeddings endpoint breakdown + assert "/v1/embeddings" in daily_data.breakdown.endpoints + embeddings_endpoint = daily_data.breakdown.endpoints["/v1/embeddings"] + assert embeddings_endpoint.metrics.spend == 3.0 + assert embeddings_endpoint.metrics.prompt_tokens == 30 + assert embeddings_endpoint.metrics.completion_tokens == 0 + + # Verify API key breakdowns within endpoints + assert "key-1" in chat_endpoint.api_key_breakdown + assert chat_endpoint.api_key_breakdown["key-1"].metrics.spend == 15.0 + assert "key-2" in embeddings_endpoint.api_key_breakdown + assert embeddings_endpoint.api_key_breakdown["key-2"].metrics.spend == 3.0 From 1f16b8c093fa0bb9a5a8fa6e4a0be0916e9ca0c6 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Tue, 6 Jan 2026 16:02:08 -0800 Subject: [PATCH 2/5] cz bump and migration --- .../migration.sql | 72 +++++++++++++++++++ litellm-proxy-extras/pyproject.toml | 4 +- pyproject.toml | 2 +- requirements.txt | 2 +- 4 files changed, 76 insertions(+), 4 deletions(-) create mode 100644 litellm-proxy-extras/litellm_proxy_extras/migrations/20260106155622_add_endpoint_to_daily_activity_tables/migration.sql diff --git a/litellm-proxy-extras/litellm_proxy_extras/migrations/20260106155622_add_endpoint_to_daily_activity_tables/migration.sql b/litellm-proxy-extras/litellm_proxy_extras/migrations/20260106155622_add_endpoint_to_daily_activity_tables/migration.sql new file mode 100644 index 0000000000..4ed7feb9ca --- /dev/null +++ b/litellm-proxy-extras/litellm_proxy_extras/migrations/20260106155622_add_endpoint_to_daily_activity_tables/migration.sql @@ -0,0 +1,72 @@ +-- DropIndex +DROP INDEX "LiteLLM_DailyAgentSpend_agent_id_date_api_key_model_custom__key"; + +-- DropIndex +DROP INDEX "LiteLLM_DailyEndUserSpend_end_user_id_date_api_key_model_cu_key"; + +-- DropIndex +DROP INDEX "LiteLLM_DailyOrganizationSpend_organization_id_date_api_key_key"; + +-- DropIndex +DROP INDEX "LiteLLM_DailyTagSpend_tag_date_api_key_model_custom_llm_pro_key"; + +-- DropIndex +DROP INDEX "LiteLLM_DailyTeamSpend_team_id_date_api_key_model_custom_ll_key"; + +-- DropIndex +DROP INDEX "LiteLLM_DailyUserSpend_user_id_date_api_key_model_custom_ll_key"; + +-- AlterTable +ALTER TABLE "LiteLLM_DailyAgentSpend" ADD COLUMN "endpoint" TEXT; + +-- AlterTable +ALTER TABLE "LiteLLM_DailyEndUserSpend" ADD COLUMN "endpoint" TEXT; + +-- AlterTable +ALTER TABLE "LiteLLM_DailyOrganizationSpend" ADD COLUMN "endpoint" TEXT; + +-- AlterTable +ALTER TABLE "LiteLLM_DailyTagSpend" ADD COLUMN "endpoint" TEXT; + +-- AlterTable +ALTER TABLE "LiteLLM_DailyTeamSpend" ADD COLUMN "endpoint" TEXT; + +-- AlterTable +ALTER TABLE "LiteLLM_DailyUserSpend" ADD COLUMN "endpoint" TEXT; + +-- CreateIndex +CREATE INDEX "LiteLLM_DailyAgentSpend_endpoint_idx" ON "LiteLLM_DailyAgentSpend"("endpoint"); + +-- CreateIndex +CREATE UNIQUE INDEX "LiteLLM_DailyAgentSpend_agent_id_date_api_key_model_custom__key" ON "LiteLLM_DailyAgentSpend"("agent_id", "date", "api_key", "model", "custom_llm_provider", "mcp_namespaced_tool_name", "endpoint"); + +-- CreateIndex +CREATE INDEX "LiteLLM_DailyEndUserSpend_endpoint_idx" ON "LiteLLM_DailyEndUserSpend"("endpoint"); + +-- CreateIndex +CREATE UNIQUE INDEX "LiteLLM_DailyEndUserSpend_end_user_id_date_api_key_model_cu_key" ON "LiteLLM_DailyEndUserSpend"("end_user_id", "date", "api_key", "model", "custom_llm_provider", "mcp_namespaced_tool_name", "endpoint"); + +-- CreateIndex +CREATE INDEX "LiteLLM_DailyOrganizationSpend_endpoint_idx" ON "LiteLLM_DailyOrganizationSpend"("endpoint"); + +-- CreateIndex +CREATE UNIQUE INDEX "LiteLLM_DailyOrganizationSpend_organization_id_date_api_key_key" ON "LiteLLM_DailyOrganizationSpend"("organization_id", "date", "api_key", "model", "custom_llm_provider", "mcp_namespaced_tool_name", "endpoint"); + +-- CreateIndex +CREATE INDEX "LiteLLM_DailyTagSpend_endpoint_idx" ON "LiteLLM_DailyTagSpend"("endpoint"); + +-- CreateIndex +CREATE UNIQUE INDEX "LiteLLM_DailyTagSpend_tag_date_api_key_model_custom_llm_pro_key" ON "LiteLLM_DailyTagSpend"("tag", "date", "api_key", "model", "custom_llm_provider", "mcp_namespaced_tool_name", "endpoint"); + +-- CreateIndex +CREATE INDEX "LiteLLM_DailyTeamSpend_endpoint_idx" ON "LiteLLM_DailyTeamSpend"("endpoint"); + +-- CreateIndex +CREATE UNIQUE INDEX "LiteLLM_DailyTeamSpend_team_id_date_api_key_model_custom_ll_key" ON "LiteLLM_DailyTeamSpend"("team_id", "date", "api_key", "model", "custom_llm_provider", "mcp_namespaced_tool_name", "endpoint"); + +-- CreateIndex +CREATE INDEX "LiteLLM_DailyUserSpend_endpoint_idx" ON "LiteLLM_DailyUserSpend"("endpoint"); + +-- CreateIndex +CREATE UNIQUE INDEX "LiteLLM_DailyUserSpend_user_id_date_api_key_model_custom_ll_key" ON "LiteLLM_DailyUserSpend"("user_id", "date", "api_key", "model", "custom_llm_provider", "mcp_namespaced_tool_name", "endpoint"); + diff --git a/litellm-proxy-extras/pyproject.toml b/litellm-proxy-extras/pyproject.toml index 7c11a04fca..e9117dca73 100644 --- a/litellm-proxy-extras/pyproject.toml +++ b/litellm-proxy-extras/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "litellm-proxy-extras" -version = "0.4.16" +version = "0.4.17" description = "Additional files for the LiteLLM Proxy. Reduces the size of the main litellm package." authors = ["BerriAI"] readme = "README.md" @@ -22,7 +22,7 @@ requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" [tool.commitizen] -version = "0.4.16" +version = "0.4.17" version_files = [ "pyproject.toml:version", "../requirements.txt:litellm-proxy-extras==", diff --git a/pyproject.toml b/pyproject.toml index 3b09119a74..6b7d1a7867 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -59,7 +59,7 @@ websockets = {version = "^15.0.1", optional = true} boto3 = {version = "1.36.0", optional = true} redisvl = {version = "^0.4.1", optional = true, markers = "python_version >= '3.9' and python_version < '3.14'"} mcp = {version = "^1.21.2", optional = true, python = ">=3.10"} -litellm-proxy-extras = {version = "0.4.16", optional = true} +litellm-proxy-extras = {version = "0.4.17", optional = true} rich = {version = "13.7.1", optional = true} litellm-enterprise = {version = "0.1.27", optional = true} diskcache = {version = "^5.6.1", optional = true} diff --git a/requirements.txt b/requirements.txt index 249b899b86..41a7b56566 100644 --- a/requirements.txt +++ b/requirements.txt @@ -47,7 +47,7 @@ sentry_sdk==2.21.0 # for sentry error handling detect-secrets==1.5.0 # Enterprise - secret detection / masking in LLM requests cryptography==44.0.1 tzdata==2025.1 # IANA time zone database -litellm-proxy-extras==0.4.16 # for proxy extras - e.g. prisma migrations +litellm-proxy-extras==0.4.17 # for proxy extras - e.g. prisma migrations llm-sandbox==0.3.31 # for skill execution in sandbox ### LITELLM PACKAGE DEPENDENCIES python-dotenv==1.0.1 # for env From 1466f381226975158fa1b6a828a2cc4f0c427aab Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Tue, 6 Jan 2026 16:29:47 -0800 Subject: [PATCH 3/5] Adding dist build files --- ...litellm_proxy_extras-0.4.17-py3-none-any.whl | Bin 0 -> 46112 bytes .../dist/litellm_proxy_extras-0.4.17.tar.gz | Bin 0 -> 20967 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 litellm-proxy-extras/dist/litellm_proxy_extras-0.4.17-py3-none-any.whl create mode 100644 litellm-proxy-extras/dist/litellm_proxy_extras-0.4.17.tar.gz diff --git a/litellm-proxy-extras/dist/litellm_proxy_extras-0.4.17-py3-none-any.whl b/litellm-proxy-extras/dist/litellm_proxy_extras-0.4.17-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..9f8a8b03931f05be7bab081e54363d4db53ddd79 GIT binary patch literal 46112 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 XX-L4mT)@L9fG;kic`@9yv2 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 Date: Wed, 7 Jan 2026 10:27:07 -0800 Subject: [PATCH 4/5] =?UTF-8?q?bump:=20version=200.4.18=20=E2=86=92=200.4.?= =?UTF-8?q?19?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- litellm-proxy-extras/pyproject.toml | 4 ++-- pyproject.toml | 2 +- requirements.txt | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/litellm-proxy-extras/pyproject.toml b/litellm-proxy-extras/pyproject.toml index 384a4cce0a..487cef29c3 100644 --- a/litellm-proxy-extras/pyproject.toml +++ b/litellm-proxy-extras/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "litellm-proxy-extras" -version = "0.4.18" +version = "0.4.19" description = "Additional files for the LiteLLM Proxy. Reduces the size of the main litellm package." authors = ["BerriAI"] readme = "README.md" @@ -22,7 +22,7 @@ requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" [tool.commitizen] -version = "0.4.18" +version = "0.4.19" version_files = [ "pyproject.toml:version", "../requirements.txt:litellm-proxy-extras==", diff --git a/pyproject.toml b/pyproject.toml index a3ee4afa4b..91a82f2fcb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -59,7 +59,7 @@ websockets = {version = "^15.0.1", optional = true} boto3 = {version = "1.36.0", optional = true} redisvl = {version = "^0.4.1", optional = true, markers = "python_version >= '3.9' and python_version < '3.14'"} mcp = {version = "^1.21.2", optional = true, python = ">=3.10"} -litellm-proxy-extras = {version = "0.4.18", optional = true} +litellm-proxy-extras = {version = "0.4.19", optional = true} rich = {version = "13.7.1", optional = true} litellm-enterprise = {version = "0.1.27", optional = true} diskcache = {version = "^5.6.1", optional = true} diff --git a/requirements.txt b/requirements.txt index fc2a1e764d..23fa43433a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -47,7 +47,7 @@ sentry_sdk==2.21.0 # for sentry error handling detect-secrets==1.5.0 # Enterprise - secret detection / masking in LLM requests cryptography==44.0.1 tzdata==2025.1 # IANA time zone database -litellm-proxy-extras==0.4.18 # for proxy extras - e.g. prisma migrations +litellm-proxy-extras==0.4.19 # for proxy extras - e.g. prisma migrations llm-sandbox==0.3.31 # for skill execution in sandbox ### LITELLM PACKAGE DEPENDENCIES python-dotenv==1.0.1 # for env From 6523c8f233de26e8cf148485f0dbe00d7b761eb9 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Wed, 7 Jan 2026 10:27:50 -0800 Subject: [PATCH 5/5] Adding builds --- ...litellm_proxy_extras-0.4.19-py3-none-any.whl | Bin 0 -> 46112 bytes .../dist/litellm_proxy_extras-0.4.19.tar.gz | Bin 0 -> 20970 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 litellm-proxy-extras/dist/litellm_proxy_extras-0.4.19-py3-none-any.whl create mode 100644 litellm-proxy-extras/dist/litellm_proxy_extras-0.4.19.tar.gz diff --git a/litellm-proxy-extras/dist/litellm_proxy_extras-0.4.19-py3-none-any.whl b/litellm-proxy-extras/dist/litellm_proxy_extras-0.4.19-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..471ddce912c2f666785b66cf23b02b817aa641ff GIT binary patch literal 46112 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 ZMNSeDa4#3|Fbd#{18~)QJnHwq{vXkfd+GoH literal 0 HcmV?d00001 diff --git a/litellm-proxy-extras/dist/litellm_proxy_extras-0.4.19.tar.gz b/litellm-proxy-extras/dist/litellm_proxy_extras-0.4.19.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..290c4bfeef55a528fd79fde6c4ff48e96d4bf030 GIT binary patch literal 20970 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 OKK~B~)lD-1a039QAy~cu literal 0 HcmV?d00001