From 9af677fcca638c83c8d2d9f87701b64de284c905 Mon Sep 17 00:00:00 2001 From: XAVIER ALMENDROS Date: Sun, 4 Oct 2026 20:19:51 +0200 Subject: [PATCH] fix(alerting): preserve legacy email budget dispatch --- litellm/proxy/utils.py | 13 ++++++++----- tests/unit/test_utils.py | 16 ++++++++++++---- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/litellm/proxy/utils.py b/litellm/proxy/utils.py index 9119f0569f3..ba28527a677 100644 --- a/litellm/proxy/utils.py +++ b/litellm/proxy/utils.py @@ -3106,11 +3106,14 @@ class ProxyLogging: should_send_email = (self.alerting is not None and "email" in self.alerting) or is_soft_budget_with_alert_emails if should_send_email and self.email_logging_instance is not None: - await self.email_logging_instance.budget_alerts( - type=type, - user_info=user_info, - budget_alert_thresholds=(tuple(configured_thresholds) if configured_thresholds is not None else None), - ) + if configured_thresholds is None: + await self.email_logging_instance.budget_alerts(type=type, user_info=user_info) + else: + await self.email_logging_instance.budget_alerts( + type=type, + user_info=user_info, + budget_alert_thresholds=tuple(configured_thresholds), + ) async def alerting_handler( self, diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py index a72aec07766..13a1bda8cbe 100644 --- a/tests/unit/test_utils.py +++ b/tests/unit/test_utils.py @@ -2627,7 +2627,9 @@ class TestProxyLoggingBudgetAlerts: proxy_logging = ProxyLogging(user_api_key_cache=DualCache()) proxy_logging.alerting = ["slack"] - proxy_logging.slack_alerting_instance = AsyncMock() + proxy_logging.slack_alerting_instance = AsyncMock( + alerting_args=proxy_logging.slack_alerting_instance.alerting_args + ) user_info = MagicMock() @@ -2675,7 +2677,9 @@ class TestProxyLoggingBudgetAlerts: proxy_logging = ProxyLogging(user_api_key_cache=DualCache()) proxy_logging.alerting = ["slack", "email"] - proxy_logging.slack_alerting_instance = AsyncMock() + proxy_logging.slack_alerting_instance = AsyncMock( + alerting_args=proxy_logging.slack_alerting_instance.alerting_args + ) proxy_logging.email_logging_instance = AsyncMock() user_info = MagicMock() @@ -2708,7 +2712,9 @@ class TestProxyLoggingBudgetAlerts: proxy_logging = ProxyLogging(user_api_key_cache=DualCache()) proxy_logging.alerting = ["slack", "email"] - proxy_logging.slack_alerting_instance = AsyncMock() + proxy_logging.slack_alerting_instance = AsyncMock( + alerting_args=proxy_logging.slack_alerting_instance.alerting_args + ) proxy_logging.email_logging_instance = AsyncMock() user_info = MagicMock() @@ -2736,7 +2742,9 @@ class TestProxyLoggingBudgetAlerts: proxy_logging = ProxyLogging(user_api_key_cache=DualCache()) proxy_logging.alerting = None # Global alerting is disabled - proxy_logging.slack_alerting_instance = AsyncMock() + proxy_logging.slack_alerting_instance = AsyncMock( + alerting_args=proxy_logging.slack_alerting_instance.alerting_args + ) proxy_logging.email_logging_instance = AsyncMock() # Create CallInfo with alert_emails set (simulating team metadata extraction)