Let's Build: analizador de currículums con IA en Transloadit
El análisis de currículums es un problema clásico del SaaS: tomar documentos reales y desordenados y extraer campos estructurados que alimenten los pipelines de ATS. Con Transloadit, puedes construir ese flujo de trabajo a partir de primitivas en una sola Assembly.
Qué vamos a construir
- Aceptar currículums en PDF, DOCX o imagen
- Convertir a PDF los archivos que no lo sean con 🤖 /document/convert
- Extraer campos con 🤖 /ai/chat (English)
Primero el esquema (zod)
import { z } from 'zod'
import { zodToJsonSchema } from 'zod-to-json-schema'
const resumeSchema = z.object({
full_name: z.string().optional(),
headline: z.string().optional(),
email: z.string().optional(),
phone: z.string().optional(),
location: z.string().optional(),
summary: z.string().optional(),
skills: z.array(z.string()).optional(),
work_experience: z
.array(
z.object({
company: z.string().optional(),
title: z.string().optional(),
start_date: z.string().optional(),
end_date: z.string().optional(),
highlights: z.array(z.string()).optional(),
}),
)
.optional(),
education: z
.array(
z.object({
institution: z.string().optional(),
degree: z.string().optional(),
start_date: z.string().optional(),
end_date: z.string().optional(),
}),
)
.optional(),
})
const toJsonSchema = (schema: z.ZodTypeAny): unknown =>
typeof (z as { toJSONSchema?: typeof zodToJsonSchema }).toJSONSchema === 'function'
? (z as { toJSONSchema: typeof zodToJsonSchema }).toJSONSchema(schema)
: zodToJsonSchema(schema)
const resumeJsonSchema = toJsonSchema(resumeSchema)
Descripción general del pipeline
PDF resumes ──▶ /ai/chat
Other docs ──▶ /document/convert (pdf) ──▶ /ai/chat
Fragmento de Assembly
const assembly = await transloadit.createAssembly({
params: {
steps: {
pdf_verified: {
robot: '/file/filter',
use: ':original',
accepts: [['${file.mime}', '==', 'application/pdf']],
},
non_pdf: {
robot: '/file/filter',
use: ':original',
accepts: [['${file.mime}', '!=', 'application/pdf']],
},
pdf_converted: {
robot: '/document/convert',
use: 'non_pdf',
format: 'pdf',
},
extract_resume: {
robot: '/ai/chat',
use: ['pdf_verified', 'pdf_converted'],
model: 'anthropic/claude-4-sonnet-20250514',
format: 'json',
schema: JSON.stringify(resumeJsonSchema),
messages: 'Extract resume fields. Omit keys if unknown.',
result: true,
},
},
},
files: {
document: filePath,
},
waitForCompletion: true,
})
Prueba la app de ejemplo
El script de ejemplo completo y las instrucciones de configuración están incluidos en este repositorio. Desde la raíz del repositorio, ejecuta:
node public/example_apps/resume-parser/run.ts
Entradas de ejemplo
Usa las muestras incluidas o sustitúyelas por un PDF de currículum real:
_assets/demos/inputs/first_document.pdf_assets/demos/inputs/second_document.pdf_assets/demos/inputs/scan.pdf
Próximos pasos
- Agrega una capa de normalización para números de teléfono y fechas.
- Marca los campos faltantes y envíalos a revisión manual.
- Guarda los resultados en una base de datos de talento o en un ATS.
