La mayoría de los agentes en producción no necesitan otro párrafo. Necesitan un juicio: qué equipo atiende este ticket, si esta tool call es segura, qué modelo debe procesar esta petición. Llamar a un LLM frontera para cada micro-decisión es lento, caro y te obliga a parsear prosa de vuelta a un branch.
En este deep-dive te muestro la alternativa System One: modelos de decisión tipados que devuelven un choice, un score o un sí/no calibrado sobre el que tu código puede ramificar — y comparo la vía gestionada (Jev) con la auto-hospedada (Laya), con código verificado contra las fuentes oficiales.
1. El Problema: Llamadas LLM Donde Bastaría un Juez
Mira un agente de soporte típico. Antes de redactar cualquier respuesta debe contestar preguntas estrechas: quién atiende el caso, si la política lo cubre, qué urgencia tiene, si el mensaje es una inyección de prompt. Cada respuesta tiene un espacio acotado que puedes enumerar antes de ver el ticket. Y aun así la mayoría de stacks envía cada pregunta a un modelo de chat y reza para que el JSON parsee.
Lo Que Rompe en Producción
Tres costes se acumulan: latencia (segundos por decisión en vez de milisegundos), dinero (tokens de razonamiento facturados por micro-juicio) y fiabilidad (respuestas en texto libre que inventan etiquetas fuera de tu conjunto). Un branch erróneo-pero-válido se depura; un nombre de tool alucinado enterrado tres capas abajo en una cadena de dependencias es un incidente.
El patrón que lo arregla: el trabajo exacto queda en código, la generación queda en el LLM, y entre medias pones una puerta de juicio rápida. La puerta lee estado no estructurado y devuelve valores tipados con probabilidades. Umbrales, permisos y efectos secundarios quedan en software ordinario, donde puedes testearlos.
2. Conceptos Mínimos: Choice, Score, Noul, Calibración
Tanto Jev como Laya exponen los mismos tres tipos de pregunta. Aprende estas cuatro ideas y cada ejemplo de abajo se lee como inglés llano.
Choice
categórico · hasta 255 opciones (Jev)
Elige una opción de un conjunto fijo. Recibes la etiqueta ganadora más una probabilidad por opción. Si la lista puede estar incompleta, incluye siempre other — si no, el modelo debe elegir la respuesta menos incorrecta.
Score
ordinal · 2–10 niveles ordenados
Una posición en una rúbrica que defines tú, p. ej. rutinario / sensible al tiempo / urgente / crítico. El número devuelto pondera por probabilidad entre niveles, así que inspecciona la distribución cuando su forma importe.
Noul
sí/no · probabilidad calibrada
Una probabilidad sí/no P(true) de 0.0 a 1.0. Un noul de 0.5 significa igual probabilidad en ambos lados — incertidumbre, no intensidad media. Para intensidad usa un Score.
Calibración
ECE · Brier score · temperatura
La calibración pregunta si las predicciones al 80% se cumplen ~80% de las veces, medido sobre muchos casos (ECE), con Brier premiando respuestas seguras-y-correctas. Laya trae temperaturas que reajustas por dominio; Jev lo entrena con RLCD.
Jev vs Laya a Nivel de Diseño
Jev (TypeSafe AI, lanzado en septiembre de 2026) es una API gestionada: sampler paralelo, arquitectura no publicada, post-entrenamiento RLCD, límite de 64k tokens por request combinado, $0.042 por millón de tokens de entrada con salida gratis, 70–500ms extremo a extremo. Laya (Convai Innovations, Apache 2.0, pip install laya) es auto-hospedado: un encoder ModernBERT-large de 421M (512 tokens) más un checkpoint multilingüe de 322M (1024 tokens), un Router que elige checkpoint por request, ~33ms por pregunta en una T4. Misma interfaz, trade-off opuesto: dependencia del proveedor vs infraestructura propia. Los números del vendor sitúan a Jev en 67.8% de acuerdo por $0.0004 por caso frente a GPT-5.6 Terra con 67.9% por $0.0304 — pero la referencia es de la propia TypeSafe, así que trátalo como demo del vendor, no como leaderboard.
3. Tutorial, Parte 1: SDK de Jev en Python
Instala el SDK oficial, define TYPESAFE_API_KEY y llama a system_one con un estado más preguntas tipadas. Esta forma está copiada de los docs oficiales del SDK Python — los criteria de Choice son un mapa de opción a descripción (None para etiqueta simple), los de Score una lista ordenada, y las respuestas vuelven separadas en nouls, choices y scores.
Una llamada, tres juicios, en paralelo
# pip install typesafe-sdk # TYPESAFE_API_KEY en env
from typesafe_sdk import Choice, Noul, Score, TypeSafeClient
with TypeSafeClient() as client:
response = client.system_one(
state={"document": "I was charged twice. Please fix this ASAP."},
questions={
"billing": Noul(instructions="Is this ticket about billing?"),
"tone": Choice(
instructions="What is the customer tone?",
criteria={"calm": None, "frustrated": None, "angry": None},
),
"urgency": Score(
instructions="How urgent is this ticket?",
criteria=["can wait", "this week", "today"],
),
},
)
print(response.nouls["billing"].noul) # P(yes), 0..1
print(response.choices["tone"].choice) # etiqueta ganadora
print(response.scores["urgency"].score) # posición ponderada, 0..2Las preguntas de un mismo request comparten el estado preparado y se evalúan en paralelo — una décima pregunta cuesta tokens pero casi nada de tiempo extra. El modelo nunca autoriza nada: tu código lee las probabilidades y aplica la política, con una banda explícita de incertidumbre que va a humanos.
Puerta de política: actuar, revisar o re-rutear
p_billing = response.nouls["billing"].noul
if p_billing > 0.90:
queue_refund_checks(state) # el código verifica importes, identidad, límites
elif p_billing > 0.55:
route_to_human(state, response) # la banda incierta va a revisión
else:
route_to_specialist(state)Regla de Oro
Un juicio semántico por pregunta; composición y efectos secundarios en código. Si la pregunta B necesita la respuesta de la A, mete esa respuesta en un request posterior — nunca escondas dependencias del workflow dentro de un prompt.
4. Tutorial, Parte 2: Router de Laya + el Flywheel
Laya corre en local y habla los mismos tres primitivos con schemas de diccionario. Empieza con los presets incluidos para triage inmediato, y usa el Router cuando el tráfico mezcle idiomas — inspecciona el script del input y elige el checkpoint por request con menos del 2% de overhead.
Triage con presets en tres líneas
# pip install laya
import laya
agent = laya.load("convaiinnovations/laya") # 421M, inglés, ctx 512
triage = agent.predict(
{"message": "My payment failed twice"},
laya.triage_questions(), # intent, urgency, frustration, churn
)Por Qué Existe el Router
Un solo checkpoint no puede ser óptimo para cada idioma. Router(preload=True) mantiene residentes los checkpoints inglés (421M/512), multilingüe (322M/1024) y typed-decisions (421M/1024) y elige por request — sin cold swap de 7–10s cuando el tráfico alterna idiomas. Caveat de la propia ficha de Convai: los checkpoints base rinden casi como azar en zero-shot sobre typed-decisions (0.362 vs 0.318 aleatorio); los números fuertes pertenecen al checkpoint fine-tuneado sobre el split de entrenamiento de ese benchmark.
La misma tarea con Router.predict
from laya import Router
router = Router(preload=True)
decision = router.predict(
{"message": "I was charged twice. Please refund the duplicate today."},
{
"owner": {
"type": "choice",
"instructions": "Which team owns the primary issue?",
"criteria": {
"billing": "charges, invoices, refunds, subscriptions",
"technical": "product failures or errors",
"account": "login, permissions, or account security",
"other": "none of the listed teams fits",
},
},
"refund_requested": {
"type": "noul",
"instructions": "Does the customer explicitly request a refund?",
},
},
)El patrón flywheel (documentado en el estudio Jev-Flywheel) mantiene el motor congelado y adapta alrededor: reajusta una pequeña decision head sobre las respuestas cuando los revisores discrepan, y corre steering rounds donde un analista propone una pregunta nueva que un humano aprueba. Con las mismas 140 etiquetas y 600 ítems held-out, esa capa subió a Jev de 0.768 a 0.870 y a Laya de 0.722 a 0.802, calibrando ambos (ECE 0.030 y 0.015). El fine-tuning completo de los pesos abiertos de Laya con el mismo presupuesto llegó a 0.896 — más accuracy, pero el 42% de las respuestas no relacionadas derivaron, así que cada otro score debe revalidarse.
5. Errores Comunes en Producción
Estos cinco modos de fallo salen directos de los docs de limitaciones versionados de ambos modelos. Presupuesta los cinco antes de tu primera decisión en vivo.
Pedir al juez que cuente
números · fechas · matemática exacta
Jev documenta precisión numérica, conteo y comparación de fechas débiles — y un encoder de 400M tampoco es una calculadora. Parsea timestamps, compara importes y verifica autorización de forma determinista; deja al modelo juzgar lenguaje, no aritmética.
Choice cerrado, mundo abierto
falta la opción other
Un Choice sin other o none_of_the_above fuerza una respuesta segura y errónea cuando la clase real no existe. En Laya mantén las listas bajo ~20 opciones: cada opción comparte un presupuesto fijo de tokens y las listas largas se difuminan.
Confiar en probabilidades crudas
la calibración es un paso de despliegue
Revalida las probabilidades tras cambiar modelo, schema, idioma o dominio. Ajusta temperatura sobre datos held-out, fija umbrales en el punto operativo que controla el workflow y compara precisión/recall ahí — no solo accuracy.
Ignorar la ventana
512/1024 vs 64k
Laya trunca input largo en silencio y responde sobre un prefijo — cuenta tokens primero y rechaza. El límite de 64k de Jev es margen, no promesa: el estado largo y ruidoso sigue degradando decisiones. Recupera evidencia enfocada en ambos casos.
Sin fallback alrededor de la puerta
timeouts · drift · colas de revisión
Una API hospedada necesita timeouts, reintentos y un branch de fallback; un checkpoint local necesita capacidad de serving, planificación de cold-start y monitorización. Ambos necesitan acciones reversibles, colas humanas y logs de versión de estado, distribuciones y overrides.
Qué Evaluar Antes de Elegir
Corre un question set congelado contra los mismos casos etiquetados para cada candidato — baseline de reglas, LLM con structured outputs, Jev y el checkpoint Laya adecuado — y compara precisión/recall por clase, calibración en tu umbral, percentiles de latencia, coste y volumen de revisión. Empieza en shadow mode, publica primero acciones reversibles y fija la versión del modelo o checkpoint más cualquier ajuste de calibración.
Conclusión
La idea útil es más grande que cada producto: muchos pasos de un agente necesitan un juicio acotado, no otro párrafo. Jev lo empaqueta como API de decisiones gestionada con ventana de 64k que alquilas; Laya ofrece pesos inspeccionables Apache-2.0 con ventanas de 512/1024 tokens que posees, fine-tuneas y calibras tú.
Dale a cada capa el trabajo que mejor maneja: el código hace trabajo exacto y posee las acciones, un modelo de decisión testeado convierte texto en respuestas acotadas, los LLMs generan y razonan, los humanos resuelven la incertidumbre con consecuencias. Empieza esta semana reemplazando una llamada LLM de clasificación por una decisión tipada con umbral — esa sola puerta suele pagar el patrón entero.
Fuentes de Este Post
Oficial
- Launch post de TypeSafe
- Docs del SDK Python
- Repo de Laya en GitHub
Análisis independiente
- Chromiak: Jev and Laya
- Anthus: Jev vs Laya + flywheel
- Model card de Laya (HF)
Números clave
- Jev 67.8% / $0.0004 por caso
- Flywheel: 0.870 vs 0.802
- Laya: 33ms, 7.2ms en batch



