mirror of
https://github.com/BerriAI/litellm.git
synced 2026-09-25 01:02:15 +00:00
The proxy used to boot with no master key (every request accepted without authentication) and with sk-1234, the key every example used. It now stops at startup, before it connects to the database, and prints how to fix it: where the bad key came from, a copy-pastable command that generates a secure key, and, when the public key is also encrypting a database, a link to the rotation guide general_settings.dangerously_allow_unsafe_proxy: true or LITELLM_DANGEROUSLY_ALLOW_UNSAFE_PROXY=true starts the proxy anyway, for local development. CI and test boots that rely on sk-1234 or on no key set it BREAKING CHANGE: deployments with no master key, an empty one, or sk-1234 no longer start until they set a real key or opt in to the override
95 lines
3.2 KiB
Python
95 lines
3.2 KiB
Python
# What this tests
|
|
## This tests the proxy server startup
|
|
import sys, os, json
|
|
import traceback
|
|
from dotenv import load_dotenv
|
|
|
|
load_dotenv()
|
|
import io
|
|
|
|
# this file is to test litellm/proxy
|
|
|
|
import pytest, logging, asyncio
|
|
import litellm
|
|
from litellm.proxy.proxy_server import (
|
|
router,
|
|
save_worker_config,
|
|
initialize,
|
|
proxy_startup_event,
|
|
llm_model_list,
|
|
proxy_shutdown_event,
|
|
)
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_proxy_gunicorn_startup_direct_config(monkeypatch):
|
|
"""
|
|
gunicorn startup requires the config to be passed in via environment variables
|
|
|
|
We support saving either the config or the dict as an environment variable.
|
|
|
|
Test both approaches
|
|
"""
|
|
monkeypatch.setenv("LITELLM_DANGEROUSLY_ALLOW_UNSAFE_PROXY", "true")
|
|
try:
|
|
from litellm._logging import verbose_proxy_logger, verbose_router_logger
|
|
import logging
|
|
|
|
# unset set DATABASE_URL in env for this test
|
|
# set prisma client to None
|
|
setattr(litellm.proxy.proxy_server, "prisma_client", None)
|
|
database_url = os.environ.pop("DATABASE_URL", None)
|
|
|
|
verbose_proxy_logger.setLevel(level=logging.DEBUG)
|
|
verbose_router_logger.setLevel(level=logging.DEBUG)
|
|
filepath = os.path.dirname(os.path.abspath(__file__))
|
|
# test with worker_config = config yaml
|
|
config_fp = f"{filepath}/test_configs/test_config_no_auth.yaml"
|
|
os.environ["WORKER_CONFIG"] = config_fp
|
|
async with proxy_startup_event(app=None) as _:
|
|
pass
|
|
except Exception as e:
|
|
if "Already connected to the query engine" in str(e):
|
|
pass
|
|
else:
|
|
pytest.fail(f"An exception occurred - {str(e)}")
|
|
finally:
|
|
# restore DATABASE_URL after the test
|
|
if database_url is not None:
|
|
os.environ["DATABASE_URL"] = database_url
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_proxy_gunicorn_startup_config_dict(monkeypatch):
|
|
monkeypatch.setenv("LITELLM_DANGEROUSLY_ALLOW_UNSAFE_PROXY", "true")
|
|
try:
|
|
from litellm._logging import verbose_proxy_logger, verbose_router_logger
|
|
import logging
|
|
|
|
verbose_proxy_logger.setLevel(level=logging.DEBUG)
|
|
verbose_router_logger.setLevel(level=logging.DEBUG)
|
|
# unset set DATABASE_URL in env for this test
|
|
# set prisma client to None
|
|
setattr(litellm.proxy.proxy_server, "prisma_client", None)
|
|
database_url = os.environ.pop("DATABASE_URL", None)
|
|
|
|
filepath = os.path.dirname(os.path.abspath(__file__))
|
|
# test with worker_config = config yaml
|
|
config_fp = f"{filepath}/test_configs/test_config_no_auth.yaml"
|
|
# test with worker_config = dict
|
|
worker_config = {"config": config_fp}
|
|
os.environ["WORKER_CONFIG"] = json.dumps(worker_config)
|
|
async with proxy_startup_event(app=None) as _:
|
|
pass
|
|
except Exception as e:
|
|
if "Already connected to the query engine" in str(e):
|
|
pass
|
|
else:
|
|
pytest.fail(f"An exception occurred - {str(e)}")
|
|
finally:
|
|
# restore DATABASE_URL after the test
|
|
if database_url is not None:
|
|
os.environ["DATABASE_URL"] = database_url
|
|
|
|
|
|
# test_proxy_gunicorn_startup()
|