Let's Build: analizador de facturas con IA en Transloadit
Las facturas son un flujo de trabajo central para los equipos de finanzas, pero extraer los campos a mano es lento y propenso a errores. En este Let's Build, crearemos un pequeño servicio de análisis de facturas con las primitivas de Transloadit: enrutar archivos, normalizar formatos y solicitar JSON estructurado a la IA.
Qué vamos a construir
- Aceptar cualquier formato de factura (PDF, DOCX, imagen)
- Convertir a PDF los archivos que no lo sean con 🤖 /document/convert
- Extraer campos estructurados con 🤖 /ai/chat (English)
Primero el esquema (zod)
Usaremos Zod para definir el esquema de la factura y pasar el JSON Schema al Step de IA. Así la salida se mantiene predecible.
import { z } from 'zod'
import { zodToJsonSchema } from 'zod-to-json-schema'
const invoiceSchema = z.object({
vendor_name: z.string().optional(),
invoice_number: z.string().optional(),
invoice_date: z.string().optional(),
due_date: z.string().optional(),
currency: z.string().optional(),
subtotal: z.number().optional(),
tax: z.number().optional(),
total: z.number().optional(),
line_items: z
.array(
z.object({
description: z.string().optional(),
quantity: z.number().optional(),
unit_price: z.number().optional(),
total: z.number().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 invoiceJsonSchema = toJsonSchema(invoiceSchema)
Descripción general del pipeline
PDF invoices ──▶ /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_invoice: {
robot: '/ai/chat',
use: ['pdf_verified', 'pdf_converted'],
model: 'anthropic/claude-4-sonnet-20250514',
format: 'json',
schema: JSON.stringify(invoiceJsonSchema),
messages: 'Extract invoice 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/invoice-parser/run.ts
Entradas de ejemplo
Usa las muestras incluidas o sustitúyelas por tus propios PDF de facturas para las capturas de pantalla:
_assets/demos/inputs/scan.pdf_assets/demos/inputs/first_document.pdf_assets/demos/inputs/second_document.pdf
Próximos pasos
- Añade la normalización multimoneda en tu capa de aplicación.
- Guarda los resultados en tu base de datos y añade colas de revisión humana.
- Amplía el esquema para admitir múltiples proveedores y configuraciones regionales.
