DesarrolloAvanzado40 min
Computer Vision con Claude
Análisis de imágenes · OCR · extracción de datos · visión multimodal
VisionOCRImágenes
✓ Guía gratuita · Acceso completo
Mapa rápido · salta al paso que te interese
01
Enviar imágenes a Claude
Claude acepta imágenes en base64 o por URL. Soporta JPEG, PNG, GIF, y WebP. Límite: 20MB por imagen, máximo 20 imágenes por request.
lib/vision/analyze.ts
import Anthropic from '@anthropic-ai/sdk'
import fs from 'fs'
const anthropic = new Anthropic()
// Opción 1: desde archivo local
export async function analyzeLocalImage(imagePath: string, prompt: string) {
const imageBuffer = fs.readFileSync(imagePath)
const base64 = imageBuffer.toString('base64')
const mediaType = imagePath.endsWith('.png') ? 'image/png' : 'image/jpeg'
const response = await anthropic.messages.create({
model: 'claude-sonnet-4-20250514',
max_tokens: 1024,
messages: [{
role: 'user',
content: [
{
type: 'image',
source: { type: 'base64', media_type: mediaType, data: base64 },
},
{ type: 'text', text: prompt },
],
}],
})
return response.content[0].type === 'text' ? response.content[0].text : ''
}
// Opción 2: desde URL
export async function analyzeImageUrl(imageUrl: string, prompt: string) {
const response = await anthropic.messages.create({
model: 'claude-sonnet-4-20250514',
max_tokens: 1024,
messages: [{
role: 'user',
content: [
{ type: 'image', source: { type: 'url', url: imageUrl } },
{ type: 'text', text: prompt },
],
}],
})
return response.content[0].type === 'text' ? response.content[0].text : ''
}02
OCR inteligente con estructura
lib/vision/ocr.ts
import { analyzeLocalImage } from './analyze'
export async function extractTextStructured(imagePath: string) {
const prompt = `Extrae todo el texto visible en esta imagen.
Devuelve JSON con esta estructura:
{
"rawText": "todo el texto tal cual aparece",
"structured": {
"title": "si hay título principal",
"sections": [{ "heading": "...", "content": "..." }],
"lists": [["item1", "item2"]],
"tables": [{ "headers": [...], "rows": [[...]] }]
},
"metadata": {
"language": "es|en|...",
"documentType": "factura|carta|formulario|otro",
"confidence": 0.0-1.0
}
}`
const result = await analyzeLocalImage(imagePath, prompt)
return JSON.parse(result)
}03
Procesador de facturas
lib/vision/invoice-processor.ts
import { analyzeLocalImage } from './analyze'
import { z } from 'zod'
const InvoiceSchema = z.object({
vendor: z.object({
name: z.string(),
address: z.string().optional(),
taxId: z.string().optional(),
}),
customer: z.object({
name: z.string(),
address: z.string().optional(),
}),
invoiceNumber: z.string(),
date: z.string(),
dueDate: z.string().optional(),
lineItems: z.array(z.object({
description: z.string(),
quantity: z.number(),
unitPrice: z.number(),
total: z.number(),
})),
subtotal: z.number(),
tax: z.number(),
total: z.number(),
currency: z.string(),
})
export async function processInvoice(imagePath: string) {
const prompt = `Analiza esta factura y extrae todos los datos.
Devuelve JSON con: vendor, customer, invoiceNumber, date, dueDate, lineItems (array con description, quantity, unitPrice, total), subtotal, tax, total, currency.
Solo JSON, sin explicaciones.`
const result = await analyzeLocalImage(imagePath, prompt)
const parsed = JSON.parse(result)
// Validar con Zod
return InvoiceSchema.parse(parsed)
}Tip Pro
Para facturas en producción, combina vision con validación de datos. Flaggea automáticamente las que tengan baja confianza para revisión humana.
¿Quieres el sistema completo?
500+ páginas, 25 capítulos, código de producción, acceso a todas las guías del Arsenal.
Curso Completo · €29PayPal · Acceso inmediato