MandAPI
Español ▾
Evalúa y mejora

Extrae y valida campos de un texto de factura

Convierte texto aportado de una factura en un registro pequeño y validado.

Usa esta guía con tu asistente de programación

Leer las instrucciones
Crea un ejemplo de extracción de texto de factura usando Chat Completions normal de MandAPI. La entrada será texto ya extraído, no imágenes ni PDF. Solicita un registro JSON pequeño con importes como cadenas decimales, valida campos exactos y moneda explícita, y comprueba importes finitos y sumas. Deriva los datos incompletos o incoherentes a revisión. Añade pruebas locales; no hagas pagos ni prometas OCR, confianza calibrada u opciones de ScaleDown.
TXT

Empieza con texto que puedas revisar

Envía al modelo el texto ya extraído de una factura y solicita un registro pequeño. Esta receta no lee PDF, realiza OCR, localiza caracteres ni asigna puntuaciones de confianza. Si el documento original es una imagen, tu aplicación debe proporcionar y comprobar la extracción de texto por separado.

Utiliza el resultado como ayuda para una revisión. El registro generado no autoriza el pago de la factura. Conserva el texto original para resolver campos ausentes, impuestos ambiguos y símbolos de moneda.

Valida el registro devuelto

Pide JSON con número de factura, moneda, subtotal, impuesto y total. Solicita los importes como cadenas decimales y comprueba la estructura y las sumas en Python. Este ejemplo local completo interpreta una respuesta simulada del modelo; no llama a la API.

python
from decimal import Decimal, InvalidOperation
import json
import re

FIELDS = {"invoice_number", "currency", "subtotal", "tax", "total"}

def parse_invoice(text):
    value = json.loads(text)
    if not isinstance(value, dict) or set(value) != FIELDS:
        raise ValueError("Campos inesperados")
    if not all(isinstance(value[k], str) for k in FIELDS):
        raise ValueError("Los campos deben ser cadenas")
    if not value["invoice_number"].strip():
        raise ValueError("Falta el numero de factura")
    if not re.fullmatch(r"[A-Z]{3}", value["currency"]):
        raise ValueError("Indica una moneda de tres letras")
    try:
        amounts = [Decimal(value[k]) for k in ("subtotal", "tax", "total")]
    except InvalidOperation as error:
        raise ValueError("Importe decimal invalido") from error
    if any(not amount.is_finite() or amount < 0 for amount in amounts):
        raise ValueError("Importes finitos y no negativos")
    subtotal, tax, total = amounts
    if subtotal + tax != total:
        raise ValueError("Los totales requieren revision")
    return value

sample = '{"invoice_number":"DEMO-1","currency":"USD",' \
         '"subtotal":"100.00","tax":"16.00","total":"116.00"}'
print(parse_invoice(sample))

Añade la solicitud al modelo

Utiliza el cliente compatible con OpenAI y https://api.mandapi.com/v1, con MANDAPI_API_KEY y MANDAPI_MODEL_ID. Pide al modelo que trate el texto como datos y devuelva únicamente los campos especificados. Para información ausente, utiliza null o un resultado separado que pida revisión; no inventes importes. Este parser rechaza deliberadamente registros incompletos.

Comprueba el resultado

Prueba sumas incorrectas, monedas ambiguas, campos ausentes e importes no numéricos. Ajusta el esquema antes de aceptar descuentos, retenciones o facturas con impuestos incluidos. Que una suma coincida solo comprueba coherencia: no demuestra autenticidad ni una extracción correcta.

Referencias

Temas inspirados en documentación pública; instrucciones y ejemplos adaptados para MandAPI.