Spaces:
Configuration error
Configuration error
""" | |
Endpoints for managing email alerts on litellm | |
""" | |
import json | |
from typing import Dict | |
from fastapi import APIRouter, Depends, HTTPException | |
from litellm_enterprise.types.enterprise_callbacks.send_emails import ( | |
DefaultEmailSettings, | |
EmailEvent, | |
EmailEventSettings, | |
EmailEventSettingsResponse, | |
EmailEventSettingsUpdateRequest, | |
) | |
from litellm._logging import verbose_proxy_logger | |
from litellm.proxy._types import UserAPIKeyAuth | |
from litellm.proxy.auth.user_api_key_auth import user_api_key_auth | |
router = APIRouter() | |
async def _get_email_settings(prisma_client) -> Dict[str, bool]: | |
"""Helper function to get email settings from general_settings in db""" | |
try: | |
# Get general settings from db | |
general_settings_entry = await prisma_client.db.litellm_config.find_unique( | |
where={"param_name": "general_settings"} | |
) | |
# Initialize with default email settings | |
settings_dict = DefaultEmailSettings.get_defaults() | |
if ( | |
general_settings_entry is not None | |
and general_settings_entry.param_value is not None | |
): | |
# Get general settings value | |
if isinstance(general_settings_entry.param_value, str): | |
general_settings = json.loads(general_settings_entry.param_value) | |
else: | |
general_settings = general_settings_entry.param_value | |
# Extract email_settings from general settings if it exists | |
if general_settings and "email_settings" in general_settings: | |
email_settings = general_settings["email_settings"] | |
# Update settings_dict with values from general_settings | |
for event_name, enabled in email_settings.items(): | |
settings_dict[event_name] = enabled | |
return settings_dict | |
except Exception as e: | |
verbose_proxy_logger.error( | |
f"Error getting email settings from general_settings: {str(e)}" | |
) | |
# Return default settings in case of error | |
return DefaultEmailSettings.get_defaults() | |
async def _save_email_settings(prisma_client, settings: Dict[str, bool]): | |
"""Helper function to save email settings to general_settings in db""" | |
try: | |
verbose_proxy_logger.debug( | |
f"Saving email settings to general_settings: {settings}" | |
) | |
# Get current general settings | |
general_settings_entry = await prisma_client.db.litellm_config.find_unique( | |
where={"param_name": "general_settings"} | |
) | |
# Initialize general settings dict | |
if ( | |
general_settings_entry is not None | |
and general_settings_entry.param_value is not None | |
): | |
if isinstance(general_settings_entry.param_value, str): | |
general_settings = json.loads(general_settings_entry.param_value) | |
else: | |
general_settings = dict(general_settings_entry.param_value) | |
else: | |
general_settings = {} | |
# Update email_settings in general_settings | |
general_settings["email_settings"] = settings | |
# Convert to JSON for storage | |
json_settings = json.dumps(general_settings, default=str) | |
# Save updated general settings | |
await prisma_client.db.litellm_config.upsert( | |
where={"param_name": "general_settings"}, | |
data={ | |
"create": { | |
"param_name": "general_settings", | |
"param_value": json_settings, | |
}, | |
"update": {"param_value": json_settings}, | |
}, | |
) | |
except Exception as e: | |
raise HTTPException( | |
status_code=500, | |
detail=f"Error saving email settings to general_settings: {str(e)}", | |
) | |
async def get_email_event_settings( | |
user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth), | |
): | |
""" | |
Get all email event settings | |
""" | |
from litellm.proxy.proxy_server import prisma_client | |
if prisma_client is None: | |
raise HTTPException(status_code=500, detail="Database not connected") | |
try: | |
# Get existing settings | |
settings_dict = await _get_email_settings(prisma_client) | |
# Create a response with all events (enabled or disabled) | |
response_settings = [] | |
for event in EmailEvent: | |
enabled = settings_dict.get(event.value, False) | |
response_settings.append(EmailEventSettings(event=event, enabled=enabled)) | |
return EmailEventSettingsResponse(settings=response_settings) | |
except Exception as e: | |
verbose_proxy_logger.exception(f"Error getting email settings: {str(e)}") | |
raise HTTPException(status_code=500, detail=str(e)) | |
async def update_event_settings( | |
request: EmailEventSettingsUpdateRequest, | |
user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth), | |
): | |
""" | |
Update the settings for email events | |
""" | |
from litellm.proxy.proxy_server import prisma_client | |
if prisma_client is None: | |
raise HTTPException(status_code=500, detail="Database not connected") | |
try: | |
# Get existing settings | |
settings_dict = await _get_email_settings(prisma_client) | |
# Update with new settings | |
for setting in request.settings: | |
settings_dict[setting.event.value] = setting.enabled | |
# Save updated settings | |
await _save_email_settings(prisma_client, settings_dict) | |
return {"message": "Email event settings updated successfully"} | |
except Exception as e: | |
verbose_proxy_logger.exception(f"Error updating email settings: {str(e)}") | |
raise HTTPException(status_code=500, detail=str(e)) | |
async def reset_event_settings( | |
user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth), | |
): | |
""" | |
Reset all email event settings to default (new user invitations on, virtual key creation off) | |
""" | |
from litellm.proxy.proxy_server import prisma_client | |
if prisma_client is None: | |
raise HTTPException(status_code=500, detail="Database not connected") | |
try: | |
# Reset to default settings using the Pydantic model | |
default_settings = DefaultEmailSettings.get_defaults() | |
# Save default settings | |
await _save_email_settings(prisma_client, default_settings) | |
return {"message": "Email event settings reset to defaults"} | |
except Exception as e: | |
verbose_proxy_logger.exception(f"Error resetting email settings: {str(e)}") | |
raise HTTPException(status_code=500, detail=str(e)) | |