Alexei Rojas Quiroga
← Todos los proyectos

Proyecto personal

Servicio de Alertas de Job Bank

Buscador local de empleos: consulta Job Bank y puntúa ofertas contra tu CV con un LLM

Estado
En desarrollo
Rol
Individual: arquitectura, backend Python, frontend React, integración con LLM, testing

Arquitectura

  • Ingesta programada de ofertas
  • Filtros deterministas antes del LLM
  • Borradores con hechos bloqueados
  • Sin envío automático, por diseño
  • Local-first: SQLite + FastAPI

El programador conduce cada etapa en orden: ingesta desde Job Bank, puntuación de ofertas pendientes y envío de un resumen de matches sobre el umbral.

Arquitectura · 8 nodos · 1 flujos
LO QUE CONSTRUÍAPSchedulerProgramador desondeoJob por intervalo +corrida manual, lockúnicohttpx + parsersIngesta y parsingFetcher respetuoso,parsers de ofertasPython + LLMPipeline dematchingPre-filtros, scoringLLM, umbralesaiosmtplibServicio de alertasResumen por correosegún umbralPublic job feedCanada Job BankFeed de empleos ypáginas de ofertasOpenAI-compati…Modelo de lenguajePuntúa matches yredacta borradoresSQLiteBase de datos de laaplicaciónOfertas, matches, CV,caché, ajustesSMTPServidor SMTPEntrega de correos dealerta11. ejecuta la ingesta23456789
  • Servicio / cómputo
  • Almacén de datos
  • IA
  • Sistema externo
  • Síncrono
  • Asíncrono / bucle
Desplázate hacia los lados para ver todo el diagrama

Cómo fluye, paso a paso

Haz clic en un paso para saltar a él. Haz clic en un componente para ver detalles.

Qué hace

Servicio local que consulta Job Bank de Canadá, filtra ofertas según elegibilidad para candidatos internacionales y las puntúa contra un CV subido usando un LLM. Alerta por correo y panel, y prepara cartas y correos personalizados estrictamente como borradores. Un panel React gestiona filtros, ofertas, CV, borradores y ajustes.

El problema

Encontrar ofertas para las que un candidato internacional puede ser contratado es lento: muchas exigen autorización de trabajo y el matching genérico lo ignora. El servicio automatiza el descubrimiento y la puntuación sin postular nunca en nombre del usuario.

Qué construí

  • Un pipeline determinista de pre-filtros (autorización, ubicación, palabras clave) corre antes del LLM, de modo que las ofertas restrictivas se rechazan sin llamar al modelo y el costo se mantiene bajo.
  • Contrato robusto con el LLM: JSON validado con Pydantic, un re-prompt de reparación con el error, reintentos acotados en 429/5xx e identidad del empleo y versión de prompt inyectadas por el servidor.
  • Redacción con hechos bloqueados: cartas y correos se escriben a partir de una hoja numerada de hechos del CV y la oferta y luego se verifican para que el modelo no invente; cada párrafo muestra su procedencia en la UI.
  • Ingesta respetuosa: User-Agent descriptivo, GET condicional con ETag / Last-Modified persistido en SQLite, ritmo con jitter, backoff acotado y un lock de ejecución única en el scheduler.
  • Invariante estricta de que no existe ruta de envío de postulaciones: los borradores son solo enlaces mailto y copiar al portapapeles, con el contrato revisado en el esquema OpenAPI.
  • Contrato OpenAPI-first: los tipos del cliente se generan desde el esquema del backend, y el proyecto se entregó en cortes etiquetados con la suite de tests en verde en cada paso.

Decisiones clave y por qué

01

Local-first con SQLite

Los datos de un solo usuario (CV, matches) permanecen en la máquina, sin costo de hosting ni exposición a terceros; retención y borrado bajo demanda están incluidos.

02

Orden de filtros de barato a caro

Las verificaciones deterministas van primero y el LLM solo ve a las supervivientes, lo que ahorra costo y hace auditables y fail-closed las decisiones de elegibilidad.

03

Entrega solo como borrador

Postular automáticamente podría tergiversar al candidato; mantener a una persona en cada postulación es un límite de seguridad deliberado.

04

Generación de prosa con hechos bloqueados

Escritura natural sin alucinaciones: el modelo solo reorganiza hechos numerados y un verificador rechaza afirmaciones sin soporte.

05

Backend por capas con repositorios y contrato OpenAPI

Capas api, services, repositories y models mantienen la lógica testeable, y el esquema exportado mantiene sincronizado el frontend tipado.

Stack tecnológico

Lenguajes
Python 3.12
Backend
FastAPIAPSchedulerhttpxPydantic
Datos
SQLAlchemy + SQLite
Mensajería
aiosmtplib (SMTP)
Otros
pypdf / python-docx / ReportLab
IA
OpenAI-compatible LLM API
Frontend
React 18 + Vite + TypeScriptTanStack Queryopenapi-typescript
Pruebas
pytest + respxVitest + MSW
DevOps
ruff + mypy