Spaces:
Configuration error
Configuration error
File size: 7,017 Bytes
447ebeb |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 |
"""
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)}",
)
@router.get(
"/email/event_settings",
response_model=EmailEventSettingsResponse,
tags=["email management"],
dependencies=[Depends(user_api_key_auth)],
)
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))
@router.patch(
"/email/event_settings",
tags=["email management"],
dependencies=[Depends(user_api_key_auth)],
)
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))
@router.post(
"/email/event_settings/reset",
tags=["email management"],
dependencies=[Depends(user_api_key_auth)],
)
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))
|