mirror of
https://github.com/whit3rabbit/anyllm-proxy.git
synced 2026-09-21 16:00:49 +00:00
269 lines
7.9 KiB
Markdown
269 lines
7.9 KiB
Markdown
# Command Line Interface (CLI) & Advanced Configuration
|
|
|
|
This document covers running `anyllm-proxy` directly from the command line, configuring backends via environment variables/config files, and interacting with the admin API using `curl`.
|
|
|
|
---
|
|
|
|
## Command Line Usage
|
|
|
|
### Standard Server Command
|
|
Start the proxy server and the admin WebUI:
|
|
```bash
|
|
anyllm-proxy --webui
|
|
```
|
|
|
|
### Running a Tool Wrapper
|
|
The proxy can launch a CLI tool (like `claude`) and configure it to point to the proxy automatically in one command:
|
|
```bash
|
|
anyllm-proxy run claude
|
|
```
|
|
This is equivalent to manually setting `ANTHROPIC_BASE_URL` and running `claude`.
|
|
|
|
### Using Specific Env Files
|
|
Load settings from a specific `.env` file instead of the default `.anyllm.env`:
|
|
```bash
|
|
anyllm-proxy --env-file ~/configs/ollama.env
|
|
```
|
|
|
|
---
|
|
|
|
## Environment Variables Configuration
|
|
|
|
If you do not want to use the WebUI settings dashboard, you can configure backends and models using environment variables.
|
|
|
|
### Local LLMs (Ollama, LM Studio, vLLM)
|
|
```bash
|
|
OPENAI_API_KEY=unused \
|
|
OPENAI_BASE_URL=http://localhost:11434/v1 \
|
|
BIG_MODEL=qwen2.5-coder:32b \
|
|
SMALL_MODEL=qwen2.5-coder:32b \
|
|
anyllm-proxy
|
|
```
|
|
For **LM Studio** use port `1234` and for **vLLM** use port `8000` (substitute `OPENAI_BASE_URL`).
|
|
If your local LLM rejects `stream_options`, set `OMIT_STREAM_OPTIONS=true`.
|
|
|
|
### Commercial APIs
|
|
|
|
#### OpenAI
|
|
```bash
|
|
OPENAI_API_KEY=sk-... \
|
|
BIG_MODEL=gpt-4o \
|
|
SMALL_MODEL=gpt-4o-mini \
|
|
anyllm-proxy
|
|
```
|
|
|
|
#### OpenRouter
|
|
```bash
|
|
# Using the dedicated provider key (recommended):
|
|
BACKEND=openrouter \
|
|
OPENROUTER_API_KEY=sk-or-... \
|
|
BIG_MODEL=anthropic/claude-3.5-sonnet \
|
|
SMALL_MODEL=anthropic/claude-3-haiku \
|
|
anyllm-proxy
|
|
|
|
# Or via the generic OpenAI-compat path:
|
|
OPENAI_API_KEY=sk-or-... \
|
|
OPENAI_BASE_URL=https://openrouter.ai/api/v1 \
|
|
BIG_MODEL=anthropic/claude-3.5-sonnet \
|
|
SMALL_MODEL=anthropic/claude-3-haiku \
|
|
anyllm-proxy
|
|
```
|
|
|
|
#### Google Gemini
|
|
```bash
|
|
BACKEND=gemini \
|
|
GEMINI_API_KEY=AIza... \
|
|
anyllm-proxy
|
|
```
|
|
|
|
#### Azure OpenAI
|
|
```bash
|
|
BACKEND=azure \
|
|
AZURE_OPENAI_ENDPOINT=https://myresource.openai.azure.com \
|
|
AZURE_OPENAI_DEPLOYMENT=my-gpt4o \
|
|
AZURE_OPENAI_API_KEY=... \
|
|
anyllm-proxy
|
|
```
|
|
|
|
#### AWS Bedrock
|
|
```bash
|
|
BACKEND=bedrock \
|
|
AWS_REGION=us-east-1 \
|
|
AWS_ACCESS_KEY_ID=AKIA... \
|
|
AWS_SECRET_ACCESS_KEY=... \
|
|
BIG_MODEL=anthropic.claude-3-5-sonnet-20241022-v2:0 \
|
|
SMALL_MODEL=anthropic.claude-3-5-haiku-20241022-v1:0 \
|
|
anyllm-proxy
|
|
```
|
|
|
|
#### Anthropic Passthrough
|
|
(No translation: forwards requests directly to Anthropic, useful for billing, metrics, or rate-limiting control):
|
|
```bash
|
|
BACKEND=anthropic \
|
|
ANTHROPIC_API_KEY=sk-ant-... \
|
|
anyllm-proxy
|
|
```
|
|
|
|
### Advanced Inbound Subscription/Credential Sharing
|
|
When using Claude Code with a subscription (no API key needed), the proxy must have the upstream credentials to talk to Anthropic.
|
|
|
|
#### Option A: Portable token
|
|
```bash
|
|
# 1. On a machine logged into Claude Code, mint a bearer token:
|
|
claude setup-token
|
|
|
|
# 2. Start proxy with it:
|
|
BACKEND=anthropic ANTHROPIC_AUTH_TOKEN=<token-from-setup-token> \
|
|
PROXY_OPEN_RELAY=true \
|
|
anyllm-proxy
|
|
|
|
# 3. Run Claude Code pointing to the proxy:
|
|
ANTHROPIC_BASE_URL=http://localhost:3000 ANTHROPIC_API_KEY=proxy-user claude
|
|
```
|
|
|
|
#### Option B: Forward client authentication
|
|
Set `ANTHROPIC_FORWARD_CLIENT_AUTH=true` to forward whatever credentials Claude Code passes, bypassing the token minting:
|
|
```bash
|
|
BACKEND=anthropic ANTHROPIC_FORWARD_CLIENT_AUTH=true \
|
|
PROXY_OPEN_RELAY=true \
|
|
anyllm-proxy
|
|
```
|
|
For security safeguards on client auth forwarding, see [ENV.md](ENV.md).
|
|
|
|
---
|
|
|
|
## Multi-Backend Routing & Configuration Files
|
|
|
|
You can define multiple backends using TOML or LiteLLM YAML config files. Point the proxy to the config file via `PROXY_CONFIG`.
|
|
|
|
### Auto Router & Claude Code Model Discovery
|
|
|
|
The admin UI's **Auto Router** tab maps Claude Code request tiers (Default, Background, Think, Long Context, Web Search, Image) to a specific backend and model. When the router is enabled, `GET /v1/models` advertises the real backend models (the tier targets plus each managed backend's catalog) instead of a static Claude catalog, so Claude Code can show and pick the actual models.
|
|
|
|
The tab's **Start Claude Code** command includes `CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=true`, which makes Claude Code fetch `/v1/models` and add those real models to its `/model` picker. A model picked from that list is routed straight to the backend that offers it (explicit pick wins, bypassing tier-signal routing); `claude-*` alias traffic still flows through the configured tiers as before.
|
|
|
|
### TOML Format
|
|
```toml
|
|
# config.toml
|
|
listen_port = 3000
|
|
default_backend = "local"
|
|
|
|
[backends.local]
|
|
kind = "openai"
|
|
api_key = "unused"
|
|
base_url = "http://localhost:11434/v1"
|
|
big_model = "qwen2.5-coder:32b"
|
|
small_model = "qwen2.5-coder:7b"
|
|
|
|
[backends.openai]
|
|
kind = "openai"
|
|
api_key = "env:OPENAI_API_KEY"
|
|
base_url = "https://api.openai.com/v1"
|
|
big_model = "gpt-4o"
|
|
small_model = "gpt-4o-mini"
|
|
|
|
[backends.deepseek]
|
|
kind = "openai"
|
|
api_key = "sk-deepseek-..."
|
|
base_url = "https://api.deepseek.com/v1"
|
|
big_model = "deepseek-coder"
|
|
small_model = "deepseek-chat"
|
|
```
|
|
Run with:
|
|
```bash
|
|
PROXY_CONFIG=config.toml anyllm-proxy
|
|
```
|
|
Paths map as:
|
|
- `http://localhost:3000/v1/messages` -> local (default)
|
|
- `http://localhost:3000/openai/v1/messages` -> OpenAI
|
|
- `http://localhost:3000/deepseek/v1/messages` -> DeepSeek
|
|
|
|
### LiteLLM YAML Format
|
|
anyllm-proxy accepts LiteLLM `config.yaml` structures directly:
|
|
```yaml
|
|
# config.yaml
|
|
model_list:
|
|
- model_name: gpt-4o
|
|
litellm_params:
|
|
model: azure/gpt-4o-eu
|
|
api_base: https://my-resource.openai.azure.com/
|
|
api_key: os.environ/AZURE_API_KEY
|
|
rpm: 6000
|
|
- model_name: gpt-4o
|
|
litellm_params:
|
|
model: openai/gpt-4o
|
|
api_key: os.environ/OPENAI_API_KEY
|
|
rpm: 10000
|
|
|
|
general_settings:
|
|
master_key: os.environ/LITELLM_MASTER_KEY
|
|
```
|
|
Run with:
|
|
```bash
|
|
PROXY_CONFIG=config.yaml anyllm-proxy
|
|
```
|
|
|
|
### LiteLLM Environment Mappings
|
|
The proxy supports direct LiteLLM-style environment variable overrides:
|
|
- `LITELLM_MASTER_KEY` maps to `PROXY_API_KEYS`
|
|
- `LITELLM_CONFIG` maps to `PROXY_CONFIG`
|
|
- `AZURE_API_KEY` maps to `AZURE_OPENAI_API_KEY`
|
|
- `AZURE_API_BASE` maps to `AZURE_OPENAI_ENDPOINT`
|
|
- `AZURE_API_VERSION` maps to `AZURE_OPENAI_API_VERSION`
|
|
- `AWS_REGION_NAME` maps to `AWS_REGION`
|
|
|
|
See [COMPARISON_LITELLM.md](COMPARISON_LITELLM.md) for full details.
|
|
|
|
See also [COMPARISON_LITELM.md](COMPARISON_LITELM.md) for the positioning against the litelm Python library (different category — gateway vs in-process SDK).
|
|
|
|
---
|
|
|
|
## Admin API & Virtual Key Management
|
|
|
|
Virtual keys can be created, updated, and revoked via the admin API.
|
|
|
|
> [!NOTE]
|
|
> All mutating requests (POST/PUT/DELETE) require a CSRF token. Fetch it using `GET /admin/csrf-token` first and pass it in the `X-CSRF-Token` header.
|
|
|
|
### Create a Virtual Key
|
|
```bash
|
|
curl -X POST http://localhost:3001/admin/api/keys \
|
|
-H "Authorization: Bearer $(cat ~/.anyllm/.admin_token)" \
|
|
-H "X-CSRF-Token: <CSRF_TOKEN>" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"description": "dev key",
|
|
"rpm_limit": 60,
|
|
"tpm_limit": 100000,
|
|
"max_budget_usd": 10.00,
|
|
"budget_duration": "monthly",
|
|
"expires_at": "2026-12-31T00:00:00Z",
|
|
"allowed_models": ["claude-*", "gpt-4o"]
|
|
}'
|
|
# Response: {"id": 1, "key": "sk-vk...", ...}
|
|
```
|
|
|
|
### Update a Key
|
|
```bash
|
|
curl -X PUT http://localhost:3001/admin/api/keys/1 \
|
|
-H "Authorization: Bearer $(cat ~/.anyllm/.admin_token)" \
|
|
-H "X-CSRF-Token: <CSRF_TOKEN>" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"rpm_limit": 120, "max_budget_usd": 20.00}'
|
|
```
|
|
|
|
### Retrieve Spend Metrics
|
|
```bash
|
|
curl http://localhost:3001/admin/api/keys/1/spend \
|
|
-H "Authorization: Bearer $(cat ~/.anyllm/.admin_token)"
|
|
```
|
|
|
|
### Revoke a Key
|
|
```bash
|
|
curl -X DELETE http://localhost:3001/admin/api/keys/1 \
|
|
-H "Authorization: Bearer $(cat ~/.anyllm/.admin_token)" \
|
|
-H "X-CSRF-Token: <CSRF_TOKEN>"
|
|
```
|
|
|
|
For more info on using anyllm-proxy as a library or embedding its middleware, see [library-integration.md](library-integration.md).
|