jandresgarcia.dev
Rev. 2026.09

Cómo EApply adapta un CV a una oferta con un pipeline LLM multi-modelo, un motor ATS determinista y un validador de salida que no inventa nada.

AN-01

EApply Adapta un CV a una oferta con un LLM, sin inventar un solo dato.

Beta cerrada · eapply.jandresgarcia.dev ↗

Video 1. EApply, resumen del producto · 0:30

60 → 91

Ajuste ATS en una corrida real. Ninguna cifra del CV tocada.

Cómo funciona

  1. CV + oferta

Notas de ingeniería

  • Muestra un techo honesto, el mejor puntaje alcanzable sin inventar experiencia, en vez de un 100 falso.
  • Multi-modelo por diseño: un modelo rápido extrae, uno de calidad escribe, uno de visión lee escaneos y modelos juez califican el resultado.
  • Controles de producción: límites por modelo, presupuesto diario de IA y cada llamada trazada con su costo.

Pipeline LLMRuteo multi-modeloEvals con LLM juezGuardrails

Next.js · Fastify · Postgres · BullMQ · Redis · Typst · OpenTelemetry

Cómo funciona una corrida

  1. Pegas una oferta y subes un CV.
  2. La API valida la entrada, revisa créditos, encola el trabajo y abre un stream SSE en vivo.
  3. Un proceso worker separado toma el trabajo de la cola.
  4. Extracción, con un modelo de visión para PDFs escaneados. Cada llamada pasa por el router, los límites y el presupuesto diario.
  5. Un modelo rápido extrae las skills de la oferta y cada una se califica según cuánta prueba tiene el CV.
  6. El modelo de calidad reescribe el CV usando solo skills probadas.
  7. El validador de salida rechaza skills perdidas o afirmaciones sin sustento. Una regresión activa el fallback.
  8. El puntaje que ves lo calcula un motor determinista; nunca se toma del modelo.
  9. Typst genera el nuevo PDF y la corrida queda guardada.
  10. Cada etapa llegó al navegador en vivo, unos 40 segundos de punta a punta. Después, modelos juez califican el resultado en segundo plano.

Componentes del sistema

ComponenteQué hace
Web appNext.js 16 · React 19Código deterministaCarga, progreso en vivo, resultados e historial. Recibe cada estado del pipeline por SSE, con replay si se cae la conexión.
APIFastify · SSECódigo deterministaValida el PDF y la oferta, revisa créditos, encola el trabajo y abre el stream en vivo.
Cola de trabajosBullMQ · RedisCódigo deterministaProcesos worker separados con cola de errores, más colas para reportes de calidad, exportes y recordatorios.
Costo y límitesPresupuesto diario · TPM/RPMCódigo deterministaControl de admisión por modelo con carriles de prioridad y enfriamiento ante 429. Un presupuesto diario frena el gasto antes de que se dispare.
ParseTexto + OCR con visiónLlamada a modeloExtracción híbrida: texto primero, un modelo de visión como OCR de respaldo para CVs escaneados, y un LLM arma un CV canónico.
Evidencia de skillsCalificadas por pruebaLlamada a modeloUn LLM extrae las skills de la oferta; cada una se califica fuerte, atenuada o excluida según cuánta prueba tiene el CV.
Reescritura LLMReescribe sin inventarLlamada a modeloEl modelo de calidad reescribe el CV usando solo skills probadas. La salida estructurada escala del nivel rápido al de calidad si hay que repararla.
Validador de salidaHonestidad · preserva skillsCódigo deterministaChequeos deterministas rechazan skills perdidas y afirmaciones sin sustento antes de calificar. Una regresión de más de 5 puntos activa el fallback y reembolsa el crédito.
Motor de puntajePuntaje ATS deterministaCódigo deterministaEl modelo propone un puntaje, pero el número que se muestra sale de un motor determinista, junto con el techo honesto.
Router de modelosRápido · Calidad · Visión · JuezLlamada a modeloCada paso pide un nivel, no un modelo. El proveedor del writer se cambia por configuración sin tocar el pipeline.
Jueces de calidadLLM juez · chequeo de afirmacionesLlamada a modeloLentes asíncronos califican cada resultado (recruiter, ATS, probabilidad de entrevista) y un chequeo de implicación verifica cada afirmación. Evals nocturnas en CI.
Embeddings de skillsMatch de skills por vectoresPlaneadoSiguiente fase: embeddings locales para comparar skills por significado y no por nombre. Planeado, aún no construido.
Servicio de renderFastAPI · TypstCódigo deterministaUn microservicio en Python convierte el resultado en PDF en una de cinco plantillas.
Postgres · S3Corridas · historial · archivosDatosPostgres con Drizzle para corridas, créditos y el tracker; almacenamiento compatible con S3 con tokens de descarga firmados.
ObservabilidadOpenTelemetryCódigo deterministaTrazas con tokens y costo en cada llamada a modelo, más logs estructurados y alertas de presupuesto.

Disponibilidad

Abierto a roles senior de AI Engineer y Fullstack, y a construir productos de IA para founders.