From 357c6c56bdfb2b548c205b222405369949bb51dd Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 6 Jan 2024 09:51:44 +0530 Subject: [PATCH] Revert "build(Dockerfile): move prisma build to dockerfile" This reverts commit 2741835605275d11a58edfa5725cc379ca2a4676. --- .gitignore | 1 - Dockerfile | 13 +-------- docker/.env.example | 2 +- litellm/proxy/proxy_server.py | 53 +++++++---------------------------- litellm/proxy/utils.py | 51 +++++++++++++++------------------ retry_push.sh | 28 ------------------ schema.prisma | 33 ---------------------- 7 files changed, 34 insertions(+), 147 deletions(-) delete mode 100644 retry_push.sh delete mode 100644 schema.prisma diff --git a/.gitignore b/.gitignore index 618e3d874..29c296915 100644 --- a/.gitignore +++ b/.gitignore @@ -31,4 +31,3 @@ proxy_server_config_@.yaml .gitignore proxy_server_config_2.yaml litellm/proxy/secret_managers/credentials.json -hosted_config.yaml diff --git a/Dockerfile b/Dockerfile index da54ba0af..b76aaf1d1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,6 +3,7 @@ ARG LITELLM_BUILD_IMAGE=python:3.9 # Runtime image ARG LITELLM_RUNTIME_IMAGE=python:3.9-slim + # Builder stage FROM $LITELLM_BUILD_IMAGE as builder @@ -34,12 +35,8 @@ RUN pip wheel --no-cache-dir --wheel-dir=/wheels/ -r requirements.txt # Runtime stage FROM $LITELLM_RUNTIME_IMAGE as runtime -ARG with_database WORKDIR /app -# Copy the current directory contents into the container at /app -COPY . . -RUN ls -la /app # Copy the built wheel from the builder stage to the runtime stage; assumes only one wheel file is present COPY --from=builder /app/dist/*.whl . @@ -48,14 +45,6 @@ COPY --from=builder /wheels/ /wheels/ # Install the built wheel using pip; again using a wildcard if it's the only file RUN pip install *.whl /wheels/* --no-index --find-links=/wheels/ && rm -f *.whl && rm -rf /wheels -# Check if the with_database argument is set to 'true' -RUN echo "Value of with_database is: ${with_database}" -# If true, execute the following instructions -RUN if [ "$with_database" = "true" ]; then \ - prisma generate; \ - chmod +x /app/retry_push.sh; \ - /app/retry_push.sh; \ - fi EXPOSE 4000/tcp diff --git a/docker/.env.example b/docker/.env.example index 6a3fcabd6..d89ddb32e 100644 --- a/docker/.env.example +++ b/docker/.env.example @@ -6,7 +6,7 @@ LITELLM_MASTER_KEY="sk-1234" ############ -# Database - You can change these to any PostgreSQL database. +# Database - You can change these to any PostgreSQL database that has logical replication enabled. ############ DATABASE_URL="your-postgres-db-url" diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 2f7184761..fdfbe7624 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -519,12 +519,16 @@ class ProxyConfig: user_config_file_path = config_file_path # Load existing config ## Yaml - if file_path is not None: - if os.path.exists(f"{file_path}"): - with open(f"{file_path}", "r") as config_file: - config = yaml.safe_load(config_file) - else: - raise Exception(f"File not found! - {file_path}") + if os.path.exists(f"{file_path}"): + with open(f"{file_path}", "r") as config_file: + config = yaml.safe_load(config_file) + else: + config = { + "model_list": [], + "general_settings": {}, + "router_settings": {}, + "litellm_settings": {}, + } ## DB if ( @@ -2326,21 +2330,6 @@ async def update_config(config_info: ConfigYAML): raise HTTPException(status_code=500, detail=f"An error occurred - {str(e)}") -@router.get( - "/config/get", - tags=["config.yaml"], - dependencies=[Depends(user_api_key_auth)], -) -async def get_config(): - """ - Master key only. - - Returns the config. Mainly used for testing. - """ - global proxy_config - return await proxy_config.get_config() - - @router.get("/config/yaml", tags=["config.yaml"]) async def config_yaml_endpoint(config_info: ConfigYAML): """ @@ -2429,28 +2418,6 @@ async def health_endpoint( } -@router.get("/health/readiness", tags=["health"]) -async def health_readiness(): - """ - Unprotected endpoint for checking if worker can receive requests - """ - global prisma_client - if prisma_client is not None: # if db passed in, check if it's connected - if prisma_client.db.is_connected() == True: - return {"status": "healthy"} - else: - return {"status": "healthy"} - raise HTTPException(status_code=503, detail="Service Unhealthy") - - -@router.get("/health/liveliness", tags=["health"]) -async def health_liveliness(): - """ - Unprotected endpoint for checking if worker is alive - """ - return "I'm alive!" - - @router.get("/") async def home(request: Request): return "LiteLLM: RUNNING" diff --git a/litellm/proxy/utils.py b/litellm/proxy/utils.py index bc61a6666..bedbda224 100644 --- a/litellm/proxy/utils.py +++ b/litellm/proxy/utils.py @@ -250,37 +250,30 @@ def on_backoff(details): class PrismaClient: def __init__(self, database_url: str, proxy_logging_obj: ProxyLogging): - ### Check if prisma client can be imported (setup done in Docker build) + print_verbose( + "LiteLLM: DATABASE_URL Set in config, trying to 'pip install prisma'" + ) + ## init logging object + self.proxy_logging_obj = proxy_logging_obj + os.environ["DATABASE_URL"] = database_url + # Save the current working directory + original_dir = os.getcwd() + # set the working directory to where this script is + abspath = os.path.abspath(__file__) + dname = os.path.dirname(abspath) + os.chdir(dname) + try: - from prisma import Client # type: ignore + subprocess.run(["prisma", "generate"]) + subprocess.run( + ["prisma", "db", "push", "--accept-data-loss"] + ) # this looks like a weird edge case when prisma just wont start on render. we need to have the --accept-data-loss + finally: + os.chdir(original_dir) + # Now you can import the Prisma Client + from prisma import Client # type: ignore - os.environ["DATABASE_URL"] = database_url - self.db = Client() # Client to connect to Prisma db - except: # if not - go through normal setup process - print_verbose( - "LiteLLM: DATABASE_URL Set in config, trying to 'pip install prisma'" - ) - ## init logging object - self.proxy_logging_obj = proxy_logging_obj - os.environ["DATABASE_URL"] = database_url - # Save the current working directory - original_dir = os.getcwd() - # set the working directory to where this script is - abspath = os.path.abspath(__file__) - dname = os.path.dirname(abspath) - os.chdir(dname) - - try: - subprocess.run(["prisma", "generate"]) - subprocess.run( - ["prisma", "db", "push", "--accept-data-loss"] - ) # this looks like a weird edge case when prisma just wont start on render. we need to have the --accept-data-loss - finally: - os.chdir(original_dir) - # Now you can import the Prisma Client - from prisma import Client # type: ignore - - self.db = Client() # Client to connect to Prisma db + self.db = Client() # Client to connect to Prisma db def hash_token(self, token: str): # Hash the string using SHA-256 diff --git a/retry_push.sh b/retry_push.sh deleted file mode 100644 index 5c41d72a0..000000000 --- a/retry_push.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash - -retry_count=0 -max_retries=3 -exit_code=1 - -until [ $retry_count -ge $max_retries ] || [ $exit_code -eq 0 ] -do - retry_count=$((retry_count+1)) - echo "Attempt $retry_count..." - - # Run the Prisma db push command - prisma db push --accept-data-loss - - exit_code=$? - - if [ $exit_code -ne 0 ] && [ $retry_count -lt $max_retries ]; then - echo "Retrying in 10 seconds..." - sleep 10 - fi -done - -if [ $exit_code -ne 0 ]; then - echo "Unable to push database changes after $max_retries retries." - exit 1 -fi - -echo "Database push successful!" \ No newline at end of file diff --git a/schema.prisma b/schema.prisma deleted file mode 100644 index d12cac8f2..000000000 --- a/schema.prisma +++ /dev/null @@ -1,33 +0,0 @@ -datasource client { - provider = "postgresql" - url = env("DATABASE_URL") -} - -generator client { - provider = "prisma-client-py" -} - -model LiteLLM_UserTable { - user_id String @unique - max_budget Float? - spend Float @default(0.0) - user_email String? -} - -// required for token gen -model LiteLLM_VerificationToken { - token String @unique - spend Float @default(0.0) - expires DateTime? - models String[] - aliases Json @default("{}") - config Json @default("{}") - user_id String? - max_parallel_requests Int? - metadata Json @default("{}") -} - -model LiteLLM_Config { - param_name String @id - param_value Json? -} \ No newline at end of file