2025-03-03 11:41:30 +08:00
# LiteLLM Makefile
# Simple Makefile for running tests and basic development tasks
2026-02-04 14:29:29 +08:00
.PHONY : help test test -unit test -integration test -unit -helm \
info lint lint-dev format \
install-dev install-proxy-dev install-test-deps \
install-helm-unittest check-circular-imports check-import-safety
2025-03-03 11:41:30 +08:00
# Default target
help :
@echo "Available commands:"
2025-06-07 05:19:28 +08:00
@echo " make install-dev - Install development dependencies"
@echo " make install-proxy-dev - Install proxy development dependencies"
@echo " make install-dev-ci - Install dev dependencies (CI-compatible, pins OpenAI)"
@echo " make install-proxy-dev-ci - Install proxy dev dependencies (CI-compatible)"
@echo " make install-test-deps - Install test dependencies"
@echo " make install-helm-unittest - Install helm unittest plugin"
@echo " make format - Apply Black code formatting"
@echo " make format-check - Check Black code formatting (matches CI)"
@echo " make lint - Run all linting (Ruff, MyPy, Black check, circular imports, import safety)"
@echo " make lint-ruff - Run Ruff linting only"
@echo " make lint-mypy - Run MyPy type checking only"
@echo " make lint-black - Check Black formatting (matches CI)"
@echo " make check-circular-imports - Check for circular imports"
@echo " make check-import-safety - Check import safety"
2025-03-03 11:41:30 +08:00
@echo " make test - Run all tests"
2025-06-07 05:19:28 +08:00
@echo " make test-unit - Run unit tests (tests/test_litellm)"
2025-03-03 11:41:30 +08:00
@echo " make test-integration - Run integration tests"
2025-03-16 19:39:13 +08:00
@echo " make test-unit-helm - Run helm unit tests"
2025-03-03 11:41:30 +08:00
2026-02-04 14:29:29 +08:00
# Keep PIP simple for edge cases:
PIP := $( shell command -v pip > /dev/null 2>& 1 && echo "pip" || echo "python3 -m pip" )
# Show info
info :
@echo " PIP: $( PIP) "
2025-06-07 05:19:28 +08:00
# Installation targets
2025-03-14 10:55:22 +08:00
install-dev :
poetry install --with dev
2025-03-29 03:32:04 +08:00
install-proxy-dev :
2025-06-07 05:19:28 +08:00
poetry install --with dev,proxy-dev --extras proxy
2025-03-29 03:32:04 +08:00
2025-06-07 05:19:28 +08:00
# CI-compatible installations (matches GitHub workflows exactly)
install-dev-ci :
2026-02-04 14:29:29 +08:00
$( PIP) install openai = = 2.8.0
2025-06-07 05:19:28 +08:00
poetry install --with dev
2026-02-04 14:29:29 +08:00
$( PIP) install openai = = 2.8.0
2025-06-07 05:19:28 +08:00
install-proxy-dev-ci :
poetry install --with dev,proxy-dev --extras proxy
2026-02-04 14:29:29 +08:00
$( PIP) install openai = = 2.8.0
2025-06-07 05:19:28 +08:00
install-test-deps : install -proxy -dev
2026-02-04 14:29:29 +08:00
poetry run $( PIP) install "pytest-retry==1.6.3"
poetry run $( PIP) install pytest-xdist
poetry run $( PIP) install openapi-core
cd enterprise && poetry run $( PIP) install -e . && cd ..
2025-06-07 05:19:28 +08:00
install-helm-unittest :
2025-08-21 15:44:54 +08:00
helm plugin install https://github.com/helm-unittest/helm-unittest --version v0.4.4 || echo "ignore error if plugin exists"
2025-06-07 05:19:28 +08:00
# Formatting
format : install -dev
cd litellm && poetry run black . && cd ..
format-check : install -dev
cd litellm && poetry run black --check . && cd ..
# Linting targets
lint-ruff : install -dev
cd litellm && poetry run ruff check . && cd ..
2026-02-04 14:29:29 +08:00
# faster linter for developing ...
# inspiration from:
# https://github.com/astral-sh/ruff/discussions/10977
# https://github.com/astral-sh/ruff/discussions/4049
lint-format-changed : install -dev
@git diff origin/main --unified= 0 --no-color -- '*.py' | \
perl -ne ' \
if ( /^diff --git a\/ ( .*) b\/ /) { $$ file = $$ 1; } \
if ( /^@@ .* \+ ( \d +) ( ?:,( \d +) ) ? @@/) { \
$$ start = $$ 1; $$ count = $$ 2 || 1; $$ end = $$ start + $$ count - 1; \
print " $$ file: $$ start:1- $$ end:999\n " ; \
} ' | \
while read range; do \
file = " $$ {range%%:*} " ; \
lines = " $$ {range#*:} " ; \
echo " Formatting $$ file (lines $$ lines) " ; \
poetry run ruff format --range " $$ lines " " $$ file " ; \
done
lint-ruff-dev : install -dev
@tmpfile= $$ ( mktemp /tmp/ruff-dev.XXXXXX) && \
cd litellm && \
( poetry run ruff check . --output-format= pylint || true ) > " $$ tmpfile " && \
poetry run diff-quality --violations= pylint " $$ tmpfile " --compare-branch= origin/main && \
cd .. ; \
rm -f " $$ tmpfile "
lint-ruff-FULL-dev : install -dev
@files= $$ ( git diff --name-only origin/main -- '*.py' ) ; \
if [ -n " $$ files " ] ; then echo " $$ files " | xargs poetry run ruff check; \
else echo "No changed .py files to check." ; fi
2025-06-07 05:19:28 +08:00
lint-mypy : install -dev
2026-02-04 14:29:29 +08:00
poetry run $( PIP) install types-requests types-setuptools types-redis types-PyYAML
2025-06-07 05:19:28 +08:00
cd litellm && poetry run mypy . --ignore-missing-imports && cd ..
lint-black : format -check
check-circular-imports : install -dev
cd litellm && poetry run python ../tests/documentation_tests/test_circular_imports.py && cd ..
check-import-safety : install -dev
2026-02-04 14:29:29 +08:00
@poetry run python -c "from litellm import *; print('[from litellm import *] OK! no issues!');" || ( echo '🚨 import failed, this means you introduced unprotected imports! 🚨' ; exit 1)
2025-06-07 05:19:28 +08:00
# Combined linting (matches test-linting.yml workflow)
lint : format -check lint -ruff lint -mypy check -circular -imports check -import -safety
2025-03-14 10:55:22 +08:00
2026-02-04 14:29:29 +08:00
# Faster linting for local development (only checks changed code)
lint-dev : lint -format -changed lint -mypy check -circular -imports check -import -safety
2025-06-07 05:19:28 +08:00
# Testing targets
2025-03-03 11:41:30 +08:00
test :
poetry run pytest tests/
2025-06-07 05:19:28 +08:00
test-unit : install -test -deps
poetry run pytest tests/test_litellm -x -vv -n 4
2025-03-03 11:41:30 +08:00
test-integration :
2025-05-28 07:14:49 +08:00
poetry run pytest tests/ -k "not test_litellm"
2025-03-16 19:39:13 +08:00
2025-06-07 05:19:28 +08:00
test-unit-helm : install -helm -unittest
2025-06-28 12:24:19 +08:00
helm unittest -f 'tests/*.yaml' deploy/charts/litellm-helm
# LLM Translation testing targets
test-llm-translation : install -test -deps
@echo "Running LLM translation tests..."
@python .github/workflows/run_llm_translation_tests.py
test-llm-translation-single : install -test -deps
@echo "Running single LLM translation test file..."
@if [ -z " $( FILE) " ] ; then echo "Usage: make test-llm-translation-single FILE=test_filename.py" ; exit 1; fi
@mkdir -p test-results
poetry run pytest tests/llm_translation/$( FILE) \
--junitxml= test-results/junit.xml \
2026-01-14 06:10:11 +08:00
-v --tb= short --maxfail= 100 --timeout= 300