From 2605f09e1523783e27add2938147071b335329d4 Mon Sep 17 00:00:00 2001 From: Sebastian Sosa <1sebastian1sosa1@gmail.com> Date: Sat, 8 Feb 2025 17:34:41 -0500 Subject: [PATCH 1/3] expose port & required env vars & instructions for running in dev --- .env.example | 5 +++++ README.md | 17 +++++++++++++++++ docker-compose.yml | 2 ++ 3 files changed, 24 insertions(+) diff --git a/.env.example b/.env.example index c87c2ef8fd4a..82b09ca25ef2 100644 --- a/.env.example +++ b/.env.example @@ -20,3 +20,8 @@ REPLICATE_API_TOKEN = "" ANTHROPIC_API_KEY = "" # Infisical INFISICAL_TOKEN = "" + +# Development Configs +LITELLM_MASTER_KEY = "sk-1234" +DATABASE_URL = "postgresql://llmproxy:dbpassword9090@db:5432/litellm" +STORE_MODEL_IN_DB = "True" \ No newline at end of file diff --git a/README.md b/README.md index 12b8bfa9dd54..7260e50bc85e 100644 --- a/README.md +++ b/README.md @@ -451,3 +451,20 @@ If you have suggestions on how to improve the code quality feel free to open an + + +## Run in Developer mode +### Services +1. Setup .env file in root +2. Run dependant services `docker-compose up db prometheus` + +### Backend +1. (In root) create virtual environment `python -m venv .venv` +2. Activate virtual environment `source .venv/bin/activate` +3. Install dependencies `pip install -e ".[all]"` +4. Start proxy backend `uvicorn litellm.proxy.proxy_server:app --host localhost --port 4000 --reload` + +### Frontend +1. Navigate to `ui/litellm-dashboard` +2. Install dependencies `npm install` +3. Run `npm run dev` to start the dashboard \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 1508bd375cc5..78044c03b884 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -29,6 +29,8 @@ services: POSTGRES_DB: litellm POSTGRES_USER: llmproxy POSTGRES_PASSWORD: dbpassword9090 + ports: + - "5432:5432" healthcheck: test: ["CMD-SHELL", "pg_isready -d litellm -U llmproxy"] interval: 1s From 2a43a60a0ae7e77bd87b7dc65395122edf616d6f Mon Sep 17 00:00:00 2001 From: Sebastian Sosa <1sebastian1sosa1@gmail.com> Date: Sat, 8 Feb 2025 21:29:07 -0500 Subject: [PATCH 2/3] database management instructions --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 7260e50bc85e..82d66e53ba61 100644 --- a/README.md +++ b/README.md @@ -457,6 +457,9 @@ If you have suggestions on how to improve the code quality feel free to open an ### Services 1. Setup .env file in root 2. Run dependant services `docker-compose up db prometheus` +3. Install prisma `npm install -g prisma` +4. Run `prisma generate` to generate the prisma client +5. (If database needs to be reset run `prisma migrate reset` followed by `prisma db push`) ### Backend 1. (In root) create virtual environment `python -m venv .venv` From 41d14d189e411908ba187e11a4f7a5747cbf89d7 Mon Sep 17 00:00:00 2001 From: Sebastian Sosa <1sebastian1sosa1@gmail.com> Date: Sat, 8 Feb 2025 21:39:22 -0500 Subject: [PATCH 3/3] edit model api key with encoding and decoding --- .env.example | 1 + docker-compose.yml | 2 + litellm/proxy/proxy_server.py | 31 ++++- .../edit_model/edit_model_modal.tsx | 3 + .../src/components/model_dashboard.tsx | 113 ++++++++++++------ 5 files changed, 109 insertions(+), 41 deletions(-) diff --git a/.env.example b/.env.example index 82b09ca25ef2..5e59a264ecf2 100644 --- a/.env.example +++ b/.env.example @@ -23,5 +23,6 @@ INFISICAL_TOKEN = "" # Development Configs LITELLM_MASTER_KEY = "sk-1234" +LITELLM_SALT_KEY = "sk-1234" DATABASE_URL = "postgresql://llmproxy:dbpassword9090@db:5432/litellm" STORE_MODEL_IN_DB = "True" \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 78044c03b884..613971be0c83 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -18,6 +18,8 @@ services: environment: DATABASE_URL: "postgresql://llmproxy:dbpassword9090@db:5432/litellm" STORE_MODEL_IN_DB: "True" # allows adding models to proxy via UI + LITELLM_SALT_KEY: ${LITELLM_SALT_KEY} + LITELLM_MASTER_KEY: ${LITELLM_MASTER_KEY} env_file: - .env # Load local .env file diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 893f011dd5df..249166206513 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -6091,16 +6091,22 @@ async def update_model( ### ENCRYPT PARAMS ### for k, v in _new_litellm_params_dict.items(): - encrypted_value = encrypt_value_helper(value=v) - model_params.litellm_params[k] = encrypted_value - + try: + encrypted_value = encrypt_value_helper(value=v) + model_params.litellm_params[k] = encrypted_value + except Exception as e: + print(f"Error encrypting {k}: {e}") # Debug print + raise + ### MERGE WITH EXISTING DATA ### merged_dictionary = {} _mp = model_params.litellm_params.dict() for key, value in _mp.items(): if value is not None: - merged_dictionary[key] = value + # Ensure we encrypt the value before adding it to the merged dictionary + encrypted_value = encrypt_value_helper(value=value) if isinstance(value, str) else value + merged_dictionary[key] = encrypted_value elif ( key in _existing_litellm_params_dict and _existing_litellm_params_dict[key] is not None @@ -6203,6 +6209,23 @@ async def model_info_v2( openai_client = str(_openai_client) _model["openai_client"] = openai_client + # Decrypt sensitive values in litellm_params + if "litellm_params" in _model: + decrypted_params = {} + for key, value in _model["litellm_params"].items(): + if key in ["api_base", "base_url", "model_api_key"]: # Add any other keys that need decryption + try: + decrypted_value = decrypt_value_helper(value=value) + decrypted_params[key] = decrypted_value + except Exception as e: + verbose_proxy_logger.debug(f"Error decrypting {key}: {e}") + decrypted_params[key] = value + else: + decrypted_params[key] = value + + _model["litellm_params"] = decrypted_params + + # read litellm model_prices_and_context_window.json to get the following: # input_cost_per_token, output_cost_per_token, max_tokens litellm_model_info = get_litellm_model_info(model=_model) diff --git a/ui/litellm-dashboard/src/components/edit_model/edit_model_modal.tsx b/ui/litellm-dashboard/src/components/edit_model/edit_model_modal.tsx index 052dad18f77e..373b75bdf94f 100644 --- a/ui/litellm-dashboard/src/components/edit_model/edit_model_modal.tsx +++ b/ui/litellm-dashboard/src/components/edit_model/edit_model_modal.tsx @@ -88,6 +88,9 @@ const EditModelModal: React.FC = ({ + + + = ({ LiteLLM Model {userRole === "Admin" && ( - - API Base - + <> + + API Base + + + Model API Key + + )} = ({ {userRole === "Admin" && ( - - -
-                                  {model && model.api_base
-                                    ? model.api_base.slice(0, 20)
-                                    : "-"}
-                                
-
-
+ <> + + +
+                                    {model && model.api_base
+                                      ? model.api_base.slice(0, 20)
+                                      : "-"}
+                                  
+
+
+ + +
+                                    {model && model.litellm_params.model_api_key
+                                      ? "***"
+                                      : "-"}
+                                  
+
+
+ )}