version: 2.1 jobs: local_testing: docker: - image: circleci/python:3.9 working_directory: ~/project steps: - checkout - run: name: Check if litellm dir was updated or if pyproject.toml was modified command: | if [ -n "$(git diff --name-only $CIRCLE_SHA1^..$CIRCLE_SHA1 | grep -E 'pyproject\.toml|litellm/')" ]; then echo "litellm updated" else echo "No changes to litellm or pyproject.toml. Skipping tests." circleci step halt fi - restore_cache: keys: - v1-dependencies-{{ checksum ".circleci/requirements.txt" }} - run: name: Install Dependencies command: | python -m pip install --upgrade pip python -m pip install -r .circleci/requirements.txt pip install "pytest==7.3.1" pip install types-yaml pip install "pytest-asyncio==0.21.1" pip install mypy pip install "google-generativeai==0.3.2" pip install "google-cloud-aiplatform==1.43.0" pip install pyarrow pip install "boto3==1.34.34" pip install "aioboto3==12.3.0" pip install langchain pip install lunary==0.2.5 pip install "langfuse==2.7.3" pip install numpydoc pip install traceloop-sdk==0.0.69 pip install openai pip install prisma pip install "httpx==0.24.1" pip install "gunicorn==21.2.0" pip install "anyio==3.7.1" pip install "aiodynamo==23.10.1" pip install "asyncio==3.4.3" pip install "apscheduler==3.10.4" pip install "PyGithub==1.59.1" pip install argon2-cffi pip install "pytest-mock==3.12.0" pip install python-multipart pip install google-cloud-aiplatform - save_cache: paths: - ./venv key: v1-dependencies-{{ checksum ".circleci/requirements.txt" }} - run: name: Run prisma ./entrypoint.sh command: | set +e chmod +x entrypoint.sh ./entrypoint.sh set -e - run: name: Black Formatting command: | cd litellm python -m pip install black python -m black . cd .. - run: name: Linting Testing command: | cd litellm python -m pip install types-requests types-setuptools types-redis if ! python -m mypy . --ignore-missing-imports; then echo "mypy detected errors" exit 1 fi cd .. # Run pytest and generate JUnit XML report - run: name: Run tests command: | pwd ls python -m pytest -vv litellm/tests/ -x --junitxml=test-results/junit.xml --durations=5 no_output_timeout: 120m # Store test results - store_test_results: path: test-results installing_litellm_on_python: docker: - image: circleci/python:3.8 working_directory: ~/project steps: - checkout - run: name: Install Dependencies command: | python -m pip install --upgrade pip pip install python-dotenv pip install pytest pip install tiktoken pip install aiohttp pip install click pip install jinja2 pip install tokenizers pip install openai - run: name: Run tests command: | pwd ls python -m pytest -vv litellm/tests/test_python_38.py build_and_test: machine: image: ubuntu-2204:2023.10.1 working_directory: ~/project steps: - checkout - run: name: Install Docker CLI (In case it's not already installed) command: | sudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io - run: name: Install Python 3.9 command: | curl https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh --output miniconda.sh bash miniconda.sh -b -p $HOME/miniconda export PATH="$HOME/miniconda/bin:$PATH" conda init bash source ~/.bashrc conda create -n myenv python=3.9 -y conda activate myenv python --version - run: name: Install Dependencies command: | pip install "pytest==7.3.1" pip install "pytest-asyncio==0.21.1" pip install aiohttp pip install openai python -m pip install --upgrade pip python -m pip install -r .circleci/requirements.txt pip install "pytest==7.3.1" pip install "pytest-mock==3.12.0" pip install "pytest-asyncio==0.21.1" pip install mypy pip install "google-generativeai==0.3.2" pip install "google-cloud-aiplatform==1.43.0" pip install pyarrow pip install "boto3==1.34.34" pip install "aioboto3==12.3.0" pip install langchain pip install "langfuse>=2.0.0" pip install numpydoc pip install prisma pip install fastapi pip install "httpx==0.24.1" pip install "gunicorn==21.2.0" pip install "anyio==3.7.1" pip install "aiodynamo==23.10.1" pip install "asyncio==3.4.3" pip install "PyGithub==1.59.1" # Run pytest and generate JUnit XML report - run: name: Build Docker image command: docker build -t my-app:latest -f Dockerfile.database . - run: name: Run Docker container command: | docker run -d \ -p 4000:4000 \ -e DATABASE_URL=$PROXY_DOCKER_DB_URL \ -e AZURE_API_KEY=$AZURE_API_KEY \ -e AZURE_FRANCE_API_KEY=$AZURE_FRANCE_API_KEY \ -e AZURE_EUROPE_API_KEY=$AZURE_EUROPE_API_KEY \ -e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID \ -e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY \ -e AWS_REGION_NAME=$AWS_REGION_NAME \ -e OPENAI_API_KEY=$OPENAI_API_KEY \ --name my-app \ -v $(pwd)/proxy_server_config.yaml:/app/config.yaml \ my-app:latest \ --config /app/config.yaml \ --port 4000 \ --num_workers 8 \ --detailed_debug \ --run_gunicorn \ - run: name: Install curl and dockerize command: | sudo apt-get update sudo apt-get install -y curl sudo wget https://github.com/jwilder/dockerize/releases/download/v0.6.1/dockerize-linux-amd64-v0.6.1.tar.gz sudo tar -C /usr/local/bin -xzvf dockerize-linux-amd64-v0.6.1.tar.gz sudo rm dockerize-linux-amd64-v0.6.1.tar.gz - run: name: Start outputting logs command: docker logs -f my-app background: true - run: name: Wait for app to be ready command: dockerize -wait http://localhost:4000 -timeout 1m - run: name: Run tests command: | pwd ls python -m pytest -vv tests/ -x --junitxml=test-results/junit.xml --durations=5 no_output_timeout: 120m # Store test results - store_test_results: path: test-results publish_to_pypi: docker: - image: cimg/python:3.8 working_directory: ~/project environment: TWINE_USERNAME: __token__ steps: - checkout - run: name: Copy model_prices_and_context_window File to model_prices_and_context_window_backup command: | cp model_prices_and_context_window.json litellm/model_prices_and_context_window_backup.json - run: name: Check if litellm dir was updated or if pyproject.toml was modified command: | if [ -n "$(git diff --name-only $CIRCLE_SHA1^..$CIRCLE_SHA1 | grep -E 'pyproject\.toml|litellm/')" ]; then echo "litellm updated" else echo "No changes to litellm or pyproject.toml. Skipping PyPI publish." circleci step halt fi - run: name: Checkout code command: git checkout $CIRCLE_SHA1 # Check if setup.py is modified and publish to PyPI - run: name: PyPI publish command: | echo "Install TOML package." python -m pip install toml VERSION=$(python -c "import toml; print(toml.load('pyproject.toml')['tool']['poetry']['version'])") PACKAGE_NAME=$(python -c "import toml; print(toml.load('pyproject.toml')['tool']['poetry']['name'])") if ! pip show -v $PACKAGE_NAME | grep -q "Version: ${VERSION}"; then echo "pyproject.toml modified" echo -e "[pypi]\nusername = $PYPI_PUBLISH_USERNAME\npassword = $PYPI_PUBLISH_PASSWORD" > ~/.pypirc python -m pip install --upgrade pip pip install build pip install wheel pip install --upgrade twine setuptools rm -rf build dist echo "Building package" python -m build echo "Twine upload to dist" echo "Contents of dist directory:" ls dist/ twine upload --verbose dist/* else echo "Version ${VERSION} of package is already published on PyPI. Skipping PyPI publish." circleci step halt fi - run: name: Trigger Github Action for new Docker Container command: | echo "Install TOML package." python3 -m pip install toml VERSION=$(python3 -c "import toml; print(toml.load('pyproject.toml')['tool']['poetry']['version'])") echo "LiteLLM Version ${VERSION}" curl -X POST \ -H "Accept: application/vnd.github.v3+json" \ -H "Authorization: Bearer $GITHUB_TOKEN" \ "https://api.github.com/repos/BerriAI/litellm/actions/workflows/ghcr_deploy.yml/dispatches" \ -d "{\"ref\":\"main\", \"inputs\":{\"tag\":\"v${VERSION}\"}}" workflows: version: 2 build_and_test: jobs: - local_testing: filters: branches: only: - main - /litellm_.*/ - build_and_test: filters: branches: only: - main - /litellm_.*/ - installing_litellm_on_python: filters: branches: only: - main - /litellm_.*/ - publish_to_pypi: requires: - local_testing - build_and_test filters: branches: only: - main