← Blog

10 de outubro de 2026

Cascata de IAs com circuit breaker: bot que não fica mudo

Como meus bots usam vários provedores de IA em sequência e param de insistir em quem está fora do ar.

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.

Curtiu? Esse tipo de conversa rola todo dia na Codraise.

Conhecer a comunidade →
visitante@francodes.dev: ~
❯