Loop do Agente & Recuperação de Erros
O loop agêntico central: receber mensagem, chamar LLM, executar ferramentas, iterar, responder.
Fluxo do Loop do Agente
- Persistir mensagem do usuário — armazenada com pontuação de importância
- Auto-rotear modelo — classificar complexidade da consulta (se não substituído manualmente)
- Construir prompt do sistema — prompt base + skills correspondentes + fatos conhecidos
- Recuperar contexto — recuperação de memória tri-híbrida
- Iterar (até
max_iterations):- Coletar memórias antigas fixadas + mensagens recentes (deduplicadas)
- Construir lista de mensagens no formato OpenAI
- Chamar LLM com recuperação classificada por erro
- Se houver chamadas de ferramentas → executar cada uma, persistir resultados, continuar loop
- Se não houver chamadas de ferramentas OU iteração final → retornar resposta em texto
- Máximo de iterações atingido → retornar mensagem de timeout
Orçamento Dinâmico de Iterações
O agente possui uma ferramenta integrada request_more_iterations que estende o orçamento do loop quando o limite atual é insuficiente:
- Estende o orçamento em 10 iterações por chamada
- Limite rígido impede extensão ilimitada (tipicamente 25 no total)
- Requer um parâmetro
reasonexplicando o que resta a ser feito - Usado quando o agente tem um plano claro mas ficaria sem iterações no meio da tarefa
Estratégia de Recuperação de Erros
O método call_llm_with_recovery classifica erros e responde de acordo:
| Tipo de Erro | Estratégia |
|---|---|
| Auth / Billing | Retornar imediatamente ao usuário — sem retry |
| Rate Limit | Aguardar retry_after_secs (limitado a 60s), tentar novamente uma vez |
| Timeout / Network / Server Error | Aguardar 2s, tentar novamente uma vez; em caso de falha, voltar ao modelo anterior |
| Not Found (modelo inválido) | Alternar imediatamente para modelo de fallback |
| Unknown | Propagar como erro |
Last Known Good
Após cada chamada bem-sucedida ao LLM, a configuração atual é salva como
config.toml.lastgood. Isso permite a recuperação automática de alterações ruins na configuração.Correção de Ordenação de Mensagens
Para satisfazer restrições entre provedores Gemini, Anthropic e OpenAI, o aidaemon executa uma correção de três passagens no histórico de mensagens antes de cada chamada ao LLM:
- Passagem 1: Mesclar mensagens consecutivas do mesmo papel (combina arrays de tool_calls)
- Passagem 2: Descartar resultados de ferramentas órfãos (sem tool_call correspondente do assistente) e remover tool_calls órfãos (sem resultado de ferramenta correspondente)
- Passagem 3: Mesclar novamente após a remoção de órfãos, que pode criar novas mensagens consecutivas do mesmo papel
Execução de Ferramentas
Durante o loop, cada chamada de ferramenta recebe:
_session_id— injetado automaticamente para rastreamento de sessão_untrusted_source— flag definida para sessões originadas por triggers
Detecção de Travamento & Repetição
O loop do agente inclui proteções contra travamentos:
- Detecção de travamento — se a mesma ferramenta for chamada 3+ vezes consecutivas com argumentos similares, o loop é interrompido
- Detecção de repetição — detecta texto de resposta repetido e força uma interrupção
- Limite rígido de iterações — padrão 10, extensível até 25 via
request_more_iterations
Tipos de Sessão
| Tipo de Sessão | Formato | Trusted |
|---|---|---|
| Chat do Telegram | Chat ID como string | Sim |
| Canal do Slack | slack:{channel_id} ou slack:{channel_id}:{thread_ts} | Sim |
| Canal do Discord | discord:{channel_id} | Sim |
| Trigger de email | email_trigger | Não |
| Trigger de evento | event_{uuid} | Não |
| Sub-agente | sub-{depth}-{uuid} | Herdado |