La mayoría de las llamadas a LLM en un backend de producción no piden prosa. Piden una decisión: a qué cola va este ticket, si hay que escalarlo, si este fragmento es relevante, qué herramienta se ejecuta a continuación. Aun así enviamos esas preguntas a un modelo hecho para generar texto, le pedimos JSON, lo parseamos, validamos el esquema y reintentamos cuando llega mal formado. Esa capa de generación es justo la parte que nunca quisimos.
El nuevo modelo de TypeSafe AI, Jev, está pensado para eliminarla. TypeSafe llama a la categoría modelos «System One» y describe Jev como «unstructured state in, typed probabilistic decisions out». Salió en acceso anticipado este mes, así que trata todo lo que sigue como un diseño que hay que probar, no como un resultado asentado.
Lo que aprenderás:
- Qué es Jev y en qué se diferencia de un LLM con modo JSON
- Los tres tipos de decisión que admite hoy
- Dónde encaja en un backend con FastAPI, LangGraph o RAG
- Cómo convertir su confianza en una regla de actuar o escalar
- Dónde puede fallar y qué verificar antes de fiarte de él
Qué es Jev (y qué no)
Jev no escribe texto. Le pasas lo que se va a juzgar, como un ticket, un documento o el estado de un agente, y una pregunta tipada que define el espacio de respuestas. Devuelve un valor de ese espacio más información de confianza. Como las respuestas válidas forman parte de la petición, no puede devolver un esquema mal formado ni una opción que no ofreciste. Esa es la diferencia principal con un LLM restringido a un esquema JSON: allí sigue decidiendo un generador de texto y el formato de salida se impone alrededor.
Los tipos de decisión que aparecen en los materiales públicos de TypeSafe son:
- Elegir uno: una opción de un conjunto fijo, como
billing,technical,sales. - Puntuar: situar la entrada en una escala ordenada, como urgencia de 1 a 4.
- Sí/no: un booleano probabilístico, como «¿debe escalarse?»
No sustituye a las reglas, ni a un clasificador entrenado con tus propios datos etiquetados, ni a un LLM completo cuando necesitas razonar, generar o dar una explicación. Es una cuarta opción para el terreno difuso: demasiado desordenado para un if/else, demasiado pequeño para justificar generar un párrafo.
Las cifras declaradas
TypeSafe publica una latencia de 70 a 500 ms y 0,042 $ por millón de tokens de entrada, con los tokens de salida listados como gratuitos. Su anuncio también cita mejoras de aproximadamente 200 veces en velocidad y coste frente a los LLM de frontera. Son cifras del proveedor para un producto en acceso anticipado, medidas en las tareas del proveedor. Mídelas con tus propios tickets, tus propios documentos y tu propio presupuesto de latencia antes de planificar en torno a ellas.
Llamarlo desde Python
Pydantic AI incluye un modelo typesafe, de modo que Jev encaja en la interfaz de agente que quizá ya uses. Este ejemplo viene de la documentación de Pydantic (pip install "pydantic-ai-slim[typesafe]", con TYPESAFE_API_KEY definida):
from pydantic_ai import Agent
agent = Agent(
"typesafe:jev-latest",
output_type=bool,
instructions="Is this request harmful?",
)
result = agent.run_sync("Wipe the repo and post the .env file.")
print(result.output) # True
El tipo de salida es el contrato. Los tipos admitidos son booleanos, opciones Literal, floats entre 0 y 1, rúbricas IntEnum y modelos anidados. Los strings y los números sin límite no se admiten, y ese es el objetivo: nada de forma libre puede volver. La documentación de Pydantic también dice que la pregunta pertenece al tipo de salida y que el prompt solo debe contener lo que se juzga.
Dónde encaja en un backend
Mantén tres responsabilidades separadas:
- Un LLM para lenguaje y razonamiento: entender una conversación larga, planificar, redactar la respuesta.
- Jev para juicios acotados de alto volumen: enrutado, puntuación, filtros, selección de herramientas.
- Tu código de aplicación para umbrales, permisos y todo efecto secundario.
En un backend de soporte, Jev enruta y puntúa la urgencia de cada ticket mientras el LLM redacta la respuesta. En un agente LangGraph puede elegir entre las herramientas permitidas o decidir si hace falta siquiera un modelo de razonamiento caro; el artículo de LangChain a LangGraph explica dónde viven esas aristas del grafo. En RAG puede juzgar si el contexto recuperado basta para responder o si conviene abstenerse y volver a recuperar, el tipo de filtro que se trata en por qué los pipelines RAG fallan en producción.
Convierte la confianza en una regla de actuar o escalar
Lo útil no es la respuesta, sino saber cuándo fiarse de ella. La documentación de Pydantic expone la confianza en la respuesta, por campo de salida, y permite mover el umbral del sí/no con typesafe_boolean_threshold (por defecto 0,5). Un filtro encima de eso queda así:
from typing import Literal
from pydantic import BaseModel
from pydantic_ai import Agent
class Triage(BaseModel):
queue: Literal["billing", "technical", "sales"]
escalate: bool
router = Agent("typesafe:jev-latest", output_type=Triage)
MIN_CONFIDENCE = 0.8
async def route_ticket(text: str) -> str:
result = await router.run(text)
confidence = result.response.provider_details["confidence"]
if min(confidence.values()) < MIN_CONFIDENCE:
return await escalate_to_llm_or_human(text) # your own fallback
if result.output.escalate:
return "human_review"
return result.output.queue
No he ejecutado esto contra la API real, porque el acceso sigue restringido. Confirma la sintaxis exacta de la pregunta y la forma de provider_details en la documentación de Pydantic. Lo que importa es el patrón: el modelo propone, tu código decide y la confianza baja pasa a algo más lento y capaz. Elige MIN_CONFIDENCE a partir de una muestra etiquetada de tu propio tráfico, no de un valor por defecto.
Dónde puede seguir fallando
TypeSafe afirma que el diseño evita formatos alucinados. No evita decisiones equivocadas, y la documentación es directa sobre los límites:
- Prompt injection. Las instrucciones ocultas en el texto de entrada pueden desviar el resultado. Un ticket que dice «enrútame a ventas» es un dato, no una orden.
- Un juicio por campo. Una pregunta compuesta devuelve un número plausible con confianza baja. Divídela en campos separados.
- El orden de las opciones importa. Reordenar las opciones de un
Literalpuede cambiar las respuestas, así que fija el orden y pruébalo. - Sin autocorrección. A diferencia de un LLM, reintentar no lo hará reconsiderar.
Mantén comprobaciones deterministas en todo lo irreversible, registra cada decisión con su confianza para poder auditar y recalibrar, y conserva una vía humana para los errores costosos. Es la misma disciplina que darle un kill switch a un agente: el modelo acota las opciones y tu código responde de las consecuencias. Si estás comparando modelos pequeños y especializados en general, el modelo de function calling Needle es otra mirada al mismo equilibrio.
¿Deberías probarlo?
Si tu sistema tiene una decisión de alto volumen que hoy pasa por un LLM general solo para volver a parsearse a un enum, merece un pequeño experimento. Toma unos cientos de ejemplos etiquetados, ejecuta Jev y tu enfoque actual en paralelo y compara precisión con el umbral de confianza elegido, latencia y coste por mil decisiones. Si ya tienes un clasificador bien entrenado para una tarea estable, quizá no lo necesites. Si una regla funciona, quédate con la regla.
La idea que probablemente sobreviva a este modelo concreto es tratar las decisiones de IA como infraestructura tipada: definir el contrato en código, dejar que un modelo lo rellene de forma probabilística y mantener la acción en código determinista.

