---
title: "Laya — alternativa local ao Jev para decisões classificadas"
description: "O pacote @receptron/laya executa o modelo Laya (Convai Innovations) via ONNX Runtime diretamente no Node.js, sem Python ou PyTorch no runtime. É uma alternativa ao Jev que roda localmente e já é usado no Linboto para classificar posts do LinkedIn."
canonical: "https://ronanrodrigo.dev/notes/laya-local-decision-model"
markdown: "https://ronanrodrigo.dev/notes/laya-local-decision-model.md"
last-updated: "2026-10-08"
---
## Laya — modelo de decisão System 1 via ONNX Runtime

O [receptron/laya](https://github.com/receptron/laya) publica o `@receptron/laya`, um pacote Node.js / TypeScript que executa o modelo **Laya** (Convai Innovations) via ONNX Runtime. O modelo não gera texto: recebe um estado (como um ticket, um e-mail ou um objeto JSON) e perguntas tipadas, e retorna respostas calibradas (`choice`, `score`, `noul`) em uma única passagem (`systemOne`). Os pesos (~1,7 GB, fp32) são baixados do Hugging Face na primeira execução e ficam em cache (`~/.cache/receptron-laya`). O runtime usa apenas ONNX Runtime — PyTorch e Python não são necessários.

O Laya é descrito como uma alternativa ao Jev (TypeSafe Jev / System One) com latência substancialmente menor (~32–40 ms no checkpoint inglês em GPU) e mesma compatibilidade de protocolo (`v1/systemone`). Os resultados coincidem com a implementação Python em quatro casas decimais. A licença do código é MIT; os pesos são Apache 2.0.

## Uso local no Linboto para classificar posts do LinkedIn

No projeto [Linboto](https://github.com/ronanrodrigo/linboto) (SwiftUI, macOS + Finder Sync), o adaptador `LayaLocalRelevanceEvaluator` (`Packages/Infrastructure/Sources/Infrastructure/LLM/LayaLocalRelevanceEvaluator.swift`) consome um servidor `laya-serve` local em loopback (`127.0.0.1:8000`), sem nenhuma credencial (`Authorization`), para classificar a relevância de conteúdos candidatos a posts públicos. O mesmo wire protocol (`POST /v1/systemone`) do JEV é reaproveitado, permitindo que o app alterne entre o backend remoto (`.jev`, via OpenRouter) e o local (`.local`) sem mudar o contrato de resposta (`TypeSafeSystemOneResponse`). A medição direta no ticket #400 (ADR 0072) confirmou que o checkpoint `multilingual` (não `english`) é o padrão adequado para conteúdo em português.
