fix(secretaria): fallback resiliente a erros de rede no callAI

isRecoverableError inclui fetch failed/timeout/econnreset/etimedout/und_err —
um blip de rede no primeiro provider agora cai para o próximo da chain (openai→
gemini→anthropic→ollama) em vez de virar "[Erro ao chamar IA: fetch failed]".

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
VPS 4 Deploy Agent
2026-07-01 20:55:22 +02:00
parent a1eec8dac2
commit 007c300cb0
4 changed files with 24 additions and 4 deletions
@@ -463,7 +463,17 @@ class ProtocolEngine {
msg.includes('invalid_api_key') || msg.includes('invalid_api_key') ||
msg.includes('econnrefused') || msg.includes('econnrefused') ||
msg.includes('enotfound') || msg.includes('enotfound') ||
msg.includes('não configurada')); msg.includes('não configurada') ||
// Erros de rede transitórios — devem cair para o próximo provider da chain,
// não abortar a resposta (era o que gerava "[Erro ao chamar IA: fetch failed]").
msg.includes('fetch failed') ||
msg.includes('timeout') ||
msg.includes('timed out') ||
msg.includes('aborted') ||
msg.includes('econnreset') ||
msg.includes('etimedout') ||
msg.includes('und_err') ||
msg.includes('socket hang up'));
} }
async callAI(agent, systemPrompt, messages) { async callAI(agent, systemPrompt, messages) {
const cfg = await this.config.get('secretaria'); const cfg = await this.config.get('secretaria');
File diff suppressed because one or more lines are too long
@@ -482,7 +482,17 @@ export class ProtocolEngine {
msg.includes('invalid_api_key') || msg.includes('invalid_api_key') ||
msg.includes('econnrefused') || msg.includes('econnrefused') ||
msg.includes('enotfound') || msg.includes('enotfound') ||
msg.includes('não configurada') msg.includes('não configurada') ||
// Erros de rede transitórios — devem cair para o próximo provider da chain,
// não abortar a resposta (era o que gerava "[Erro ao chamar IA: fetch failed]").
msg.includes('fetch failed') ||
msg.includes('timeout') ||
msg.includes('timed out') ||
msg.includes('aborted') ||
msg.includes('econnreset') ||
msg.includes('etimedout') ||
msg.includes('und_err') ||
msg.includes('socket hang up')
) )
} }
File diff suppressed because one or more lines are too long