Renderz.Studio
El Arsenal
DesarrolloAvanzado40 minGratis

Computer Vision con Claude

Análisis de imágenes · OCR · extracción de datos · visión multimodal

VisionOCRImágenes
Guía gratuita · Acceso completo
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
¿Hablamos?