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/decisionsNo 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:
quien_N: de quién es el dato. 6 opciones: titular, representante, otra persona, firma, trámite o nadie.que_N: qué dato es. 75 opciones: NIF, primer apellido, código postal, IBAN, día de la firma…
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
- 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
#Nde las preguntas. - Lotes. Los campos de cada página van de diez en diez. Cada lote es una consulta, y todas salen a la vez.
- 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.
- 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.
- 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:
| Clave | Qué lleva |
|---|---|
model | typesafe/jev-1.13 |
state.documento | El nombre del formulario y la tarea, en una frase. |
state.campos_cercanos | Los campos del contexto, descritos como en la tabla de abajo. |
questions | quien_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:
| Clave | Qué es |
|---|---|
campo, pagina, tipo | El número, la página y si es texto, casilla o lista. |
posicion | Dónde está en la página, en puntos. |
nombre_interno | El nombre que tiene el campo en el PDF. |
texto_izquierda, texto_encima, texto_derecha | El texto impreso junto al campo. |
texto_mas_arriba, rotulos_encima, cabecera, apartado | Los títulos del bloque en el que está. |
tooltip, valor_casilla, max_caracteres, cajitas | Si 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:
| Probabilidad | Qué hace |
|---|---|
| 90 % o más | lo 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
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
| Campo | Quién y qué, según Jev | Etiqueta | Como persona | Como empresa |
|---|---|---|---|---|
| #21En Algeciras, a de | firma 96 %mes 100 % | firma.mes96 % | lo escribe«octubre» | lo escribe«octubre» |
| #22a de de 20 | firma 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
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
| Campo | Quién y qué, según Jev | Etiqueta | Como persona | Como empresa |
|---|---|---|---|---|
| #30Nom i cognoms de la persona representant | representante 99 %nombre_completo 99 % | representante.nombre_completo98 % | en blanco | lo escribe«Maria Pruebas Firmin» |
| #31DNI-NIE-PAS. | representante 95 %nif 100 % | representante.nif95 % | en blanco | lo escribe«99999999R» |
| #32çant correu electrò- litat de responsabl | titular 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
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ón | Lo que recibe Jev |
|---|---|
titular | Dato 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. |
representante | Dato de quien actúa en nombre del titular (su representante; en un modelo de representación, la persona a la que se otorga). |
otra_persona | Dato 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. |
firma | Lugar, fecha o nombre de la firma («En … a … de … de …», «Fdo.:»), o el recuadro para firmar. |
tramite | Dato 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. |
nadie | No 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ón | Lo que recibe Jev |
|---|---|
| Persona, domicilio, contacto y banco | |
nombre_entidad | nombre del banco o de la sucursal |
domicilio_entidad | dirección del banco o de la sucursal |
cp | código postal |
escalera | escalera o bloque |
medio_notificacion | casillas de cómo quiere recibir las notificaciones |
nombre_comercial | nombre comercial |
domicilio_resto | otra parte del domicilio (portal, km, urbanización) |
razon_social | razón social de una empresa |
puerta | puerta o letra |
bic | BIC o SWIFT |
sexo | sexo |
apellido2 | segundo apellido |
baja_iban | IBAN de la cuenta que se da de baja |
movil | teléfono móvil |
nif | NIF, DNI, NIE, CIF o pasaporte |
baja_cuenta | número de la cuenta que se da de baja |
baja_entidad | entidad (CCC) de la cuenta que se da de baja |
apellidos | los dos apellidos en un solo campo |
web | página web |
entidad | código de entidad bancaria (CCC) |
tipo_via | tipo de vía |
nacionalidad | nacionalidad |
nombre_completo | nombre y apellidos, o nombre o razón social, en un solo campo |
cargo | cargo, «en calidad de», tipo de administrador |
pais | país del domicilio |
cuenta | número de cuenta (CCC) |
tipo_persona | casilla o dato de persona física / jurídica |
fecha_nacimiento | fecha de nacimiento |
apellido1 | primer apellido |
piso | piso o planta |
oficina | código de oficina o sucursal (CCC) |
pais_banco | país del banco |
numero | número de la calle |
contacto_completo | varios datos de contacto en un solo campo («datos de contacto»: correo y teléfono) |
nombre | solo el nombre de pila (o la razón social si el campo es «nombre o razón social» y los apellidos van aparte) |
email | correo electrónico |
telefono | teléfono |
baja_nombre_entidad | banco de la cuenta que se da de baja |
provincia | provincia |
baja_oficina | oficina (CCC) de la cuenta que se da de baja |
municipio | municipio, población o localidad |
via | nombre de la calle o vía, sin número |
cuenta_extranjera | cuenta extranjera sin IBAN |
dc | dígitos de control (CCC) |
lugar_nacimiento | lugar de nacimiento |
documento_tipo | casilla del tipo de documento (NIF, NIE, pasaporte, CIF) |
estudios | nivel de estudios |
iban_pais | solo el código de país y dígitos de control del IBAN (ES00) |
domicilio_completo | dirección en un solo campo |
persona_contacto | persona de contacto |
iban | IBAN completo o una parte |
baja_bic | BIC de la cuenta que se da de baja |
baja_dc | dígitos de control de la cuenta que se da de baja |
fax | fax |
baja_todas | casilla «dar de baja todas las cuentas» |
actividad | actividad económica, IAE, CNAE |
| Firma | |
lugar | localidad donde se firma |
fecha | fecha de firma en un campo |
dia | día de la fecha de firma |
mes | mes de la fecha de firma |
anio | año de la fecha de firma |
firmante | nombre de quien firma («Fdo.:») |
caja_firma | recuadro para la firma, sin texto |
| Trámite | |
tipo_tramite | casillas del tipo de trámite (alta, baja, modificación, causa…) |
expone | texto libre de «expone», hechos o motivos |
solicita | texto libre de «solicita», lo que se pide |
documentos | documentos que se aportan |
importe | importes y cuantías |
referencia | nº de expediente, liquidación, recibo, referencia catastral, matrícula, convocatoria |
declaracion | casillas «declaro que…» o «sí / no» de una declaración |
consentimiento | casillas de autorizo, no autorizo, me opongo, consiento |
otro_tramite | otro dato del caso |
| Nadie lo rellena | |
lo_rellena_banco | lo rellena o certifica el banco |
lo_rellena_administracion | lo rellena la administración (registro, nº de tercero, visto bueno) |
decorativo | campo decorativo, etiqueta, tapa o botón |