mirror of
https://github.com/magnus919/agent-skills.git
synced 2026-09-17 14:36:29 +03:00
Add litellm/, an operational tool skill for the LiteLLM AI gateway (proxy) and Python SDK, in the same vein as the vllm and llama-cpp engine skills. Contents: - SKILL.md: operating contract, operating loop, verification boundaries, and hard boundaries; concise core sections routing depth to references - README.md: human-facing install/use guide with required sections - references/: nine dated, source-indexed references (source index, quickstart + SDK, config & routing, keys/teams/budgets/spend, caching & guardrails, observability & logging, deployment, security & public hosting, troubleshooting), researched against litellm 1.97.0 (2026-08-22) including a live proxy probe of the health endpoints - scripts/litellm-health: read-only GET-only probe (liveliness, readiness, /v1/models, /model/info); stdlib-only Python 3.9+, --json, --help without a server - tests/test_litellm_health.py: 18 deterministic tests against a local stub HTTP server, including the observed-traffic GET-only contract - templates/proxy-config-record.md and proxy-deployment.md: fillable records; the config record is the rollback unit - evals/evals.json: schema_version 1, six output-quality cases Also regenerates tracked catalog artifacts (.claude-plugin/marketplace.json, .codex-plugin/plugin.json, llms.txt) and adds the root README catalog entry plus the skill-triggers.md index row. AI assistance: authored with AI assistance (Factory Droid) under human direction; facts verified against litellm 1.97.0 and official docs dated 2026-08-22. Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
287 lines
16 KiB
Markdown
287 lines
16 KiB
Markdown
---
|
|
name: litellm
|
|
description: >-
|
|
Operate, configure, secure, and troubleshoot the LiteLLM AI gateway (proxy) and
|
|
Python SDK: run the proxy (litellm --config), route to 100+ providers through one
|
|
OpenAI-compatible API, configure model lists and routing/reliability, virtual keys,
|
|
teams, budgets, rate limits, caching, guardrails, observability, and spend, and
|
|
diagnose request failures. Use when deploying or running a LiteLLM proxy or gateway
|
|
(config.yaml, ghcr.io/berriai/litellm), wiring the Python SDK or OpenAI SDK through
|
|
it, or hardening a public-facing deployment. Do not use for operating a single
|
|
inference engine (vllm, llama-cpp), for engine-selection methodology (ml-engineering),
|
|
or for building applications on top of an LLM API (backend/frontend engineering).
|
|
license: MIT
|
|
compatibility: >-
|
|
Requires litellm (pip, Python >=3.10) or the litellm proxy image
|
|
(ghcr.io/berriai/litellm or docker.litellm.ai/berriai/litellm, pinned >=1.83.7 for
|
|
public deployments). The bundled litellm-health script runs on Python 3.9+ and needs
|
|
no proxy for --help; live probes require HTTP(S) access to a running proxy, and
|
|
model routes require the master key or a virtual key.
|
|
metadata:
|
|
source: https://docs.litellm.ai/
|
|
source_index: references/00-source-index.md
|
|
research_checked: "2026-08-22"
|
|
---
|
|
|
|
# LiteLLM AI Gateway Operations
|
|
|
|
Use this skill to operate **LiteLLM** as an organization's AI gateway: run the proxy
|
|
(`litellm --config config.yaml`), route requests to 100+ LLM providers through one
|
|
OpenAI-compatible API, manage model lists, routing and reliability, virtual keys,
|
|
teams, budgets and rate limits, caching, guardrails, observability, and spend — and
|
|
diagnose failures with evidence. LiteLLM ships two surfaces: a Python SDK
|
|
(`litellm.completion()`, in-process) and the proxy (a FastAPI service on port 4000
|
|
with keys, budgets, and an admin UI). This is a **tool skill** for the named tool.
|
|
Engine selection and serving methodology belong to
|
|
[ml-engineering](../ml-engineering/SKILL.md); operating a single engine belongs to
|
|
[vllm](../vllm/SKILL.md) or [llama-cpp](../llama-cpp/SKILL.md).
|
|
|
|
## Operating contract
|
|
|
|
1. **Record the deployment before tuning it.** Capture the pinned image or pip
|
|
version, `config.yaml`, model list, routing, budgets, env-var references, and
|
|
data stores in the [proxy config record](templates/proxy-config-record.md). That
|
|
record is the rollback unit.
|
|
2. **Confirm the target, scope, and rollback path before mutating.** Read-only
|
|
discovery (health probes, `/v1/models`, logs, spend queries) may proceed without
|
|
confirmation. Mutations — config changes, key mint/revocation, restarts, image
|
|
upgrades, DB migrations — require an explicit human directive naming the deployment.
|
|
3. **A proxy that responds is not a proxy that serves.** `/health/liveliness`
|
|
returning 200 proves liveness only. Verify at the delivery boundary: a
|
|
representative `/v1/chat/completions` request returns tokens and
|
|
`x-litellm-model-id` names the deployment you expected.
|
|
4. **Keep evidence bounded.** Summarize logs and configs; never dump full logs,
|
|
`.env` contents, master keys, or provider credentials into chat. Spend logs and
|
|
debug output can contain prompt content — redact before sharing.
|
|
5. **Pin versions.** LiteLLM releases weekly and changes defaults; every claim here
|
|
was checked against 1.97.0 (2026-08-22). Re-verify version-sensitive behavior
|
|
against your installed release before relying on it.
|
|
|
|
## The litellm-health script
|
|
|
|
`scripts/litellm-health` is a read-only probe for a running proxy. It issues GET
|
|
requests only, never writes files, and emits bounded output.
|
|
|
|
```bash
|
|
scripts/litellm-health --help # no proxy needed
|
|
scripts/litellm-health --url http://127.0.0.1:4000 --json
|
|
scripts/litellm-health --check health --check readiness --json
|
|
scripts/litellm-health --check models --check model_info \
|
|
--key "$LITELLM_MASTER_KEY" --json
|
|
```
|
|
|
|
Exit codes: 0 all checks passed, 1 issues found or a fatal error, 2 usage error,
|
|
124 timeout. Checks: `health` (`GET /health/liveliness`, unauthenticated), `readiness`
|
|
(`GET /health/readiness`, unauthenticated; 503 when the configured DB is unreachable),
|
|
`models` (`GET /v1/models`, requires key), and `model_info` (`GET /model/info`,
|
|
requires key). Keys are sent as `Authorization: Bearer <key>`. The script never sends
|
|
data anywhere except the proxy you name.
|
|
|
|
## Operating loop
|
|
|
|
1. **Identify the deployment**: pinned version/image digest, how it runs (bare,
|
|
Docker, Compose, Helm), config source (file, `store_model_in_db`, or both), and
|
|
data stores (Postgres? Redis?).
|
|
2. **Collect evidence**: `litellm-health --json`; `GET /v1/models` and
|
|
`/model/info` with a key; response headers (`x-litellm-call-id`,
|
|
`x-litellm-model-id`, `x-litellm-model-api-base`, `x-litellm-version`);
|
|
`--detailed_debug` logs or `LITELLM_LOG=DEBUG` for the outbound request.
|
|
3. **Triage against the symptom**: classify provider vs gateway errors (see
|
|
[troubleshooting](references/08-troubleshooting.md)); check cooldown state,
|
|
budgets, DB connectivity.
|
|
4. **Act with confirmation**: bounded, scoped changes after a human directive, with
|
|
the rollback path named first.
|
|
5. **Verify**: re-run the probe and a representative chat request at the delivery
|
|
boundary.
|
|
|
|
## Quickstart: one config, many providers
|
|
|
|
```yaml
|
|
model_list:
|
|
- model_name: gpt-4o # name clients request
|
|
litellm_params:
|
|
model: openai/gpt-4o # routed string (provider prefix required)
|
|
api_key: os.environ/OPENAI_API_KEY # resolved inside the proxy process
|
|
- model_name: claude-sonnet
|
|
litellm_params:
|
|
model: anthropic/claude-sonnet-4-5
|
|
api_key: os.environ/ANTHROPIC_API_KEY
|
|
|
|
general_settings:
|
|
master_key: os.environ/LITELLM_MASTER_KEY # require auth on every call
|
|
```
|
|
|
|
Start with `litellm --config config.yaml --port 4000`. Success logs
|
|
`Proxy initialized with Config, Set models:`. Clients call the OpenAI surface:
|
|
`/v1/chat/completions`, `/chat/completions`, `/v1/embeddings`, `/v1/images/generations`,
|
|
`/v1/audio/transcriptions`, plus `/responses`, Anthropic-compatible `/messages`,
|
|
`/model/info`, `/health/liveliness`, `/health/readiness`. Any OpenAI SDK works
|
|
unchanged: `openai.OpenAI(base_url="http://localhost:4000", api_key=<virtual key>)`.
|
|
Details and the SDK surface: [quickstart reference](references/01-quickstart-and-sdk.md).
|
|
|
|
## Config and routing
|
|
|
|
- Entries sharing a `model_name` form one load-balanced group; each entry is a
|
|
deployment with its own hashed `model_id` used for health and cooldown tracking.
|
|
- `router_settings.routing_strategy` — `simple-shuffle` (default, recommended;
|
|
weighted by `rpm`/`tpm` or `weight` under `litellm_params`), `least-busy`,
|
|
`latency-based-routing`, `usage-based-routing` (docs warn against it in prod),
|
|
`cost-based-routing`.
|
|
- Reliability: `litellm_settings.num_retries` (per-deployment and request-level
|
|
overrides exist; `num_retries` is not the provider SDK's `max_retries`),
|
|
`fallbacks` / `context_window_fallbacks` / `content_policy_fallbacks`,
|
|
cooldowns (`allowed_fails`, `cooldown_time`), deployment `order` for priority,
|
|
`enable_pre_call_checks: true` to enforce context windows and region filters
|
|
pre-call (opt-in).
|
|
- With `store_model_in_db: true`, UI/API writes deep-merge over YAML in Postgres and
|
|
win on key conflicts — editing those YAML keys later has no effect while the DB row
|
|
exists. Details: [config and routing reference](references/02-config-and-routing.md).
|
|
|
|
## Keys, teams, budgets, spend
|
|
|
|
- `general_settings.master_key` (must start `sk-`) is the admin credential and UI
|
|
password. Virtual keys (`POST /key/generate`) scope models, budgets, and rpm/tpm
|
|
per workload; keys are stored hashed and never contain provider credentials.
|
|
- **Budgets require Postgres.** Without a connected DB, budgets fail open (a startup
|
|
warning is the only signal) and key endpoints return `No connected db.` — never run
|
|
a budget-sensitive deployment DB-less.
|
|
- Team keys enforce team (+ team-member) budgets only; the owner's personal budget
|
|
does not apply. Rate limits do not apply to proxy admins. Spend lands in
|
|
`/spend/logs` and `/global/spend`; `store_prompts_in_spend_logs` defaults to false.
|
|
Details: [keys and budgets reference](references/03-keys-teams-budgets-spend.md).
|
|
|
|
## Caching and guardrails
|
|
|
|
- Response cache: `litellm_settings.cache: true` + `cache_params.type: redis` for
|
|
multi-instance production (in-memory is per-process; disk/S3/GCS exist). Per-request
|
|
controls: `cache: {ttl, no-cache, namespace}` in the body.
|
|
- Semantic caches (`qdrant-semantic`, `redis-semantic`, `valkey-semantic`) embed the
|
|
whole messages array and can replay stale answers across similar multi-turn turns —
|
|
docs recommend excluding agentic traffic from semantic caching.
|
|
- Guardrails run `pre_call`, `post_call`, `during_call`, or `logging_only` (there is
|
|
no `all` mode); Presidio PII masking is OSS. Violations fail with HTTP 400 and an
|
|
embedded verdict; `x-litellm-applied-guardrails` names what ran.
|
|
Details: [caching and guardrails reference](references/04-caching-and-guardrails.md).
|
|
|
|
## Observability and logging
|
|
|
|
- Callbacks: `litellm_settings.success_callback` / `failure_callback` / `callbacks`
|
|
(Langfuse, OTel, Prometheus, Datadog, Sentry, ...). Prometheus `/metrics` requires
|
|
auth since 1.85.0 — give the scraper a bearer key or set
|
|
`require_auth_for_metrics_endpoint: false`.
|
|
- Forensic response headers: `x-litellm-call-id`, `x-litellm-model-id`,
|
|
`x-litellm-model-api-base`, `x-litellm-version`, `x-litellm-response-cost`.
|
|
- Privacy: `turn_off_message_logging: true` keeps metadata but drops content from
|
|
callbacks; `redact_user_api_key_info: true` redacts key/user/team identifiers.
|
|
Debug with `--detailed_debug`, `LITELLM_LOG=DEBUG`, or per-request
|
|
`"litellm_request_debug": true`.
|
|
Details: [observability reference](references/05-observability-and-logging.md).
|
|
|
|
## Deployment
|
|
|
|
- Postgres is mandatory for keys, teams, spend, budgets, and UI state; Redis >=7 is
|
|
required for more than one instance (shared rate-limit counters, cooldowns, cache).
|
|
- Pin image tags (`ghcr.io/berriai/litellm:vX.Y.Z` — semver tags since 1.84.0;
|
|
`-stable` suffixes are gone, `main-latest` is deprecated). Images are cosign-signed.
|
|
- Prisma migrations run at startup by default; on Kubernetes use the migration job
|
|
pattern with `DISABLE_SCHEMA_UPDATE=true` on serving pods. One Uvicorn worker per
|
|
pod; size the DB pool as `MAX_DB_CONNECTIONS / (instances x workers)`.
|
|
Details: [deployment reference](references/06-deployment.md).
|
|
|
|
## Security and public hosting
|
|
|
|
- Version floor for any internet-reachable proxy: **>=1.83.7** (CVE-2026-42208
|
|
pre-auth SQLi, CVE-2026-42203 SSTI, CVE-2026-42271 command injection, plus
|
|
Starlette >=1.0.1 for the CVE-2026-48710 host-header chain). Two of these were
|
|
CISA KEV-listed and actively exploited in 2026.
|
|
- Never expose management routes (`/key/*`, `/user/*`, `/team/*`, `/config/*`,
|
|
`/model/*`, `/spend/*`, `/ui`, `/prompts/test`, `/mcp-rest/*`). Route lockdown via
|
|
`allowed_routes` is Enterprise — on OSS, enforce at the reverse proxy.
|
|
- `LITELLM_SALT_KEY` encrypts DB-stored provider credentials; set it once and never
|
|
rotate it after adding models. Rotate the master key only via the documented flow.
|
|
- March 2026 supply-chain incident: backdoored `litellm==1.82.7/.8` PyPI wheels
|
|
(~40 minutes). Prefer cosign-verified pinned images over unpinned pip installs.
|
|
Hardening checklist: [security reference](references/07-security-and-public-hosting.md).
|
|
|
|
## Troubleshooting: the master diagnostic rule
|
|
|
|
**If the error contains `<Provider>Exception`, the provider failed — not the
|
|
gateway.** `AnthropicException`, `OpenAIException`, `BedrockException`, ... mean the
|
|
upstream call happened and its response is the evidence. No provider name means the
|
|
gateway itself rejected the call (bad LiteLLM key, unknown model, cooldowns, budget).
|
|
|
|
| Symptom | First move |
|
|
|---|---|
|
|
| `Invalid model name passed in model=X` | Name not in `model_list` or not granted to the key; check `GET /v1/models` with the same key |
|
|
| `No deployments available for selected model, Try again in N seconds` | All deployments cooling down (usually upstream 429s) or a missing provider prefix on `litellm_params.model` |
|
|
| `AnthropicException - Overloaded` (HTTP 500, Anthropic's 529) | Provider-side overload; retry/fail over — not a gateway bug |
|
|
| `Authentication Error ... ExceededTokenBudget` | Key/team budget exhausted; check `GET /key/info` |
|
|
| `ImportError: cannot import name 'get_flat_dependant'` at startup | fastapi too new for the pinned litellm; pin `fastapi==0.136.3` for 1.97.0 |
|
|
|
|
Full taxonomy and fixes: [troubleshooting reference](references/08-troubleshooting.md).
|
|
|
|
## Reference routing
|
|
|
|
| Load when | Reference |
|
|
|---|---|
|
|
| Sources, version observations, refresh procedure | `references/00-source-index.md` |
|
|
| Proxy quickstart, config.yaml, Python SDK, OpenAI-SDK drop-in | `references/01-quickstart-and-sdk.md` |
|
|
| model_list, routing strategies, retries/fallbacks/cooldowns | `references/02-config-and-routing.md` |
|
|
| Virtual keys, teams, budgets, rate limits, spend | `references/03-keys-teams-budgets-spend.md` |
|
|
| Response caching and guardrails | `references/04-caching-and-guardrails.md` |
|
|
| Callbacks, Prometheus, headers, privacy switches | `references/05-observability-and-logging.md` |
|
|
| Docker/Compose/K8s/Helm, scaling, migrations, upgrades | `references/06-deployment.md` |
|
|
| Public-facing hardening, CVE floor, supply chain | `references/07-security-and-public-hosting.md` |
|
|
| Error taxonomy, failure modes, debugging workflow | `references/08-troubleshooting.md` |
|
|
|
|
## Included artifacts
|
|
|
|
- `scripts/litellm-health`: read-only proxy probe (stdlib-only, `--json`, `--check`
|
|
subsets, `--key` for authenticated routes, `--help` without a server).
|
|
- `tests/test_litellm_health.py`: deterministic tests against a local stub HTTP
|
|
server, including the read-only contract.
|
|
- `templates/proxy-config-record.md` and `templates/proxy-deployment.md`: fillable
|
|
records — the config record is the rollback unit; the deployment record freezes the
|
|
runtime (image digest, ports, env, data stores, probes, rollback).
|
|
- `references/`: nine dated, source-indexed references covering the topics above.
|
|
- `evals/evals.json`: six output-quality evaluation cases.
|
|
|
|
## Verification boundary
|
|
|
|
| Claim | Minimum evidence |
|
|
|---|---|
|
|
| The proxy is alive | `litellm-health --check health` reports `/health/liveliness` 200 |
|
|
| The proxy is ready | `--check readiness` reports `/health/readiness` 200 (503 means DB down) |
|
|
| The right models are registered | `/v1/models` (with the calling key) lists the expected aliases |
|
|
| A deployment is configured correctly | `/model/info` shows the expected `litellm_params` with keys redacted |
|
|
| Inference works | A representative `/v1/chat/completions` request returns tokens and `x-litellm-model-id` names the intended deployment |
|
|
| Budgets are enforced | A connected DB is verified (readiness) and `/key/info` shows spend tracking for the key |
|
|
| A diagnosis is sound | Evidence (error string, headers, logs) was collected before the claim, and the fix was verified by re-running the probe and a representative request |
|
|
|
|
## Hard boundaries
|
|
|
|
- Never mutate a production proxy (config, keys, teams, budgets, image, DB) without
|
|
an explicit human directive naming the target and a stated rollback path. Read-only
|
|
discovery may proceed freely.
|
|
- Never expose the master key, management routes, or `/ui` beyond the trust boundary;
|
|
authentication is not a substitute for network and TLS controls.
|
|
- Never commit provider keys, `DATABASE_URL`, `LITELLM_MASTER_KEY`, or
|
|
`LITELLM_SALT_KEY` anywhere; use `os.environ/` references and a secret manager.
|
|
- Never run a budget-sensitive public deployment without Postgres — budgets fail
|
|
open without one.
|
|
- Never treat a 200 from `/health/liveliness` as proof the gateway serves; verify at
|
|
the delivery boundary.
|
|
|
|
## When not to use
|
|
|
|
- **Engine selection, serving methodology, quantization decisions, evaluation
|
|
design** — that is [ml-engineering](../ml-engineering/SKILL.md).
|
|
- **Operating a single inference engine** — [vllm](../vllm/SKILL.md) for vLLM,
|
|
[llama-cpp](../llama-cpp/SKILL.md) for the llama.cpp stack. LiteLLM routes *to*
|
|
engines; it does not replace their own operation.
|
|
- **Kubernetes/Docker fundamentals and reverse-proxy/TLS configuration** — that is
|
|
[kubernetes](../kubernetes/SKILL.md), [docker-compose](../docker-compose/SKILL.md),
|
|
and [traefik](../traefik/SKILL.md); this skill covers the LiteLLM-specific layer.
|
|
- **Building applications on top of an LLM API** (app architecture, agent frameworks)
|
|
— that is backend/frontend engineering; this skill owns the gateway and its SDK.
|