Servidor local em Go que expõe uma API OpenAI-compatible e faz fallback automático 🔄 entre múltiplos provedores de IA (OpenRouter, Groq, Google, Cerebras, SambaNova, DeepSeek, Ollama, llama.cpp). 🐈
O grande superpoder deste projeto é permitir que você utilize ferramentas avançadas de IA (como o Hermes Agent e o Claude Code) 100% de graça! 🤑
- Burlar os Limites Gratuitos: APIs gratuitas possuem cotas pequenas. Com o AI-gatiator, você pode cadastrar várias chaves gratuitas do mesmo provedor. Quando o limite (Rate Limit) da primeira chave estourar, o servidor passa automaticamente e de forma transparente para a próxima chave, e depois para o próximo modelo! O seu agente nunca fica na mão.
- A Recomendação de Ouro (OpenRouter): No momento, a recomendação oficial é focar no provedor OpenRouter (deixando os outros em
"enabled": false). Motivos:- Tradução Universal: Agentes como o Claude Code utilizam o formato da Anthropic (
/v1/messages). APIs diretas como Groq ou Google não entendem isso e dão erro (404). O OpenRouter traduz do formato Anthropic para OpenAI debaixo dos panos! - Limites Gigantescos: Agentes autônomos enviam System Prompts gigantescos (mais de 15.000 tokens por requisição). Provedores diretos como o Groq bloqueiam isso instantaneamente nas contas gratuitas (Erro 413). Já os modelos gratuitos do OpenRouter (ex:
google/gemini-2.5-flash) suportam esses prompts gigantes sem suar!
- Tradução Universal: Agentes como o Claude Code utilizam o formato da Anthropic (
Abra o arquivo .env (baseado no .env.example) e adicione as suas chaves de API.
Os provedores que você não possui chave podem ser desabilitados no config.json mudando para "enabled": false. 😸
| Provedor | Onde obter a chave | Gratuito? |
|---|---|---|
| OpenRouter | https://openrouter.ai/keys | ✅ sim |
| Groq | https://console.groq.com/keys | ✅ sim |
| https://aistudio.google.com/apikey | ✅ sim | |
| Cerebras | https://cloud.cerebras.ai/ | ✅ sim |
| SambaNova | https://cloud.sambanova.ai/ | ✅ sim |
| DeepSeek | https://platform.deepseek.com/api_keys | 💲 pago |
| Ollama | não precisa (local) | ✅ sim |
| llama.cpp | não precisa (local) | ✅ sim |
# Opção 1: Use o script run.sh (recomendado)
./run.sh
# Opção 2: Build manual
go build -o AI-gatiator ./cmd/gateway/
./AI-gatiator
# Com config em outro caminho:
./AI-gatiator -c /caminho/para/config.jsonNo Windows:
go build -o AI-gatiator.exe ./cmd/gateway/
AI-gatiator.exeComandos do run.sh:
./run.sh # Build + Run (default)
./run.sh build # Apenas build
./run.sh test # Rodar testes
./run.sh test-v # Rodar testes (verbose)Base URL: http://localhost:1313/v1
API Key: qualquer valor (ex: "gateway")
Modelo: qualquer (o gateway substitui pelo modelo do provedor se necessário)
Warning
Atenção usuários do Claude Code: O Claude Code utiliza o formato de mensagens da Anthropic (/v1/messages). Como o AI-gatiator atua como um proxy transparente (não traduz payload), ele repassa a requisição exatamente neste formato. APIs puras como Google, Groq e Cerebras não entendem esse formato e retornarão 404.
Para usar o Claude Code, você deve habilitar o OpenRouter no AI-gatiator ("enabled": true), pois os servidores do OpenRouter possuem um tradutor universal que converte o formato da Anthropic para o formato nativo de qualquer modelo gratuito (ex: google/gemini-2.5-flash, groq/llama-3.3-70b-versatile).
| Método | Path | Descrição |
|---|---|---|
| POST | /v1/chat/completions | Completions com fallback |
| GET | /v1/models | Lista todos os modelos |
| GET | /health | Status de cada provedor |
- Provedores são tentados em ordem de
priority(menor = primeiro) - Se você configurou múltiplas chaves em um provedor usando
"api_keys": ["chave1", "chave2"]ou"api_keys_string": "chave1,chave2", o gateway testará a chave 1 com todos os modelos configurados. Se falhar (ex: Rate Limit 429), testará a chave 2 com todos os modelos, e assim por diante. - Se todas as chaves e modelos de um provedor falharem, ele tenta o próximo provedor.
- Após falha, a chave específica do provedor fica em cooldown progressivo (30s, 60s, 120s...)
- Após sucesso, o contador de falhas daquela chave é zerado
- Se o modelo solicitado não existir no provedor, usa o
default_model
Você não precisa mais atualizar os modelos manualmente no seu config.json! O AI-gatiator possui um comando especial para conectar na API dos provedores ativos e atualizar os modelos:
./AI-gatiator --update-modelsEle também é esperto: no OpenRouter, ele filtra e baixa apenas os modelos gratuitos! 😻
Para que o AI-gatiator inicie automaticamente com o sistema e rode em segundo plano (background) de forma robusta, você pode instalá-arlo como um serviço do systemd:
sudo ./AI-gatiator --install-serviceIsso criará o serviço, ativará o autostart no boot e já começará a rodar o gateway!
Para ver os logs depois da instalação, use: journalctl -u aigatiator -f
O Claude Code pode ser facilmente configurado utilizando um script local ou variáveis de ambiente antes de iniciá-lo:
# Configura o Claude Code para usar o AI-gatiator localmente
export ANTHROPIC_BASE_URL="http://127.0.0.1:1313/v1/"
export ANTHROPIC_API_KEY="AI-gatiator"
claudePara configurar o Hermes Agent, você deve editar o arquivo de configuração dele (ex: config.yaml). Adicione o seu modelo gratuito e aponte para o gateway conforme o exemplo abaixo:
model:
default: google/gemini-2.5-flash-preview-04-17:free
provider: custom
base_url: http://localhost:1313/v1
context_length: 131072
providers: {}
fallback_providers: []
credential_pool_strategies: {}curl http://localhost:1313/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer qualquer" \
-d '{
"model": "llama-3.3-70b-versatile",
"messages": [{"role": "user", "content": "Olá!"}]
}'from openai import OpenAI
client = OpenAI(
base_url="http://localhost:1313/v1",
api_key="qualquer"
)
resp = client.chat.completions.create(
model="llama-3.3-70b-versatile",
messages=[{"role": "user", "content": "Olá!"}]
)
print(resp.choices[0].message.content)curl http://localhost:1313/health- Habilite apenas os provedores que você tem chave:
"enabled": false - Para usar Ollama local: inicie o Ollama normalmente e habilite o provedor
ollama - O header
X-Gateway-Providerna resposta indica qual provedor foi usado - Streaming funciona automaticamente (o gateway faz proxy do stream) 😻
- Múltiplas chaves: Você pode especificar múltiplas chaves de duas formas:
- Array JSON:
"api_keys": ["chave1", "chave2", "chave3"] - String separada por vírgulas:
"api_keys_string": "chave1,chave2,chave3"(mais prático para variáveis de ambiente!)
- Array JSON:
Cada provedor pode ter um limite máximo de requisições simultâneas com max_concurrent:
{
"name": "ollama",
"enabled": true,
"priority": 10,
"max_concurrent": 2,
"base_url": "http://localhost:11434/v1"
}| max_concurrent | Comportamento |
|---|---|
0 ou não especificado |
Ilimitado - todas as requisições vão em paralelo |
1 |
Serial - uma requisição por vez (ótimo para Ollama local) |
n |
Permite até n requisições simultâneas |
Quando um provedor atinge seu limite de concorrência:
- O gateway marca o provedor como "bloqueado temporariamente"
- Passa automaticamente para o próximo provedor disponível
- Após ~5 segundos, o provedor bloqueado é re-testado automaticamente
Isso é ideal para:
- Ollama local: Limita a 1 para evitar sobrecarga
- Provedores com rate limit: Combina
max_concurrentcom fallback para cloud - Balanceamento de carga: Distribui requisições entre múltiplos provedores