LiteLLM is an open-source LLM gateway with a unified API to 100+ model providers. Route Apus through LiteLLM for centralized cost tracking, logging, virtual keys with spend limits, and backend failover without changing Apus config.
Quick start
Onboarding (recommended)
```bash
apus onboard --auth-choice litellm-api-key
```
For non-interactive setup against a remote proxy, pass the proxy URL explicitly:
```bash
apus onboard --non-interactive --accept-risk --skip-health --auth-choice litellm-api-key \
--litellm-api-key "$LITELLM_API_KEY" --custom-base-url "https://litellm.example/v1"
```
Manual setup
Start LiteLLM Proxy
LiteLLM calls the upstream provider on your behalf, so export that
provider's key before starting it — `ANTHROPIC_API_KEY` for the model
below. See [Model routing](#advanced) for multi-backend setups.
```bash
pip install 'litellm[proxy]'
export ANTHROPIC_API_KEY=sk-ant-...
litellm --model claude-opus-4-6
```
Point Apus to LiteLLM
```bash
export LITELLM_API_KEY="your-litellm-key"
apus
```
Configuration
{
models: {
providers: {
litellm: {
baseUrl: "http://localhost:4000",
apiKey: "${LITELLM_API_KEY}",
api: "openai-completions",
models: [
{
id: "claude-opus-4-6",
name: "Claude Opus 4.6",
reasoning: true,
input: ["text", "image"],
contextWindow: 200000,
maxTokens: 64000,
},
{
id: "gpt-6-astra",
name: "GPT-6 Astra",
reasoning: true,
input: ["text", "image"],
contextWindow: 1050000,
maxTokens: 128000,
},
],
},
},
},
agents: {
defaults: {
model: { primary: "litellm/claude-opus-4-6" },
},
},
}
The default model onboarding writes is litellm/claude-opus-4-6.
In merge mode, onboarding with an explicit proxy URL preserves any authored provider models and
otherwise leaves the provider model list empty for discovery. Run
apus models list --provider litellm --refresh --json to list the proxy's models.
With models.mode: "replace", discovery is disabled, so onboarding keeps the documented default
in the provider model list while preserving existing model definitions.
Image generation
LiteLLM can back the image_generate tool through OpenAI-compatible /images/generations and
/images/edits routes. Default image model is gpt-image-2; configure a different one under
agents.defaults.mediaModels.image:
{
models: {
providers: {
litellm: {
baseUrl: "http://localhost:4000",
apiKey: "${LITELLM_API_KEY}",
},
},
},
agents: {
defaults: {
mediaModels: {
image: {
primary: "litellm/gpt-image-2",
timeoutMs: 180000,
},
},
},
},
}
Loopback LiteLLM URLs (http://localhost:4000, 127.0.0.1, ::1, host.docker.internal) work
without a global private-network override. For a LAN-hosted proxy, set
models.providers.litellm.request.allowPrivateNetwork: true because the API key is sent to that host.
Advanced
Virtual keys
Create a dedicated key for Apus with spend limits:
```bash
curl -X POST "http://localhost:4000/key/generate" \
-H "Authorization: Bearer $LITELLM_MASTER_KEY" \
-H "Content-Type: application/json" \
-d '{
"key_alias": "apus",
"max_budget": 50.00,
"budget_duration": "monthly"
}'
```
Use the generated key as `LITELLM_API_KEY`.
Model routing
LiteLLM can route model requests to different backends. Configure in your LiteLLM `config.yaml`:
```yaml
model_list:
- model_name: claude-opus-4-6
litellm_params:
model: claude-opus-4-6
api_key: os.environ/ANTHROPIC_API_KEY
- model_name: gpt-6-astra
litellm_params:
model: gpt-6-astra
api_key: os.environ/OPENAI_API_KEY
```
Apus keeps requesting `claude-opus-4-6`; LiteLLM handles the routing.
Viewing usage
```bash
# Key info
curl "http://localhost:4000/key/info" \
-H "Authorization: Bearer sk-litellm-key"
# Spend logs
curl "http://localhost:4000/spend/logs" \
-H "Authorization: Bearer $LITELLM_MASTER_KEY"
```
Proxy behavior notes
- LiteLLM runs on `http://localhost:4000` by default.
- Apus connects through LiteLLM's proxy-style OpenAI-compatible `/v1` endpoint.
- Native-OpenAI-only request shaping does not apply through a configured LiteLLM base URL:
no `service_tier`, no Responses `store`, no prompt-cache hints, no OpenAI reasoning-effort
payload shaping.
- Hidden Apus attribution headers (`originator`, `version`, `User-Agent`) are only sent to
verified native OpenAI endpoints, so they are not injected on a custom LiteLLM base URL.
For general provider configuration and failover behavior, see Model Providers.
Related
LiteLLM Docs
Official LiteLLM documentation and API reference.
Model selection
Overview of all providers, model refs, and failover behavior.
Configuration
Full config reference.
Models
How to choose and configure models.