Ir al contenido
Franklin Martinez
Todo el trabajo

justask

Pedidos en lenguaje natural convertidos en el estado de una app, con umbrales medidos

Resumen. justask convierte lo que una persona escribe en el estado propio de una app: un resultado de búsqueda, un filtro de tabla, una ficha llena. El código encuentra los candidatos, un modelo elige una etiqueta por pregunta con una probabilidad para cada etiqueta, y un campo del que el modelo no está seguro se queda vacío para que la persona lo llene.

Nuevo gasto

“almuerzo con Cazuela Azul ayer, $86.40”

Proveedor

Banquetes Cazuela Azul

0.99 umbral 0.70
Etiquetas

Comidas

0.74 umbral 0.40
Fecha

sáb, 10 oct 2026 “ayer”

0.94 umbral 0.80
Monto

US$86.40 “$86.40”

1.00 umbral 0.90

Nuevo gasto

“almuerzo con los de limpieza ayer, $40”

Proveedor

Vacío para que lo llenes

0.12 umbral 0.70

No se nombra ningún proveedor. Mejor candidato: Banquetes Cazuela Azul con 0.12.

Etiquetas

Comidas

0.90 umbral 0.40
Fecha

sáb, 10 oct 2026 “ayer”

0.99 umbral 0.80
Monto

US$40.00 “$40”

1.00 umbral 0.90

Nuevo gasto

“taxi de Rumbo Claro con un cliente el viernes, 64 dólares”

Proveedor

Viajes Rumbo Claro

0.83 umbral 0.70
Etiquetas

Viajes

0.57 umbral 0.40

Cliente

0.56 umbral 0.40
Fecha

vie, 9 oct 2026 “viernes”

0.99 umbral 0.80
Monto

US$64.00 “64 dólares”

1.00 umbral 0.90

Elige un pedido

Probarla en vivo
Fig. 1. Tres pedidos enviados a la demo en vivo el 11 de octubre de 2026, reproducidos con sus respuestas reales. Las barras son la probabilidad del modelo para cada elección; una elección por debajo de su umbral deja el campo vacío.

El problema

En las apps de negocio, la entrada en lenguaje natural casi siempre significa que un modelo escribe texto libre y la app espera poder interpretarlo. Un modelo que escribe puede inventarse un proveedor que no existe, una fecha que nadie dijo o un monto en la moneda equivocada, y la app lo guarda igual.

El diseño

justask nunca deja que el modelo escriba. El código hace la lectura que puede hacer de forma confiable: interpreta fechas, horas y montos, y preselecciona filas candidatas del catálogo de la app. Luego el modelo responde una pregunta por campo eligiendo una etiqueta de esa lista, y devuelve una probabilidad para cada etiqueta. El código arma el resultado a partir de esas elecciones.

Cada campo tiene un umbral. Una elección por debajo de su umbral se retiene: el campo se queda vacío y la persona lo llena. Nada llega a la app hasta que la persona confirma. Un campo retenido no es un fallo: es el sistema diciendo que no sabe.

Medido, no adivinado

Los umbrales no tienen valor por defecto. La librería obliga a la app a declarar cada uno, porque un umbral que viene por defecto es una suposición que hizo otra persona. Yo mido los míos con sets de evaluación congelados: cada set se fija con un checksum, con sus líneas de aprobación escritas, antes de la primera llamada al modelo. La ronda 4 de la evaluación de búsqueda acertó todos los pedidos, no inventó ninguno y retuvo todos los ambiguos. Las rondas fallidas anteriores están en el registro de evaluación.

Los límites también están escritos. El QA antes del lanzamiento encontró una parte pequeña de campos llenados con confianza y mal en un set amplio de pruebas, y por eso el paso de confirmar no es opcional. Una revisión de marcas obvias de inyección de prompt retiene todos los campos cuando se activa, y el README dice claramente que es una revisión limitada, no una defensa.

La demo en vivo

La demo es una app de facturación ficticia con una tabla, un formulario y una búsqueda, en inglés y español. Corre en un solo Cloudflare Worker, con límite de uso y un tope de gasto de modelo. La Fig. 1 de arriba reproduce tres respuestas reales grabadas de ella.

Lo que se publica

@justask/core en npm con licencia MIT: el núcleo, una capa de React con hooks y piezas sin estilo, el adaptador del proveedor y las funciones de evaluación para medir los umbrales. También incluye un skill para agentes que le enseña a los agentes de código lo que suelen hacer mal con ella: el modelo elige y nunca escribe, los umbrales no tienen valor por defecto y un campo retenido no es un fallo.

Hablar de este proyecto