/proyectos/laya

Laya — El System One Model open source que compite con Jev

Un decision engine no-autorregresivo: decisiones tipadas con probabilidad calibrada en una sola pasada forward, en 100+ idiomas, con pesos Apache 2.0 y un servidor que habla el mismo protocolo que la API de TypeSafe.

System One decisiones IA open source self-hosted multilingüe
Laya — El System One Model open source que compite con Jev

Qué es

Laya es un decision engine no-autorregresivo estilo System 1: recibe cualquier texto (un ticket, un mail, un documento JSON) más preguntas tipadas —choice, score, noul— y devuelve decisiones estructuradas con su probabilidad en una sola pasada forward. 33 ms para una pregunta y 7.2 ms por pregunta en batch, medidos en una T4. No genera texto: no hay nada que parsear y nada que alucinar.

La idea central

Es la misma clase de modelo que TypeSafe llama System One (y que acá vimos con Jev): en vez de entrenar un modelo para que escriba respuestas para humanos, lo entrenás para que tome decisiones que el software pueda consumir. La diferencia de Laya es el enfoque open source: tres checkpoints publicados bajo Apache 2.0 con sus pesos en Hugging Face, un router que elige el checkpoint correcto para cada request, y un servidor HTTP que habla el mismo wire protocol que Jev (POST /v1/systemone).

Cómo está construido

Tres checkpoints y un Router que decide cuál usar:

Checkpoint Encoder Params Contexto Para qué
laya ModernBERT-large 421M 512 inglés
laya-multilingual mmBERT-base 322M 1024 (hasta 8.192) 100+ idiomas, 2x más rápido
laya-typed-decisions ModernBERT-large 421M 1024 workflows de decisiones tipadas

El router detecta el script y el idioma del texto en menos de 0.5 ms antes de la pasada. Eso importa más de lo que parece: el checkpoint inglés colapsa en escrituras no latinas — en el benchmark interno, Khmer le dio 0.000 de exactitud a 0.952 de confianza, o sea que era seguro que estaba mal y encima confiado. Sin routing, el confidence gating no te salva de eso.

Qué podés preguntarle

  • choice: elegir entre opciones con criterio, ej. cual departamento? → billing / technical / other.
  • score: puntaje sobre una escala descripta, ej. urgencia → not urgent / soon / blocking.
  • noul: un sí/no con probabilidad calibrada, ej. el usuario amenaza con darse de baja?.
from laya import Router

router = Router()

state = "Billed twice for March. Please refund the duplicate today or we will cancel."
questions = {
    "department": {"type": "choice", "instructions": "Which department?",
                   "criteria": {"billing": "invoices, payments, refunds",
                                "technical": "bugs, outages"}},
    "churn_risk": {"type": "noul", "instructions": "Does the user threaten to leave?"},
}

result = router.predict(state, questions)
print(result["answers"]["department"]["choice"])   # billing
print(result["answers"]["churn_risk"]["noul"])     # probabilidad de que sea sí
print(result["routing"]["model"])                  # english

Este ejemplo mínimo funciona tal cual en más de 100 idiomas: el texto no-inglés lo enruta solo al checkpoint multilingual.

Jev-compatible, pero tuyo

laya-serve expone el router por HTTP en el mismo POST /v1/systemone que la API hosted de TypeSafe. El payload de respuesta ya es schema-idéntico a lo que devuelve Jev (choice/score/noul + bloque de uso de tokens), así que un cliente Jev existente —por ejemplo el Haskell hs-jev— solo necesita apuntar su baseUrl a tu servidor:

pip install "laya[serve]"
LAYA_DEVICE=cuda LAYA_PRELOAD=1 laya-serve
curl -s localhost:8000/v1/systemone -H 'content-type: application/json' -d '{
  "state": {"body": "billed twice, refund please or we cancel"},
  "questions": {"dept": {"type": "choice", "instructions": "which team?",
                "criteria": {"billing": "refunds", "tech": "bugs"}}}
}'

Además trae extras que no están en la API cerrada: /v1/systemone/batch (hasta 64 estados por llamada), presets listos (triage, email, guard, moderation, router), integración con LangChain/LangGraph, LlamaIndex y CrewAI, servidor MCP, y un cliente TypeScript (laya-ts / laya-client) que corre análisis hasta en el navegador.

Los números

Como la familia de Jev, hay una tabla de referencia donde los compara lado a lado (los datos de Jev son de terceros, no medidos por el proyecto):

  • typed-decisions (2.000 decisiones): 0.766 vs 0.727 de Jev — por encima del techo de auto-acuerdo del teacher (0.735).
  • AG News (4 etiquetas): 0.950 vs 0.910.
  • DAIR Emotion (6 etiquetas): 0.595 vs 0.480.
  • Calibración: ECE de 0.081 tras calibrado por temperatura, contra 0.246.
  • Multilingüe: 48 de 51 idiomas útiles (>3x random) en el benchmark MASSIVE intent, con el router.
  • Velocidad: 32.8 ms por pregunta en T4 (GPU), 193–464 ms en CPU.
  • Costo: $0 — corre en tu propia máquina.

A dónde llega su techo hoy

  • Checkpoints base cerca del azar en zero-shot: 0.362 y 0.352 contra un baseline de 0.461 y random de 0.318. La capacidad de verdad llega con el checkpoint fine-tuneado. Es una base rápida para especializar, no un oráculo de fábrica.
  • Muchas opciones se atragantan: el presupuesto de tokens del head es fijo (192 en inglés, 256 en multilingüe). Con 50+ opciones, cada label queda con 3–4 tokens y la exactitud cae (Banking77 con 77 labels: 0.425). Para eso está head_max_len y predict_shortlist.
  • Labels booleanas y negación: evitá keys true/false (las sigue en vez de la descripción) y validá la negación con tu propio wording — sobre muestras del proyecto, no_action/cancel_account fallaron en 4 de 5 casos negados.

Fine-tuning sin pagar nada

El repo documenta una especialización completa en una GPU de 16 GB sin API paga: Laya como decisor de operación/objetivo para un agente de browser. Element top-1 entre ~45 candidatos pasó de 0.10 zero-shot a 0.66, y el éxito en tareas reales de 0% a 62% a 17–23 ms por paso. Los pesos, el pipeline y los resultados por corrida están publicados en Hugging Face.

Por qué es importante

La narrativa de los System One Models hasta acá era casi toda de un solo proveedor con API cerrada. Laya es el contraargumento open source: la misma idea —decisiones tipadas calibradas para software— con pesos Apache 2.0, self-hosting, idiomas reales y un wire protocol que ya comparte con Jev. Si lo que querés es automatizar decisiones dentro de tu propio sistema, dejás de depender de la waitlist y el precio por token de un tercero.

Siguiente paso

pip install laya, corré el quickstart de Route Mode y probá tu primer caso real (triaje de tickets, moderación, ruteo). Si tus decisiones son especializadas, mirá la guía de fine-tuning: 4–5 horas en 2xT4 y queda el checkpoint adaptado.

Ir al proyecto →