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.
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.