From 7f6f85ec3c2da88fd16bc432d4c4cbf685090890 Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Sat, 6 Jul 2024 13:57:19 -0700 Subject: [PATCH] improve sign up flow - show missing env vars --- litellm/proxy/common_utils/admin_ui_utils.py | 166 ++++++++++++++++++ .../common_utils/encrypt_decrypt_utils.py | 9 +- litellm/proxy/proxy_server.py | 13 +- litellm/proxy/utils.py | 131 -------------- 4 files changed, 176 insertions(+), 143 deletions(-) create mode 100644 litellm/proxy/common_utils/admin_ui_utils.py diff --git a/litellm/proxy/common_utils/admin_ui_utils.py b/litellm/proxy/common_utils/admin_ui_utils.py new file mode 100644 index 00000000000..e734f2d1d53 --- /dev/null +++ b/litellm/proxy/common_utils/admin_ui_utils.py @@ -0,0 +1,166 @@ +import os + + +def show_missing_vars_in_env(): + from fastapi.responses import HTMLResponse + + from litellm.proxy.proxy_server import master_key, prisma_client + + if prisma_client is None and master_key is None: + return HTMLResponse( + content=missing_keys_form( + missing_key_names="DATABASE_URL, LITELLM_MASTER_KEY" + ), + status_code=200, + ) + if prisma_client is None: + return HTMLResponse( + content=missing_keys_form(missing_key_names="DATABASE_URL"), status_code=200 + ) + + if master_key is None: + return HTMLResponse( + content=missing_keys_form(missing_key_names="LITELLM_MASTER_KEY"), + status_code=200, + ) + return None + + +# LiteLLM Admin UI - Non SSO Login +url_to_redirect_to = os.getenv("PROXY_BASE_URL", "") +url_to_redirect_to += "/login" +html_form = f""" + + + + LiteLLM Login + + + +
+

LiteLLM Login

+ +

By default Username is "admin" and Password is your set LiteLLM Proxy `MASTER_KEY`

+

If you need to set UI credentials / SSO docs here: https://docs.litellm.ai/docs/proxy/ui

+
+ + + + + +
+""" + + +def missing_keys_form(missing_key_names: str): + missing_keys_html_form = """ + + + + + + + Environment Setup Instructions + + +
+

Environment Setup Instructions

+

Please add the following variables to your environment variables:

+
+    LITELLM_MASTER_KEY="sk-1234" # Your master key for the proxy server. Can use this to send /chat/completion requests etc
+    LITELLM_SALT_KEY="sk-XXXXXXXX" # Can NOT CHANGE THIS ONCE SET - It is used to encrypt/decrypt credentials stored in DB. If value of 'LITELLM_SALT_KEY' changes your models cannot be retrieved from DB
+    DATABASE_URL="postgres://..." # Need a postgres database? (Check out Supabase, Neon, etc)
+    ## OPTIONAL ##
+    PORT=4000 # DO THIS FOR RENDER/RAILWAY
+    STORE_MODEL_IN_DB="True" # Allow storing models in db
+                
+

Missing Environment Variables

+

{missing_keys}

+
+ +
+

Need Help? Support

+

Discord: https://discord.com/invite/wuPM9dRgDw

+

Docs: https://docs.litellm.ai/docs/

+ + + """ + return missing_keys_html_form.format(missing_keys=missing_key_names) diff --git a/litellm/proxy/common_utils/encrypt_decrypt_utils.py b/litellm/proxy/common_utils/encrypt_decrypt_utils.py index 80ffe1ee5e1..f0090046b52 100644 --- a/litellm/proxy/common_utils/encrypt_decrypt_utils.py +++ b/litellm/proxy/common_utils/encrypt_decrypt_utils.py @@ -4,6 +4,9 @@ import os from litellm._logging import verbose_proxy_logger LITELLM_SALT_KEY = os.getenv("LITELLM_SALT_KEY", None) +verbose_proxy_logger.debug( + "LITELLM_SALT_KEY is None using master_key to encrypt/decrypt secrets stored in DB" +) def encrypt_value_helper(value: str): @@ -11,9 +14,6 @@ def encrypt_value_helper(value: str): signing_key = LITELLM_SALT_KEY if LITELLM_SALT_KEY is None: - verbose_proxy_logger.debug( - "LITELLM_SALT_KEY is None using master_key to encrypt value" - ) signing_key = master_key try: @@ -35,9 +35,6 @@ def decrypt_value_helper(value: str): signing_key = LITELLM_SALT_KEY if LITELLM_SALT_KEY is None: - verbose_proxy_logger.debug( - "LITELLM_SALT_KEY is None using master_key to decrypt value" - ) signing_key = master_key try: diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index f7bcf1fde9b..d5b47855253 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -140,6 +140,10 @@ from litellm.proxy.auth.user_api_key_auth import user_api_key_auth ## Import All Misc routes here ## from litellm.proxy.caching_routes import router as caching_router +from litellm.proxy.common_utils.admin_ui_utils import ( + html_form, + show_missing_vars_in_env, +) from litellm.proxy.common_utils.debug_utils import router as debugging_endpoints_router from litellm.proxy.common_utils.encrypt_decrypt_utils import ( decrypt_value_helper, @@ -193,8 +197,6 @@ from litellm.proxy.utils import ( get_error_message_str, get_instance_fn, hash_token, - html_form, - missing_keys_html_form, reset_budget, send_email, update_spend, @@ -7169,10 +7171,9 @@ async def google_login(request: Request): ) ####### Detect DB + MASTER KEY in .env ####### - if prisma_client is None or master_key is None: - from fastapi.responses import HTMLResponse - - return HTMLResponse(content=missing_keys_html_form, status_code=200) + missing_env_vars = show_missing_vars_in_env() + if missing_env_vars is not None: + return missing_env_vars # get url from request redirect_url = os.getenv("PROXY_BASE_URL", str(request.base_url)) diff --git a/litellm/proxy/utils.py b/litellm/proxy/utils.py index 5d68c4d3a26..4fdd9f3b37c 100644 --- a/litellm/proxy/utils.py +++ b/litellm/proxy/utils.py @@ -2705,137 +2705,6 @@ def _is_valid_team_configs(team_id=None, team_config=None, request_data=None): return -# LiteLLM Admin UI - Non SSO Login -url_to_redirect_to = os.getenv("PROXY_BASE_URL", "") -url_to_redirect_to += "/login" -html_form = f""" - - - - LiteLLM Login - - - -
-

LiteLLM Login

- -

By default Username is "admin" and Password is your set LiteLLM Proxy `MASTER_KEY`

-

If you need to set UI credentials / SSO docs here: https://docs.litellm.ai/docs/proxy/ui

-
- - - - - -
-""" - - -missing_keys_html_form = """ - - - - - - - Environment Setup Instructions - - -
-

Environment Setup Instructions

-

Please add the following configurations to your environment variables:

-
-LITELLM_MASTER_KEY="sk-1234" # make this unique. must start with `sk-`.
-DATABASE_URL="postgres://..." # Need a postgres database? (Check out Supabase, Neon, etc)
-
-## OPTIONAL ##
-PORT=4000 # DO THIS FOR RENDER/RAILWAY
-STORE_MODEL_IN_DB="True" # Allow storing models in db
-            
-
- - - """ - - def _to_ns(dt): return int(dt.timestamp() * 1e9)