Laya es la alternativa abierta a los modelos de decisiones hosteados: en vez de generar texto token por token, responde preguntas tipadas — choice, score, verdadero/falso — en un solo forward pass. Y laya-mlx, un port no oficial publicado como v0.1.0 el 19 de septiembre de 2026, lo corre nativo en Apple MLX.
Sin PyTorch, sin runtime de Transformers, sin API en la nube: 7.39 ms P50 con el checkpoint multilingüe en un M3 Max, con pico de 687.6 MiB. Acá va qué es, cómo funciona en 4 pasos y cómo correrlo en 5 minutos.
1. Qué es: stars, licencia, checkpoints
laya-mlx de mizorewww es una reimplementación independiente de la inferencia de Laya en MLX para Apple Silicon — no es un release oficial de Convai Innovations. El Laya original ronda las 10.4k stars; el port superó las 549 stars en su primer día (20 de septiembre de 2026) y está cerca de las 5.1k al momento de escribir. Licencia: Apache-2.0. El paquete v0.1.0 llegó a PyPI el 19 de septiembre de 2026, y la v0.2.0 ya está publicada ahí, así que el pip install común trae lo último.
Repo
github.com/mizorewww/laya-mlx — port no oficial, Apache-2.0
Checkpoints (FP16, Hugging Face)
aac6fef/laya-mlx (421M EN, 512 tokens) · aac6fef/laya-multilingual-mlx (322M, 1,024 tokens) · aac6fef/laya-typed-decisions-mlx (421M, 1,024 tokens)
Números en M3 Max (reportados por el proyecto)
P50 13.42 ms EN / 7.39 ms multilingüe · batch-50: 146.8 q/s EN / 395.0 q/s multilingüe · pico 943.6 MiB EN / 687.6 MiB multilingüe
Fidelidad
63/63 preguntas de validación coinciden con el PyTorch original en argmax en FP32 y FP16 (378/378 comparaciones), según BENCHMARKS.md
Nota de versión (leé esto primero)
Este post cubre la v0.1.0 (19 de septiembre de 2026) y cada comando fue verificado contra el repo y PyPI. Como la v0.2.0 ya está en PyPI, corré pip install laya-mlx para obtener lo último — la instalación, el import y la carga no cambian.
2. Arquitectura en 4 pasos
No hay generación de texto en ningún punto del pipeline. Declarás la forma de la pregunta por adelantado y cabezales dedicados devuelven probabilidades calibradas. Cero output tokens es todo el pitch.
Paso 1 — Estado + pregunta tipada
Pasás un estado (texto, JSON o conversación) más preguntas tipadas como choice (elegir una etiqueta), score (niveles ordenados de rúbrica) o noul (probabilidad de que algo sea verdad).
Paso 2 — Encoder bidireccional
Un forward pass por ModernBERT-large (checkpoints EN de 421M) o mmBERT-base (multilingüe de 322M). El modelo lee estado y pregunta juntos — sin decodificación autoregresiva.
Paso 3 — Stack de decisión en MLX
Un decision Transformer aprendido más cabezales de scoring y acción corren íntegramente en MLX sobre Apple Silicon. La tokenización usa el tokenizer Rust de Hugging Face; PyTorch y el runtime de Transformers no se necesitan para inferencia.
Paso 4 — Probabilidades calibradas
Recibís respuestas con probabilidades calibradas, redondeo a cuatro decimales, probabilidades de acción y campos de token usage — el mismo schema del upstream, con su calibración de temperatura incluida.
3. Quickstart (verificado)
Necesitás una Mac con Apple Silicon, macOS 14+ y Python 3.11+. La primera carga descarga el checkpoint; después todo corre 100% en local.
pip install laya-mlx
import laya_mlx as laya
agent = laya.load("aac6fef/laya-mlx")
result = agent.predict(
"I was billed twice. Please refund the duplicate.",
{
"department": {
"type": "choice",
"instructions": "Who should handle this?",
"criteria": ["billing", "technical", "sales"],
}
},
)
print(result["answers"]["department"])El checkpoint multilingüe (contexto de 1024 tokens, ~7 ms P50) se carga igual con aac6fef/laya-multilingual-mlx. El artefacto EN de 843 MB se descarga una sola vez; un benchmark independiente de Anthus reprodujo el setup con make laya y confirmó la descarga de ~843 MB.
Qué verifiqué antes de publicar
URL del repo, pip install laya-mlx, import laya_mlx as laya, load aac6fef/laya-mlx, requisitos Python 3.11+ y macOS 14+, y cada cifra de benchmark — todo contra el README del repo, BENCHMARKS.md, PyPI y los write-ups de HTX y Anthus. Sin flags inventados: el snippet de arriba es el ejemplo mínimo del propio README.
4. Dónde brilla: casos de uso
Pensá en decisiones de alta frecuencia, input corto y output estructurado — la capa entre tu app y un LLM, no su reemplazo.
Triage de soporte
Derivar cada ticket (billing vs técnico vs ventas) más score de urgencia e intención de reembolso en una llamada de ~13 ms en vez de un round trip a un LLM.
Guardrails de agentes
Evaluar o aprobar acciones propuestas con P(true) calibrado antes de ejecutar — lo bastante barato para llamarlo en cada paso.
Loops en tiempo real
La demo Snake re-evalúa cada movimiento en local a 75.40 movimientos/s con cero muertes en 2,400 movimientos — prueba de que decisiones por frame son viables.
Etiquetado en batch
395 preguntas/s en el checkpoint multilingüe hacen viable la clasificación y el reranking masivo en una sola Mac.
5. Cuándo NO usarlo
Chico y rápido no significa universal. Evitá laya-mlx cuando aplique cualquiera de estos casos:
- • Necesitás texto generado — resúmenes, chat, código. Este modelo solo devuelve decisiones tipadas, nunca prosa.
- • Tus inputs son documentos largos. El checkpoint EN llega a 512 tokens y el resto a 1,024 — estado, instrucciones y opciones comparten ese presupuesto, y el exceso se trunca en silencio.
- • No estás en Apple Silicon. Es un runtime MLX nativo; en otro hardware corré el Laya original sobre PyTorch.
- • Tus preguntas choice tienen decenas de opciones. Todas las etiquetas comparten un presupuesto de tokens (Convai atribuye su flojo Banking77 exactamente a esto), así que filtrá a top-k primero o dividí la pregunta.
- • Querés cero ops. Una API hosteada solo pide una key; acá el checkpoint, el runtime y la calibración son tuyos.
Regla de oro
Si tu decisión entra en una frase y se repite miles de veces por día, laya-mlx es ideal. Si necesita un párrafo de razonamiento, llamá a un LLM — o usá laya-mlx como filtro rápido delante de uno.
6. Límites honestos
Cada número de este post fue reportado por el proyecto en una sola máquina: un M3 Max con GPU de 40 núcleos y 128 GiB de memoria unificada. Tomalos como techo, no como promesa — Apple Silicon más chicos van a diferir, y el CI hosteado solo corre tests CPU de modelos chicos mientras los benchmarks GPU se miden en local.
- • Contexto: 512 tokens EN, 1,024 multilingüe y typed-decisions — preguntas y opciones incluidas.
- • La calidad multilingüe es despareja entre idiomas y puede necesitar fine-tuning de dominio, según los docs del upstream.
- • Cada pregunta extra cuesta un forward pass (~8 ms por pregunta agregada en un M1 Max según el test de Anthus) — a diferencia de modelos hosteados donde las preguntas viajan en un request.
- • El port preserva calibración y schema del upstream, pero los límites de calidad del modelo son los de los checkpoints originales.
Reproducibilidad
Pineá una revisión del Hub cuando importe, validá en tu propio workload y re-chequeá la calibración después de cualquier fine-tune — Anthus mostró que un Laya ajustado cambia respuestas a preguntas no relacionadas del mismo scorecard.
Conclusión
laya-mlx es el tipo de repo que se gana sus stars: un port enfocado y bien benchmarkeado que convierte un modelo de decisiones de 421M de parámetros en una primitiva local sub-15 ms para apps Mac. Milisegundos de un dígito, menos de 1 GB, cero tokens, sin factura cloud.
Mi veredicto: si construís sobre Apple Silicon y tu problema son decisiones en vez de prosa, probalo esta semana — pip install laya-mlx y el snippet de cinco líneas de arriba es toda la evaluación. Solo respetá el presupuesto de 512/1,024 tokens y medí en tu propio chip antes de citar los números del M3 Max.
De un vistazo
- • laya-mlx v0.1.0 (19 sep 2026), Apache-2.0, port MLX no oficial
- • 7.39 ms P50 multilingüe / 13.42 ms EN, 395 q/s en batch, <1 GB pico
- • pip install laya-mlx → import laya_mlx → load aac6fef/laya-mlx


