litellm/docs/my-website/docs/extras/contributing_code.md
stuxf a6c30b30bf
build: migrate packaging, CI, and Docker from Poetry to uv (#25007)
* build: migrate packaging metadata to uv

* ci: move automation and local tooling to uv

* docker: migrate image builds and runtime setup to uv

* docs: update install and deployment guidance for uv

* chore: align auxiliary scripts and tests with uv

* test: harden test_litellm isolation

* fix: keep release and health check images self-contained

* build: pin uv tooling and health check deps

* test: isolate bedrock image request formatting from suite state

* test: cover sandbox executor requirements flow

* ci: fix circleci no-op command steps

* ci: fix circleci publish workflow parsing

* fix: stabilize remaining uv migration CI checks

* ci: increase matrix test timeout headroom

* fix: restore published docker and license coverage

* fix: restore proxy runtime build parity

* fix: restore proxy extras parity and venv migrations

* ci: persist uv path across circleci steps

* fix: keep psycopg binary in default test env

* docker: preserve prisma cache across stages

* test: run local proxy checks through uv python

* build: restore runtime deps moved into ci

* build: refresh uv lock after upstream merge

* fix: restore module import in test_check_migration after merge

The conflict resolution imported only the function but the test body
references check_migration as a module throughout.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: revert dependency promotions, remove nodejs-wheel-binaries, fix Docker layer caching

- Move google-generativeai, Pillow, tenacity back to ci group (they are
  lazily imported and bloat the base SDK install needlessly)
- Remove nodejs-wheel-binaries from extra_proxy and proxy-dev (redundant
  in Docker where system Node.js is already installed via apk)
- Remove all nodejs-wheel node replacement and venv npm patching blocks
  from Dockerfiles since the wheel is no longer installed
- Add --no-default-groups to CodSpeed benchmark workflow so the benchmark
  environment matches the old minimal pip install footprint
- Apply standard uv two-phase Docker pattern: copy metadata first, install
  deps (cached layer), then copy source and install project
- Replace CircleCI enterprise no-op with proper uv sync command

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore: regenerate uv.lock after removing nodejs-wheel-binaries

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(ci): use cache/restore instead of cache to prevent cache poisoning

The old workflow used actions/cache/restore (read-only). The uv migration
changed it to actions/cache (read-write), which zizmor flags as a cache
poisoning risk. Restore the safer read-only variant.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(ci): disable setup-uv built-in cache to silence cache-poisoning alert

The setup-uv action enables caching by default, which zizmor flags as a
cache poisoning risk. Disable it since we already use a read-only
cache/restore step.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(ci): disable setup-uv cache in publish workflow

Silences zizmor cache-poisoning alert. Publishing workflow runs
infrequently on protected branches so caching adds no real benefit.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(test): remove duplicate verbose_logger mock in test_check_migration

The logger was patched twice — first via mocker.patch() then via
mocker.patch.object(autospec=True). The second call fails because
autospec cannot inspect an already-mocked attribute. Remove the
redundant first patch.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(ci): free disk space before Docker build in test-server-root-path

The Dockerfile.non_root build ran out of disk on the CI runner. Remove
Android SDK, .NET, Boost, and GHC toolchains (~12GB) to free space.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 11:46:23 -07:00

4.3 KiB

Contributing Code

Checklist before submitting a PR

Here are the core requirements for any PR submitted to LiteLLM:

Proxy (Backend) PRs

UI PRs

  • Ensure the UI builds successfully — npm run build
  • Ensure all UI unit tests pass — npm run test
  • If you are adding a new component or new logic, add corresponding tests

Contributor License Agreement (CLA)

Before contributing code to LiteLLM, you must sign our Contributor License Agreement (CLA). This is a legal requirement for all contributions to be merged into the main repository. The CLA helps protect both you and the project by clearly defining the terms under which your contributions are made.

Important: We strongly recommend signing the CLA before starting work on your contribution to avoid delays in the review process. You can find and sign the CLA here.


Proxy (Backend)

1. Setting up your local dev environment

Step 1: Clone the repo

git clone https://github.com/BerriAI/litellm.git

Step 2: Install dev dependencies

uv sync --group dev --extra proxy

2. Adding tests

  • Add your tests to the tests/test_litellm/ directory.
  • This directory mirrors the litellm/ directory 1:1 and should only contain mocked tests.
  • Do not add real LLM API calls to this directory.

File naming convention for tests/test_litellm/

The test directory follows the same structure as litellm/:

  • test_{filename}.py maps to litellm/{filename}.py
  • litellm/proxy/test_caching_routes.py maps to litellm/proxy/caching_routes.py

3. Running unit tests

Run the following command from the root of the litellm directory:

make test-unit

4. Running linting tests

Run the following command from the root of the litellm directory:

make lint

LiteLLM uses mypy for type checking. CI/CD also runs black for formatting.

5. Submit a PR

  • Push your changes to your fork on GitHub
  • Open a Pull Request from your fork

UI

1. Setting up your local dev environment

Step 1: Clone the repo

git clone https://github.com/BerriAI/litellm.git

Step 2: Navigate to the UI dashboard directory

cd ui/litellm-dashboard

Step 3: Install dependencies

npm install

Step 4: Start the development server

npm run dev

2. Adding tests

If you are adding a new component or new logic, you must add corresponding tests.

3. Running UI unit tests

npm run test

4. Building the UI

Ensure the UI builds successfully before submitting your PR:

npm run build

5. Submit a PR

  • Push your changes to your fork on GitHub
  • Open a Pull Request from your fork

Advanced

Building the LiteLLM Docker Image

Follow these instructions if you want to build and run the LiteLLM Docker image yourself.

Step 1: Clone the repo

git clone https://github.com/BerriAI/litellm.git

Step 2: Build the Docker image

Build using Dockerfile.non_root:

docker build -f docker/Dockerfile.non_root -t litellm_test_image .

Step 3: Run the Docker image

Make sure config.yaml is present in the root directory. This is your LiteLLM proxy config file.

docker run \
    -v $(pwd)/proxy_config.yaml:/app/config.yaml \
    -e DATABASE_URL="postgresql://xxxxxxxx" \
    -e LITELLM_MASTER_KEY="sk-1234" \
    -p 4000:4000 \
    litellm_test_image \
    --config /app/config.yaml --detailed_debug

Running the LiteLLM Proxy Locally

  1. Navigate to the proxy/ directory:
cd litellm/litellm/proxy
  1. Run the proxy:
python3 proxy_cli.py --config /path/to/config.yaml

# RUNNING on http://0.0.0.0:4000