Atualização (outubro/2026): hoje os bots da Codraise rodam 100% com IA local (Llama via Ollama, na minha própria máquina). Nenhuma conversa da comunidade sai do servidor e não existe mais cota de API pra estourar. Deixo este post como registro de como era antes, e porque a ideia de circuit breaker continua valendo pra qualquer dependência externa.
Bot com IA conversando com uma comunidade inteira tem um problema simples: provedor de IA cai. Às vezes é limite de uso, às vezes instabilidade, às vezes a chave expirou. Se o bot depende de um provedor só, ele fica mudo.
A solução que eu usava nos bots da Codraise era uma cascata.
A cascata
Em vez de chamar um provedor, o bot tenta uma lista em ordem. Se o primeiro falhar, vai pro segundo, e assim por diante:
PROVEDORES = [groq, gemini, cerebras, openrouter]
async def responder(prompt):
for provedor in PROVEDORES:
try:
return await provedor(prompt)
except Exception:
continue
return None # todo mundo fora: o bot avisa em vez de inventar
Funciona, mas tem uma falha escondida.
O problema: insistir em quem já caiu
Se o primeiro provedor está fora por uma hora, toda mensagem tenta ele primeiro, espera o timeout e só depois vai pro próximo. O bot fica lento justo quando mais precisa ser rápido, e eu chamava isso de “bot zumbi”: vivo, mas arrastado.
O circuit breaker
A ideia vem da engenharia elétrica: quando algo dá errado, o disjuntor abre e para de mandar corrente por um tempo.
import time
_fora_ate = {} # provedor -> horário em que pode tentar de novo
async def responder(prompt):
agora = time.time()
for provedor in PROVEDORES:
if _fora_ate.get(provedor, 0) > agora:
continue # disjuntor aberto: nem tenta
try:
return await provedor(prompt)
except LimiteDeUso:
_fora_ate[provedor] = agora + 3600 # cota acabou: 1h de descanso
except Exception:
_fora_ate[provedor] = agora + 120 # erro qualquer: 2 min
return None
Agora, quando um provedor cai, só uma mensagem paga o preço do timeout. As seguintes já pulam direto pro próximo da fila.
O que eu aprendi
- Diferencie os erros. Cota estourada não volta em 2 minutos; instabilidade às vezes volta. Tempo de descanso diferente pra cada caso.
- Falhe com honestidade. Se todo mundo caiu, o bot avisa que está sem cérebro no momento. Inventar resposta é pior do que ficar quieto.
- Segurança das chaves. As chaves ficam em
.env, fora do código e do Git. Bot com IA é alvo: chave vazada vira conta alta de outra pessoa.
Resiliência não é evitar que as coisas quebrem. É fazer o sistema continuar útil quando elas quebram.
