ingestarAtendimentosRag.js 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import { config } from "../src/config/index.js";
  2. import { ingestarPendentes, contarPendentesRag } from "../src/services/atendimentoRagService.js";
  3. const APLICAR = process.argv.includes("--apply");
  4. const loteIdx = process.argv.indexOf("--lote");
  5. const LOTE = loteIdx > -1 ? Number(process.argv[loteIdx + 1]) : config.atendimentosRag.batchSize;
  6. const setorIdx = process.argv.indexOf("--setor");
  7. const SETOR = setorIdx > -1 ? process.argv[setorIdx + 1] : null;
  8. const limiteIdx = process.argv.indexOf("--limite");
  9. const LIMITE = limiteIdx > -1 ? Number(process.argv[limiteIdx + 1]) : null;
  10. async function main() {
  11. const totalPendentes = await contarPendentesRag({ setor: SETOR });
  12. console.log(
  13. `[ingestar-atendimentos-rag] ${totalPendentes} atendimentos pendentes de indexação` +
  14. `${SETOR ? ` no setor ${SETOR}` : ""} (coleção: ${config.atendimentosRag.collection}).`
  15. );
  16. if (!APLICAR) {
  17. console.log("[ingestar-atendimentos-rag] dry-run (nenhuma alteração feita). Use --apply para executar.");
  18. process.exit(0);
  19. }
  20. if (totalPendentes === 0) {
  21. console.log("[ingestar-atendimentos-rag] nada para ingerir.");
  22. process.exit(0);
  23. }
  24. const alvo = LIMITE ? Math.min(LIMITE, totalPendentes) : totalPendentes;
  25. console.log(`[ingestar-atendimentos-rag] ingerindo até ${alvo} atendimentos, lotes de ${LOTE}${LIMITE ? ` (--limite ${LIMITE})` : ""}...`);
  26. let processados = 0;
  27. let totalIngeridos = 0;
  28. let totalSemConteudo = 0;
  29. const erros = [];
  30. const inicio = Date.now();
  31. while (processados < alvo) {
  32. const limiteLote = Math.min(LOTE, alvo - processados);
  33. const t0 = Date.now();
  34. const r = await ingestarPendentes({ limite: limiteLote, setor: SETOR });
  35. processados += r.pendentes;
  36. totalIngeridos += r.ingeridos;
  37. totalSemConteudo += r.semConteudo;
  38. erros.push(...r.erros);
  39. const restantes = await contarPendentesRag({ setor: SETOR });
  40. const segundosLote = (Date.now() - t0) / 1000;
  41. const ritmo = r.pendentes ? segundosLote / r.pendentes : 0;
  42. const etaMin = ritmo && restantes ? ((ritmo * restantes) / 60).toFixed(0) : "?";
  43. console.log(
  44. `[ingestar-atendimentos-rag] +${r.ingeridos} ingeridos, ${r.semConteudo} sem conteúdo, ${r.erros.length} erros ` +
  45. `(${segundosLote.toFixed(0)}s, ~${ritmo.toFixed(1)}s/atendimento) — restam ${restantes} (ETA ~${etaMin}min)`
  46. );
  47. if (r.erros.length) r.erros.slice(0, 3).forEach((e) => console.log(` erro: ${e.atendimentoId} ${e.erro}`));
  48. if (r.pendentes === 0) {
  49. console.log("[ingestar-atendimentos-rag] lote sem nenhum progresso, abortando para evitar loop infinito.");
  50. break;
  51. }
  52. }
  53. console.log(
  54. `[ingestar-atendimentos-rag] concluído em ${((Date.now() - inicio) / 1000 / 60).toFixed(1)}min: ` +
  55. `${totalIngeridos} ingeridos, ${totalSemConteudo} sem conteúdo, ${erros.length} erros.`
  56. );
  57. process.exit(erros.length ? 1 : 0);
  58. }
  59. main().catch((e) => {
  60. console.error("[ingestar-atendimentos-rag] falha:", e.message);
  61. process.exit(1);
  62. });