Asistente de búsqueda laboral potenciado por IA con arquitectura multi-agente. El sistema unifica tres tareas clave en un solo flujo: encontrar ofertas, analizar su ajuste técnico y optimizar el CV para mejorar la postulación.
- Frontend (Vercel): https://job-assistant-ai-tzle.vercel.app/
Buscar trabajo en tecnología suele ser un proceso manual y repetitivo:
- Revisar decenas de vacantes para detectar las que realmente encajan.
- Interpretar requisitos técnicos y seniority en poco tiempo.
- Adaptar el CV para cada oportunidad sin perder consistencia.
Job Assistant AI automatiza este pipeline con IA, entregando recomendaciones accionables para postular con mayor precisión.
┌──────────────────────────────┐
│ Frontend (React) │
│ Formulario + resultados + UI │
└───────────────┬──────────────┘
│ HTTP (REST)
▼
┌──────────────────────────────┐
│ Backend (FastAPI) │
│ /api/search (entrypoint) │
└───────────────┬──────────────┘
│
▼
┌──────────────────────────────────────────────────┐
│ JobAssistantOrchestrator │
│ coordina el flujo extremo a extremo │
├──────────────────────────────────────────────────┤
│ 1) ScraperAgent → obtiene ofertas reale │
│ · Adzuna API → Brasil │
│ · JSearch API → Argentina, Chile, Uruguay │
│ 2) AnalyzerAgent → LLM + JsonOutputParser │
│ (Groq + LangChain) │
│ 3) CVOptimizerAgent → RAG con FAISS + │
│ HuggingFace Embeddings │
│ + Groq (Llama 3.3) │
└──────────────────────────────────────────────────┘
│
▼
┌──────────────────────────────┐
│ Respuesta final al frontend │
│ top matches + optimización │
└──────────────────────────────┘
- Python 3.10+ para lógica de negocio y agentes.
- FastAPI para exponer endpoints de alto rendimiento.
- React + Vite para una UI ágil y moderna.
- TailwindCSS para estilos consistentes y rápidos de iterar.
- LangChain para orquestación de componentes de IA.
- LangGraph para el grafo de estados multi-agente con memoria persistente.
- Groq API para inferencia LLM en cloud (Llama 3 via tool calling).
- Adzuna API para obtención de ofertas reales.
- LangSmith para observabilidad, tracing y monitoreo del pipeline multi-agente.
El scraper enruta automáticamente según el país seleccionado:
| País | API | Fuente de datos |
|---|---|---|
| 🇧🇷 Brasil | Adzuna API | Ofertas reales del mercado brasileño |
| 🇦🇷 Argentina | JSearch (RapidAPI) | Google for Jobs · LinkedIn · Indeed AR · Jooble |
| 🇨🇱 Chile | JSearch (RapidAPI) | Google for Jobs · LinkedIn · Indeed CL |
| 🇺🇾 Uruguay | JSearch (RapidAPI) | Google for Jobs · LinkedIn · Indeed UY |
El sistema selecciona la API correcta automáticamente — el usuario solo elige el país en el formulario.
El sistema cuenta con tracing completo de todo el pipeline multi-agente usando LangSmith.
Cada ejecución del pipeline queda registrada con:
- Latencia por nodo — cuánto tarda cada agente de forma aislada.
- Tokens consumidos — por llamada al LLM y total del pipeline.
- Llamadas al LLM — input y output de cada invocación a Llama 3.3 via Groq.
- Metadata por request — keywords, location, user_ip.
- Tags por entorno —
api,production, nombre de la location. - Errores con contexto — qué nodo falló, cuántos jobs se encontraron, cuántos análisis se generaron.
git clone <REPO_URL>
cd job-assistant-aipython -m venv .venv
source .venv/bin/activate # Linux/macOS
# .venv\Scripts\activate # Windows PowerShell
pip install --upgrade pip
pip install fastapi uvicorn langchain langchain-community langchain-groq groq pypdf beautifulsoup4 requests python-dotenv python-multipart faiss-cpu langsmithEjecutar API:
cd backend
uvicorn api:app --host 0.0.0.0 --port 8000 --reloadEn otra terminal:
cd frontend
npm install
npm run dev -- --host 0.0.0.0 --port 5173Configurar frontend/.env:
VITE_API_URL=http://localhost:8000- Abre la UI en
http://localhost:5173(o la demo de Vercel). - Subí tu CV en formato PDF desde el formulario.
- Ingresá keywords del rol (ej:
Backend Developer). - Definí ubicación (ej:
Brasil). - Ejecutá la búsqueda.
- Vacantes ordenadas por match.
- Skills detectadas por oferta.
- Recomendaciones de optimización de CV.
GET /health→ estado del servicio.POST /api/search→ pipeline completo (scraper + analyzer + optimizer).
Ejemplo de request:
{
"keywords": "Backend Developer",
"location": "Argentina"
}El orquestador implementa un StateGraph con nodos, edges condicionales y memoria persistente:
scraper → analyzer → cv_optimizer → END
↓ ↓
error error (o retry si match_score < 20)
- Retry logic: si el score promedio es menor a 20, vuelve a buscar ofertas (máximo 3 intentos).
- Memoria persistente: usa
MemorySaverpara mantener el estado entre ejecuciones. - Control de errores: cada nodo tiene su propio manejo de excepciones con edge al nodo
error. - Observabilidad: cada nodo decorado con
@traceablepara tracing completo en LangSmith.
El CVOptimizerAgent implementa RAG (Retrieval-Augmented Generation) real:
- Carga el CV desde PDF con
PyPDFLoader. - Divide el texto en chunks con
RecursiveCharacterTextSplitter. - En cada análisis, busca los 3 chunks más relevantes para el trabajo.
- Pasa esos chunks al LLM (Groq Llama 3.3) para generar recomendaciones personalizadas.
El sistema enruta automáticamente según el mercado seleccionado:
- Brasil → Adzuna API (free tier oficial para Brasil)
- Argentina, Chile, Uruguay → JSearch via RapidAPI (Google for Jobs + LinkedIn + Indeed Latam)
Todos los datos son reales y en tiempo real. La demo en Vercel está completamente funcional.
El proyecto demuestra:
✅ Sistema multi-agente funcional con orquestador
✅ LLM con tool calling real via Groq + LangChain
✅ RAG real con FAISS + embeddings para análisis de CV
✅ Memoria persistente con LangGraph MemorySaver
✅ Retry logic y control de errores con edges condicionales
✅ Datos reales via Adzuna API en local y producción
✅ CV Optimizer con upload de CV en tiempo real
✅ Backend Python + FastAPI deployado en Railway
✅ Frontend React deployado en Vercel
✅ Integración end-to-end completa
APIs implementadas:
- Adzuna API ✅ Activo — Brasil
- JSearch via RapidAPI ✅ Activo — Argentina, Chile, Uruguay
Próximas integraciones:
- LinkedIn Jobs API oficial
- Indeed Publisher API
- Expansión a Colombia, México, Perú
Este proyecto demuestra:
- Arquitectura de sistemas complejos con múltiples componentes
- Integración de IA moderna ( LLMs, LangChain, LangGraph, RAG )
- Observabilidad production-grade con LangSmith tracing
- Cobertura multi-mercado Latam con enrutamiento inteligente por país
- Full-stack deployment en infraestructura cloud
- Diseño de APIs RESTful con FastAPI
- Frontend moderno con React + Vite
La capacidad de construir la arquitectura es más valiosa que el scraper en sí.
Para mantener una experiencia estable y evitar bloqueos en fuentes externas:
- Evita ejecuciones masivas o automatizadas en ráfaga.
- Espera algunos segundos entre búsquedas consecutivas.
- Limita pruebas de carga a entornos controlados.
- El plan gratuito de JSearch permite 200 requests/mes.
job-assistant-ai/
├── backend/
│ ├── agents/
│ │ ├── scraper_agent.py # Adzuna (Brasil) + JSearch (AR/CL/UY)
│ │ ├── analyzer_agent.py
│ │ └── cv_optimizer_agent.py
│ ├── api.py
│ └── orchestrator.py
├── frontend/
│ ├── src/
│ │ ├── App.jsx
│ │ ├── App.css
│ │ ├── index.css
│ │ └── main.jsx
│ ├── package.json
│ ├── tailwind.config.js
│ └── vite.config.js
└── README.mdAndres Vallarino
- GitHub: @AndyV01
- Portafolio: https://portfolio-nextjs-nine-lac.vercel.app/
Si te interesa colaborar o proponer mejoras, abre un issue o PR. 🚀