LocalRouter: Roteador Local Opensource Para APIs de IA
Quantas vezes você estava no meio daquele teste perfeito de uma nova feature de IA e tomou um erro 429 de "Rate limit reached"?
Semana passada eu perdi a paciência tendo que trocar o provedor de API manualmente só para a aplicação voltar a responder.
Foi caçando uma saída que desenvolvi o LocalRouter.
Ele é um gateway feito em PHP puro, que cria um endpoint único para suas LLMs e faz rotação automática entre provedores quando um falha.
Feito para aproveitar ao máximo as cotas diárias gratuitas da NVIDIA, Groq, OpenRouter e Cerebras.
Como a mágica acontece
O setup não tem frescuras. Não precisa de Composer, containers Docker pesados ou builds demorados — só o PHP 8.0+ que a maioria de nós já tem na máquina.
Você baixa o projeto e sobe o servidor embutido: php -S localhost:8000 (ou roda no XAMPP/WAMP)
No arquivo config.php, você cadastra seus provedores, modelos e junta as chaves de cada um para um mesmo modelo lógico.
Aponte seu app (usando qualquer SDK padrão OpenAI), agente de IA ou IDE para http://localhost:8000/chat/completions.
Se o seu app fizer a requisição abaixo e o provedor principal cair ou negar por falta de créditos, o roteador pula para o próximo da fila na mesma hora, e o app nem percebe a troca:
`
curl http://localhost:8000/chat/completions \
-H "Authorization: Bearer SUA_CHAVE_DO_GATEWAY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-oss-120b",
"messages": [{"role": "user", "content": "Qual o sentido da vida?"}]
}'
`
Por que vale o espaço na sua máquina?
Você envia requisições no formato padrão OpenAI e o gateway traduz por baixo dos panos para a API. Comparado a subir gateways corporativos complexos, o LocalRouter resolve a dor do dev de forma muito limpa.
Além disso, se a conexão cair no meio de um streaming de texto, ele pega o que já foi gerado, injeta como contexto no próximo provedor e pede para continuar exatamente de onde parou.
*Um ponto de atenção: O único detalhe é que, focado em manter a simplicidade extrema, ele não guarda estado por padrão (um provedor esgotado será tentado novamente na próxima requisição, a menos que você ative a flag de COOLDOWN_SECONDS para deixá-lo "de castigo"). *
Quem quiser testar, o projeto tem licença MIT e está lá no meu GitHub: gmasson/localrouter.