Cómo consulta Firmín a Jev

Qué se envía a OpenRouter para reconocer los campos de un formulario, qué responde Jev y qué hace Firmín con la respuesta. Con dos consultas reales del banco de pruebas.

Jev

Jev (typesafe/jev-1.13; ahora responde typesafe/jev-1.13-20260917) es un modelo de TypeSafe al que Firmín llega a través de la Decisions API de OpenRouter:

POST https://openrouter.ai/api/alpha/decisions

No escribe texto. Recibe un contexto (state) y preguntas cerradas (questions), cada una con sus opciones y lo que significa cada una (criteria). Para cada pregunta devuelve la opción que elige y la probabilidad de cada opción. Firmín usa las probabilidades.

Para cada campo, dos preguntas:

Las dos respuestas dan una etiqueta, como titular.nif, domicilio.cp o firma.dia, con su probabilidad. Las opciones, con el texto que recibe Jev, están al final.

Cuándo se usa

Con Jev

  • La IA está encendida en Opciones; lo está salvo que la apagues.
  • Hay una clave de OpenRouter, tuya, en el llavero.

Con reglas, en el Mac

  • Sin clave, con la IA apagada o si OpenRouter no responde.
  • Miran el nombre del campo y el texto de al lado y de encima.
  • Todo lo proponen; nada se escribe solo.

De un formulario a las consultas

  1. Campos. Firmín lee los campos del PDF, o los dibuja si no tiene. Una fila de cajitas de un carácter (un NIF, un IBAN) cuenta como un campo. Cada campo tiene un número, el #N de las preguntas.
  2. Lotes. Los campos de cada página van de diez en diez. Cada lote es una consulta, y todas salen a la vez.
  3. Contexto. Cada consulta lleva los campos del lote, los que tienen cerca por encima y por debajo, y el resto de su apartado, que dice de quién es un bloque. En orden de lectura, hasta 80.
  4. Etiqueta. De todas las parejas de quién y qué que tienen sentido, Firmín se queda con la de mayor probabilidad: la de quién por la de qué. Firma e IBAN, por ejemplo, no tiene sentido.
  5. Reglas. Corrigen lo que Jev confunde: dos campos de «apellidos» en una línea son el primero y el segundo; en «En … a … de … de …», el orden dice cuál es el lugar, el día, el mes y el año.

La consulta

Lleva la clave en la cabecera Authorization: Bearer …. El cuerpo:

ClaveQué lleva
modeltypesafe/jev-1.13
state.documentoEl nombre del formulario y la tarea, en una frase.
state.campos_cercanosLos campos del contexto, descritos como en la tabla de abajo.
questionsquien_N y que_N de cada campo del lote, de tipo choice.
provider{"data_collection": "deny"}: OpenRouter solo usa proveedores que no guardan los datos.

De cada campo se envía:

ClaveQué es
campo, pagina, tipoEl número, la página y si es texto, casilla o lista.
posicionDónde está en la página, en puntos.
nombre_internoEl nombre que tiene el campo en el PDF.
texto_izquierda, texto_encima, texto_derechaEl texto impreso junto al campo.
texto_mas_arriba, rotulos_encima, cabecera, apartadoLos títulos del bloque en el que está.
tooltip, valor_casilla, max_caracteres, cajitasSi el PDF los tiene.

No se envían tus datos, tu certificado, lo que se va a escribir, lo que ya tiene escrito el formulario ni el PDF.

La respuesta

En answers, una entrada por pregunta: choice, la opción elegida; probabilities, la de cada opción; y confidence. En usage, los tokens y el coste en dólares. Si OpenRouter no responde con un 200, los campos de ese lote se quedan sin etiqueta.

Con la probabilidad de la etiqueta, Firmín decide:

ProbabilidadQué hace
90 % o máslo escribe Con el 80 % basta para el nombre de pila, el municipio y el día, el mes y el año de la firma, que Jev acierta más a igual probabilidad.
Del 50 % al 90 %lo propone Va si lo confirmas.
Menos del 50 %en blanco El nombre del representante necesita un 70 % para proponerse.

Los datos del banco se proponen siempre. Si un dato sale dos veces (el NIF, el código postal), solo el primero se escribe solo: el segundo suele ser de otra persona.

Ejemplo: la fecha de la firma

Formulario instancia-algeciras, del 2026-10-08. 4639 tokens de entrada y 1503 de salida: 0,00017 € (0,000195 US$).

Se pregunta por los campos #21 y #22, en la línea «En Algeciras, a ___ de ___ de 20___». Van como contexto el #19, de su apartado, y el #20, que está en la misma línea.

Lo que se envía

{
  "model": "typesafe/jev-1.13",
  "state": {
    "documento": "Formulario administrativo español «instancia-algeciras». Hay que decidir, para cada campo, de quién es el dato que va en él y qué dato es.",
    "campos_cercanos": [
      {
        "campo": "#19",
        "texto_mas_arriba": "3 DOCUMENTACIÓN QUE APORTA",
        "nombre_interno": "Documentación",
        "posicion": "x=52 y=188 (y mayor = más arriba)",
        "pagina": 1,
        "cabecera": "3 DOCUMENTACIÓN QUE APORTA",
        "rotulos_encima": [
          "3 DOCUMENTACIÓN QUE APORTA"
        ],
        "tipo": "texto"
      },
      {
        "tipo": "texto",
        "posicion": "x=108 y=78 (y mayor = más arriba)",
        "campo": "#20",
        "nombre_interno": "Día",
        "texto_izquierda": "En Algeciras, a",
        "texto_derecha": "de de",
        "pagina": 1
      },
      {
        "nombre_interno": "Mes",
        "tipo": "texto",
        "campo": "#21",
        "pagina": 1,
        "texto_izquierda": "En Algeciras, a de",
        "posicion": "x=179 y=78 (y mayor = más arriba)",
        "texto_derecha": "de 20"
      },
      {
        "texto_izquierda": "a de de 20",
        "campo": "#22",
        "nombre_interno": "Año",
        "tipo": "texto",
        "posicion": "x=300 y=78 (y mayor = más arriba)",
        "pagina": 1
      }
    ]
  },
  "questions": {
    "quien_21": {
      "type": "choice",
      "instructions": "¿De quién es el dato que va en el campo #21?",
      "criteria": { las 6 opciones de «quién», abajo }
    },
    "que_21": {
      "type": "choice",
      "instructions": "¿Qué dato va en el campo #21?",
      "criteria": { las 75 opciones de «qué», abajo }
    },
    "quien_22": {
      "type": "choice",
      "instructions": "¿De quién es el dato que va en el campo #22?",
      "criteria": { las 6 opciones de «quién», abajo }
    },
    "que_22": {
      "type": "choice",
      "instructions": "¿Qué dato va en el campo #22?",
      "criteria": { las 75 opciones de «qué», abajo }
    }
  },
  "provider": {
    "data_collection": "deny"
  }
}

Lo que responde Jev

{
  "id": "gen-dec-1791441524-HT2uMZ71eRyFzdYW75K9",
  "model": "typesafe/jev-1.13-20260917",
  "provider": "TypeSafe",
  "answers": {
    "quien_21": {
      "type": "choice",
      "choice": "firma",
      "probabilities": {
        "firma": 0.96,
        "titular": 0.04
      },
      "confidence": 0.95
    },
    "que_21": {
      "type": "choice",
      "choice": "mes",
      "probabilities": {
        "mes": 1
      },
      "confidence": 1
    },
    "quien_22": {
      "type": "choice",
      "choice": "firma",
      "probabilities": {
        "firma": 0.91,
        "nadie": 0.01,
        "titular": 0.07,
        "tramite": 0.01
      },
      "confidence": 0.89
    },
    "que_22": {
      "type": "choice",
      "choice": "anio",
      "probabilities": {
        "anio": 1
      },
      "confidence": 1
    }
  },
  "usage": {
    "input_tokens": 4639,
    "output_tokens": 1503,
    "cost": 0.000194838
  }
}

Lo que hace Firmín

CampoQuién y qué, según JevEtiquetaComo personaComo empresa
#21En Algeciras, a defirma 96 %
mes 100 %
firma.mes96 %lo escribe«octubre»lo escribe«octubre»
#22a de de 20firma 91 %
anio 100 %
firma.anio91 %lo escribe«2026»lo escribe«2026»

Los dos son de la firma, con más del 80 %, y Firmín escribe el mes y el año del día en que firmas, como persona y como empresa.

Ejemplo: el representante y un campo dudoso

Formulario espacios-culturales-valencia, página 2, del 2026-10-08. 6644 tokens de entrada y 2263 de salida: 0,000243 € (0,000279 US$).

Una declaración responsable con el nombre y el DNI del representante, y un campo detrás de «València,» que es la fecha de la firma.

Lo que se envía

{
  "model": "typesafe/jev-1.13",
  "state": {
    "documento": "Formulario administrativo español «espacios-culturales-valencia». Hay que decidir, para cada campo, de quién es el dato que va en él y qué dato es.",
    "campos_cercanos": [
      {
        "posicion": "x=39 y=753 (y mayor = más arriba)",
        "tipo": "texto",
        "pagina": 2,
        "texto_mas_arriba": "4 Declaració responsable / Declaración responsable Nom i cognoms de la persona representant / Nombre y apellidos de la persona representante DNI-NIE-PAS.",
        "cabecera": "DNI-NIE-PAS.",
        "nombre_interno": "representant",
        "texto_encima": "Nom i cognoms de la persona representant / Nombre y apellidos de la persona repr",
        "campo": "#30",
        "rotulos_encima": [
          "DNI-NIE-PAS."
        ]
      },
      {
        "tipo": "texto",
        "posicion": "x=450 y=753 (y mayor = más arriba)",
        "texto_mas_arriba": "DNI-NIE-PAS.",
        "pagina": 2,
        "rotulos_encima": [
          "DNI-NIE-PAS."
        ],
        "nombre_interno": "dni-nie-pas",
        "texto_encima": "DNI-NIE-PAS.",
        "campo": "#31",
        "cabecera": "DNI-NIE-PAS."
      },
      {
        "pagina": 2,
        "tipo": "texto",
        "texto_mas_arriba": "ón de datos",
        "nombre_interno": "Data3",
        "texto_izquierda": "çant correu electrò- litat de responsable, per a la finalitat indicada València,",
        "posicion": "x=414 y=165 (y mayor = más arriba)",
        "campo": "#32"
      }
    ]
  },
  "questions": {
    "quien_30": {
      "type": "choice",
      "instructions": "¿De quién es el dato que va en el campo #30?",
      "criteria": { las 6 opciones de «quién», abajo }
    },
    "que_30": {
      "type": "choice",
      "instructions": "¿Qué dato va en el campo #30?",
      "criteria": { las 75 opciones de «qué», abajo }
    },
    "quien_31": {
      "type": "choice",
      "instructions": "¿De quién es el dato que va en el campo #31?",
      "criteria": { las 6 opciones de «quién», abajo }
    },
    "que_31": {
      "type": "choice",
      "instructions": "¿Qué dato va en el campo #31?",
      "criteria": { las 75 opciones de «qué», abajo }
    },
    "quien_32": {
      "type": "choice",
      "instructions": "¿De quién es el dato que va en el campo #32?",
      "criteria": { las 6 opciones de «quién», abajo }
    },
    "que_32": {
      "type": "choice",
      "instructions": "¿Qué dato va en el campo #32?",
      "criteria": { las 75 opciones de «qué», abajo }
    }
  },
  "provider": {
    "data_collection": "deny"
  }
}

Lo que responde Jev

{
  "id": "gen-dec-1791441521-vvJ8urnwisP7ZZiBiJhG",
  "model": "typesafe/jev-1.13-20260917",
  "provider": "TypeSafe",
  "answers": {
    "quien_30": {
      "type": "choice",
      "choice": "representante",
      "probabilities": {
        "representante": 0.99,
        "titular": 0.01
      },
      "confidence": 0.99
    },
    "que_30": {
      "type": "choice",
      "choice": "nombre_completo",
      "probabilities": {
        "nombre_completo": 0.99,
        "persona_contacto": 0.01
      },
      "confidence": 0.99
    },
    "quien_31": {
      "type": "choice",
      "choice": "representante",
      "probabilities": {
        "representante": 0.95,
        "titular": 0.05
      },
      "confidence": 0.92
    },
    "que_31": {
      "type": "choice",
      "choice": "nif",
      "probabilities": {
        "nif": 1
      },
      "confidence": 1
    },
    "quien_32": {
      "type": "choice",
      "choice": "titular",
      "probabilities": {
        "nadie": 0.04,
        "representante": 0.07,
        "firma": 0.2,
        "tramite": 0.07,
        "titular": 0.59,
        "otra_persona": 0.03
      },
      "confidence": 0.51
    },
    "que_32": {
      "type": "choice",
      "choice": "email",
      "probabilities": {
        "municipio": 0.04,
        "lugar": 0.04,
        "fecha": 0.28,
        "email": 0.59,
        "domicilio_completo": 0.01,
        "contacto_completo": 0.04
      },
      "confidence": 0.58
    }
  },
  "usage": {
    "input_tokens": 6644,
    "output_tokens": 2263,
    "cost": 0.000279048
  }
}

Lo que hace Firmín

CampoQuién y qué, según JevEtiquetaComo personaComo empresa
#30Nom i cognoms de la persona representantrepresentante 99 %
nombre_completo 99 %
representante.nombre_completo98 %en blancolo escribe«Maria Pruebas Firmin»
#31DNI-NIE-PAS.representante 95 %
nif 100 %
representante.nif95 %en blancolo escribe«99999999R»
#32çant correu electrò- litat de responsabltitular 59 %
email 59 %
contacto.email35 %en blancoiba «08/10/2026»en blancoiba «08/10/2026»

Como persona no hay representante, y su nombre y su DNI quedan en blanco. Como empresa, quien firma es el representante, y Firmín escribe su nombre y su DNI.

En el #32 Jev duda. La mejor etiqueta, contacto.email, se queda en un 35 % y el campo queda en blanco. Lo correcto era la fecha, a la que Jev daba un 28 %.

La clave

La clave es tuya: se crea en openrouter.ai/keys y se pega en Opciones. Antes de guardarla en el llavero, Firmín pregunta a OpenRouter si vale:

GET https://openrouter.ai/api/v1/key
Authorization: Bearer sk-or-v1-…

Con un 200 la guarda; con un 401 o un 403 avisa de que no vale. De la respuesta no lee nada más.

El registro

Cada consulta se apunta en ~/Library/Logs/Firmin-IA.jsonl, con el cuerpo enviado y el recibido tal cual, sin la clave. En Opciones → Uso de la IA se ve cada una: cuándo, qué formulario, cuántos campos, los tokens, el coste y lo que se envió y llegó.

Lo que cuesta

97formularios en el banco de pruebas
543consultas a Jev
0,0044 €por formulario (0,005 US$)
10campos por consulta, la mediana

Una consulta lleva una mediana de 23.341 tokens de entrada y 7523 de salida. Todas las consultas del banco, con lo que se envió y lo que respondió Jev, están en cada formulario del banco de pruebas; allí se publican sin las opciones de 0 %.

Las opciones

De quién es el dato: 6 opciones
OpciónLo que recibe Jev
titularDato de la persona o empresa que presenta el formulario (solicitante, interesado, declarante, acreedor, deudor, otorgante de una representación), incluidos su domicilio, su contacto y su cuenta bancaria.
representanteDato de quien actúa en nombre del titular (su representante; en un modelo de representación, la persona a la que se otorga).
otra_personaDato de otra persona o empresa que no es ni el titular ni su representante: miembros del hogar, cónyuge o segundo contrayente, segundo firmante, conductor identificado, beneficiarios, otras empresas.
firmaLugar, fecha o nombre de la firma («En … a … de … de …», «Fdo.:»), o el recuadro para firmar.
tramiteDato del caso concreto: qué se pide y por qué, importes, referencias o expedientes, documentos que se aportan, declaraciones, consentimientos, casillas del tipo de trámite.
nadieNo lo rellena quien presenta el formulario: lo rellena la administración o el banco, o es un campo decorativo, una etiqueta o un botón.
Qué dato es: 75 opciones
OpciónLo que recibe Jev
Persona, domicilio, contacto y banco
nombre_entidadnombre del banco o de la sucursal
domicilio_entidaddirección del banco o de la sucursal
cpcódigo postal
escaleraescalera o bloque
medio_notificacioncasillas de cómo quiere recibir las notificaciones
nombre_comercialnombre comercial
domicilio_restootra parte del domicilio (portal, km, urbanización)
razon_socialrazón social de una empresa
puertapuerta o letra
bicBIC o SWIFT
sexosexo
apellido2segundo apellido
baja_ibanIBAN de la cuenta que se da de baja
movilteléfono móvil
nifNIF, DNI, NIE, CIF o pasaporte
baja_cuentanúmero de la cuenta que se da de baja
baja_entidadentidad (CCC) de la cuenta que se da de baja
apellidoslos dos apellidos en un solo campo
webpágina web
entidadcódigo de entidad bancaria (CCC)
tipo_viatipo de vía
nacionalidadnacionalidad
nombre_completonombre y apellidos, o nombre o razón social, en un solo campo
cargocargo, «en calidad de», tipo de administrador
paispaís del domicilio
cuentanúmero de cuenta (CCC)
tipo_personacasilla o dato de persona física / jurídica
fecha_nacimientofecha de nacimiento
apellido1primer apellido
pisopiso o planta
oficinacódigo de oficina o sucursal (CCC)
pais_bancopaís del banco
numeronúmero de la calle
contacto_completovarios datos de contacto en un solo campo («datos de contacto»: correo y teléfono)
nombresolo el nombre de pila (o la razón social si el campo es «nombre o razón social» y los apellidos van aparte)
emailcorreo electrónico
telefonoteléfono
baja_nombre_entidadbanco de la cuenta que se da de baja
provinciaprovincia
baja_oficinaoficina (CCC) de la cuenta que se da de baja
municipiomunicipio, población o localidad
vianombre de la calle o vía, sin número
cuenta_extranjeracuenta extranjera sin IBAN
dcdígitos de control (CCC)
lugar_nacimientolugar de nacimiento
documento_tipocasilla del tipo de documento (NIF, NIE, pasaporte, CIF)
estudiosnivel de estudios
iban_paissolo el código de país y dígitos de control del IBAN (ES00)
domicilio_completodirección en un solo campo
persona_contactopersona de contacto
ibanIBAN completo o una parte
baja_bicBIC de la cuenta que se da de baja
baja_dcdígitos de control de la cuenta que se da de baja
faxfax
baja_todascasilla «dar de baja todas las cuentas»
actividadactividad económica, IAE, CNAE
Firma
lugarlocalidad donde se firma
fechafecha de firma en un campo
diadía de la fecha de firma
mesmes de la fecha de firma
anioaño de la fecha de firma
firmantenombre de quien firma («Fdo.:»)
caja_firmarecuadro para la firma, sin texto
Trámite
tipo_tramitecasillas del tipo de trámite (alta, baja, modificación, causa…)
exponetexto libre de «expone», hechos o motivos
solicitatexto libre de «solicita», lo que se pide
documentosdocumentos que se aportan
importeimportes y cuantías
referencianº de expediente, liquidación, recibo, referencia catastral, matrícula, convocatoria
declaracioncasillas «declaro que…» o «sí / no» de una declaración
consentimientocasillas de autorizo, no autorizo, me opongo, consiento
otro_tramiteotro dato del caso
Nadie lo rellena
lo_rellena_bancolo rellena o certifica el banco
lo_rellena_administracionlo rellena la administración (registro, nº de tercero, visto bueno)
decorativocampo decorativo, etiqueta, tapa o botón