Uma solução resiliente de cluster de modelos de linguagem com failover automático e transparência total de modelos.
Este repositório documenta a configuração de um Cluster de Modelos de Linguagem (LLM) resiliente que utiliza o LiteLLM como servidor proxy para gerenciar múltiplos provedores e o OpenCode como interface de desenvolvimento. A arquitetura garante Failover Automático e Transparência de Modelos, permitindo trocar entre diferentes LLMs instantaneamente sem alterar o código do projeto.
- ✅ Failover Automático: Alternância transparente entre modelos em caso de falha
- ✅ Multi-provedor: Suporte a DeepSeek, Groq, OpenRouter, Gemini e outros
- ✅ Endpoint Único: Interface unificada para todos os modelos
- ✅ Transparência Total: Visibilidade completa sobre qual modelo está sendo usado
- ✅ Alta Disponibilidade: Configuração com systemd para recuperação automática
- ✅ Logs Detalhados: Monitoramento completo do cluster
graph TB
A[OpenCode Interface] --> B[LiteLLM Proxy]
B --> C{Model Router}
C --> D[DeepSeek API]
C --> E[Groq API]
C --> F[OpenRouter API]
C --> G[Gemini API]
style A fill:#4CAF50
style B fill:#2196F3
style C fill:#FF9800
O sistema funciona como um middleware local que unifica diferentes APIs de LLM sob um único endpoint (http://localhost:4000/v1). Isso permite:
- Abstração de Provedores: Troque entre modelos sem alterar o código
- Balanceamento de Carga: Distribuição inteligente entre modelos disponíveis
- Resiliência: Recuperação automática em caso de falhas
- Monitoramento: Logs detalhados para troubleshooting
| Componente | Versão | Instalação |
|---|---|---|
| Python | 3.10+ | sudo apt install python3.10 |
| LiteLLM | Latest | pip install litellm |
| OpenCode | Latest | Instalação Oficial |
Crie o arquivo de configuração ~/litellm-config.yaml:
# ~/litellm-config.yaml
model_list:
- model_name: cluster-osint
litellm_params:
model: gemini/gemini-2.0-flash-lite
api_key: "os.environ/GEMINI_API_KEY"
max_tokens: 8192
- model_name: cluster-osint
litellm_params:
model: groq/llama-3.3-70b-versatile
api_key: "os.environ/GROQ_API_KEY"
max_tokens: 4096
- model_name: cluster-osint
litellm_params:
model: openrouter/qwen/qwen-2.5-72b-instruct
api_key: "os.environ/OPENROUTER_API_KEY"
max_tokens: 4096
- model_name: cluster-osint
litellm_params:
model: deepseek/deepseek-chat
api_key: "os.environ/DEEPSEEK_API_KEY"
api_base: https://api.deepseek.com
max_tokens: 4096
drop_invalid_params: true
router_settings:
routing_strategy: simple-shuffle
enable_fallbacks: trueNotas Importantes:
drop_invalid_params: trueé essencial para compatibilidade com DeepSeekmax_tokensdeve estar entre 1 e 8192 para evitar erros 400- As chaves API são carregadas das variáveis de ambiente
Ajuste o arquivo ~/.config/opencode/opencode.json:
{
"$schema": "https://opencode.ai/config.json",
"model": "litellm/cluster-osint",
"provider": {
"litellm": {
"npm": "@ai-sdk/openai-compatible",
"name": "LiteLLM-Proxy",
"options": {
"baseURL": "http://localhost:4000/v1"
},
"models": {
"cluster-osint": {
"name": "Cluster Economia (Gemini > Groq > DeepSeek)",
"limit": {
"context": 32768,
"output": 4096
}
}
}
}
}
}context e output sejam definidos como números inteiros dentro do objeto limit.
Para inicialização automática e recuperação de falhas:
sudo nano /etc/systemd/system/litellm.serviceAdicione o seguinte conteúdo (substitua USUARIO pelo seu nome de usuário):
[Unit]
Description=LiteLLM Proxy Service
After=network.target
Wants=network.target
[Service]
Type=simple
User=USUARIO
WorkingDirectory=/home/USUARIO
Environment="PATH=/home/USUARIO/.local/bin:/usr/local/bin:/usr/bin:/bin"
ExecStart=/home/USUARIO/.local/bin/litellm \
--config /home/USUARIO/litellm-config.yaml \
--port 4000 \
--drop_params \
--debug
Restart=always
RestartSec=5
StandardOutput=append:/home/USUARIO/litellm.log
StandardError=append:/home/USUARIO/litellm.log
# Limite de recursos (opcional)
MemoryLimit=512M
CPUQuota=50%
[Install]
WantedBy=multi-user.target# Recarregar systemd
sudo systemctl daemon-reload
# Habilitar inicialização automática
sudo systemctl enable litellm
# Iniciar o serviço
sudo systemctl start litellm
# Verificar status
sudo systemctl status litellm
# Verificar logs em tempo real
sudo journalctl -u litellm -fPara testar rapidamente sem systemd:
# 1. Exportar variáveis de ambiente
export DEEPSEEK_API_KEY="sua-chave-aqui"
export GROQ_API_KEY="sua-chave-aqui"
export OPENROUTER_API_KEY="sua-chave-aqui"
export GEMINI_API_KEY="sua-chave-aqui"
# 2. Iniciar o proxy LiteLLM
litellm --config ~/litellm-config.yaml --port 4000 --drop_params
# 3. Testar o endpoint
curl http://localhost:4000/v1/models| Problema | Sintoma | Solução |
|---|---|---|
| Erro 400 | Invalid max_tokens |
Defina max_tokens entre 1 e 8192 no litellm-config.yaml |
| Configuração Inválida | OpenCode rejeita JSON | Certifique-se que context e output são números inteiros |
| Proxy Não Inicia | Porta 4000 em uso | Use --port 4001 ou libere a porta: sudo fuser -k 4000/tcp |
| Falha de Autenticação | Erro 401/403 | Verifique se as variáveis de ambiente estão configuradas corretamente |
| Alta Latência | Respostas lentas | Verifique a conexão de rede ou troque de provedor |
# Verificar logs em tempo real
tail -f ~/litellm.log
# Monitorar uso de recursos
sudo systemctl status litellm
# Verificar portas abertas
sudo netstat -tlnp | grep 4000
# Testar conectividade do proxy
curl -v http://localhost:4000/v1/health
# Reiniciar serviço
sudo systemctl restart litellm
# Verificar métricas do sistema
htopOs logs são armazenados em ~/litellm.log e incluem:
- Timestamp: Data e hora de cada requisição
- Modelo Usado: Qual LLM processou a requisição
- Tempo de Resposta: Latência de cada chamada
- Status Codes: Códigos HTTP de retorno
- Erros Detalhados: Stack traces completos para debugging
| Modelo | Provedor | Contexto | Saída | Observações |
|---|---|---|---|---|
| DeepSeek Chat | DeepSeek | 65K | 4K | Requer drop_invalid_params: true |
| Llama 3.3 70B | Groq | 32K | 4K | Alta velocidade de inferência |
| Qwen 2.5 72B | OpenRouter | 32K | 4K | Excelente para código |
| Gemini 2.0 Flash | 128K | 8K | Maior contexto disponível |
O LiteLLM oferece várias estratégias de roteamento:
simple-shuffle(Padrão): Alterna aleatoriamente entre modelos disponíveisusage-based: Roteia com base no uso históricolatency-based: Seleciona o modelo com menor latêncialeast-busy: Escolhe o modelo com menos requisições ativas
Para alterar a estratégia, modifique routing_strategy no litellm-config.yaml.
- Variáveis de Ambiente: Nunca armazene chaves API em arquivos de configuração
- Firewall: Restrinja o acesso à porta 4000 apenas para localhost
- Logs Sensíveis: Configure permissões adequadas para arquivos de log
- Updates: Mantenha todas as dependências atualizadas
# Configurar firewall (UFW)
sudo ufw allow from 127.0.0.1 to any port 4000
sudo ufw deny 4000
# Proteger arquivos de configuração
chmod 600 ~/litellm-config.yaml
chmod 600 ~/.config/opencode/opencode.jsonContribuições são bem-vindas! Siga estes passos:
- Fork o repositório
- Crie uma branch para sua feature (
git checkout -b feature/AmazingFeature) - Commit suas mudanças (
git commit -m 'Add some AmazingFeature') - Push para a branch (
git push origin feature/AmazingFeature) - Abra um Pull Request
- Use Python 3.10+ com type hints
- Documente todas as funções públicas
- Inclua exemplos de uso
- Mantenha a compatibilidade com versões anteriores
Este projeto está licenciado sob a Licença MIT - veja o arquivo LICENSE para detalhes.
⭐ Se este projeto foi útil para você, considere dar uma estrela no GitHub!
Última atualização: Março 2026 | Mantido por Michel Vittoria