import { config } from "../src/config/index.js"; import { ingestarPendentes, contarPendentesRag } from "../src/services/atendimentoRagService.js"; const APLICAR = process.argv.includes("--apply"); const loteIdx = process.argv.indexOf("--lote"); const LOTE = loteIdx > -1 ? Number(process.argv[loteIdx + 1]) : config.atendimentosRag.batchSize; const setorIdx = process.argv.indexOf("--setor"); const SETOR = setorIdx > -1 ? process.argv[setorIdx + 1] : null; const limiteIdx = process.argv.indexOf("--limite"); const LIMITE = limiteIdx > -1 ? Number(process.argv[limiteIdx + 1]) : null; async function main() { const totalPendentes = await contarPendentesRag({ setor: SETOR }); console.log( `[ingestar-atendimentos-rag] ${totalPendentes} atendimentos pendentes de indexação` + `${SETOR ? ` no setor ${SETOR}` : ""} (coleção: ${config.atendimentosRag.collection}).` ); if (!APLICAR) { console.log("[ingestar-atendimentos-rag] dry-run (nenhuma alteração feita). Use --apply para executar."); process.exit(0); } if (totalPendentes === 0) { console.log("[ingestar-atendimentos-rag] nada para ingerir."); process.exit(0); } const alvo = LIMITE ? Math.min(LIMITE, totalPendentes) : totalPendentes; console.log(`[ingestar-atendimentos-rag] ingerindo até ${alvo} atendimentos, lotes de ${LOTE}${LIMITE ? ` (--limite ${LIMITE})` : ""}...`); let processados = 0; let totalIngeridos = 0; let totalSemConteudo = 0; const erros = []; const inicio = Date.now(); while (processados < alvo) { const limiteLote = Math.min(LOTE, alvo - processados); const t0 = Date.now(); const r = await ingestarPendentes({ limite: limiteLote, setor: SETOR }); processados += r.pendentes; totalIngeridos += r.ingeridos; totalSemConteudo += r.semConteudo; erros.push(...r.erros); const restantes = await contarPendentesRag({ setor: SETOR }); const segundosLote = (Date.now() - t0) / 1000; const ritmo = r.pendentes ? segundosLote / r.pendentes : 0; const etaMin = ritmo && restantes ? ((ritmo * restantes) / 60).toFixed(0) : "?"; console.log( `[ingestar-atendimentos-rag] +${r.ingeridos} ingeridos, ${r.semConteudo} sem conteúdo, ${r.erros.length} erros ` + `(${segundosLote.toFixed(0)}s, ~${ritmo.toFixed(1)}s/atendimento) — restam ${restantes} (ETA ~${etaMin}min)` ); if (r.erros.length) r.erros.slice(0, 3).forEach((e) => console.log(` erro: ${e.atendimentoId} ${e.erro}`)); if (r.pendentes === 0) { console.log("[ingestar-atendimentos-rag] lote sem nenhum progresso, abortando para evitar loop infinito."); break; } } console.log( `[ingestar-atendimentos-rag] concluído em ${((Date.now() - inicio) / 1000 / 60).toFixed(1)}min: ` + `${totalIngeridos} ingeridos, ${totalSemConteudo} sem conteúdo, ${erros.length} erros.` ); process.exit(erros.length ? 1 : 0); } main().catch((e) => { console.error("[ingestar-atendimentos-rag] falha:", e.message); process.exit(1); });