Gateway local de LLMs com roteamento automático entre provedores. Unifica Claude (Anthropic), Gemini (Google) e modelos locais via Ollama por trás de uma única API OpenAI-compatível, e usa um router em FastAPI para escolher o melhor modelo para cada prompt.
Você manda uma requisição OpenAI-compatível para um único endpoint (http://localhost:4000) e o stack:
- Recebe a chamada no LiteLLM, que normaliza a API e expõe vários modelos lógicos (
claude,gemini,gemini-pro,local,auto). - Quando o modelo é
auto(ou um dos aliases do Claude CLI), encaminha para o auto-router, que classifica o prompt heuristicamente e escolhe o modelo concreto. - O auto-router consulta um cache em Redis: prompts já vistos vão direto para o modelo aprendido; prompts novos passam pela classificação.
- A resposta volta pelo LiteLLM ao cliente, e o par
prompt → modeloé salvo no Redis para a próxima vez.
Em paralelo, o painel One-API (:3000) gerencia chaves de API e usuários, persistindo em PostgreSQL.
| Serviço | Porta | Papel |
|---|---|---|
litellm |
4000 |
Gateway OpenAI-compatível, multiplexa providers (litellm_config.yaml) |
auto-router |
5000 |
FastAPI que classifica prompt e escolhe modelo (auto-router/) |
redis |
6379 |
Cache prompt → modelo aprendido pelo router |
ollama |
11434 |
Runtime de modelos locais (llama3), volume ./ollama |
one-api |
3000 |
Painel admin (gerência de chaves/usuários) |
one-api-db |
— | PostgreSQL 16 que armazena o estado do One-API |
Fluxo típico:
cliente → litellm:4000 → auto-router:5000 → (cache Redis ou classificação)
↓
litellm:4000 (com modelo concreto)
↓
Anthropic / Gemini / Ollama (local)
Regras de classificação implementadas em auto-router/router.py:
- Código / infra (
def,class,import,select,```,dockerfile,kubectl,terraform, etc.) → modelolocal(Ollama llama3). - Prompt longo (> 1000 chars) ou médio (> 300) com palavras de raciocínio (
explique,analise,compare,por que,descreva,arquiteture, etc.) →claude. - Médio (> 500 chars) ou qualquer outro com palavras de raciocínio →
gemini-pro. - Default →
gemini(flash, rápido e barato).
Se a chave route:hash(prompt)%10000 já existir no Redis, o router devolve imediatamente o modelo aprendido sem reclassificar. O auto-router/learner.py grava o último modelo usado para cada prompt após cada resposta.
Os aliases claude-sonnet-4-6, claude-opus-4-6 e claude-haiku-4-5-20251001 (definidos em litellm_config.yaml) também passam pelo auto-router — útil para usar o stack como backend transparente do Claude CLI.
Pré-requisitos: Docker e Docker Compose.
-
Crie um arquivo
.envna raiz com:ANTHROPIC_API_KEY=sk-ant-... GEMINI_API_KEY=... POSTGRES_PASSWORD=algumaSenhaForte SESSION_SECRET=algumSegredoLongoEAleatorio
-
Suba todo o stack:
docker compose up -d
-
(Primeiro uso do Ollama) baixe o modelo local:
docker exec -it ollama ollama pull llama3 -
Teste o gateway:
curl http://localhost:4000/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{"model":"auto","messages":[{"role":"user","content":"olá!"}]}'
- LiteLLM (gateway):
http://localhost:4000/v1/chat/completions - auto-router (direto):
http://localhost:5000/v1/chat/completions - Painel One-API:
http://localhost:3000 - Ollama:
http://localhost:11434 - Redis:
localhost:6379