| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- 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);
- });
|