Laya multilíngue: como o router escolhe o checkpoint certo por idioma e script?

O laya multilíngue vive em três checkpoints: laya (421M, contexto 512, inglês), laya-multilingual (322M, contexto 1024, 100+ idiomas) e laya-typed-decisions (421M, contexto 1024, quatro workflows). O Router é o ponto de entrada recomendado: detecta script em Python puro em menos de 0,5 ms, dá um palpite best-effort de idioma latino, escolhe o checkpoint e roda um único forward pass, carregando modelo sob demanda com despejo LRU. Instala com pip install laya (versão 0.3.4 no PyPI), inspeciona a decisão com route() e, se o tráfego alterna scripts, sobe max_loaded=2 pra evitar thrashing.
Fala aí, beleza? Decidir uma coisa só em inglês é a parte fácil
O problema aparece quando a mesma fila de decisão recebe alemão curto, tâmil, cirílico e khmer no mesmo minuto, e o modelo devolve tudo com confiança alta como se soubesse exatamente o que tá lendo
O Laya é uma família de modelos de decisão System 1 open source da Convai Innovations, publicada sob licença Apache 2.0, com lançamento em 18 de setembro de 2026. São três checkpoints diferentes e o ponto de entrada recomendado não é nenhum deles chamado na mão: é o Router, que detecta script e idioma por request e despacha pro checkpoint ideal em um único forward pass
Bora entender COMO essa escolha acontece, e onde ela erra 🙂
O que é o Laya e por que ele tem três checkpoints
Primeiro o porquê, que é o que economiza tempo depois
O Laya não gera texto. Ele é um modelo de decisão: você manda o estado e as perguntas com as opções, cada opção é pontuada no próprio token de máscara (o famoso MASK) e passa por softmax entre as opções daquela pergunta
Se você já mexeu com classificador de intenção, é primo disso, com uma diferença boa: o espaço de resposta é definido por request, sem retreino. Mudou as opções da pergunta? Só mandar as novas
Formação Claude Code
Domine Claude Code do absoluto zero até o avançado
- 120 aulas
- 4 projetos
- 9h 45min
No checkpoint multilíngue o orçamento é de 1024 tokens por pergunta, dos quais 256 ficam reservados pra pergunta e suas opções. Ou seja, o resto do contexto é pro estado que você empurra
A latência declarada pelo projeto é de 33 ms para uma pergunta e 7,2 ms por pergunta quando roda em lote, medido em GPU T4. Some isso com Apache 2.0, pesos abertos e zero assinatura de API e dá pra entender o barulho em volta do site oficial do Laya
E os três checkpoints existem porque "multilíngue" e "especialista" puxam o modelo pra lados diferentes. Um backbone só não dá conta dos dois sem perder de um lado
Laya, laya-multilingual e laya-typed-decisions: qual faz o quê
Os três vivem no Hugging Face, sob o mesmo dono: convaiinnovations/laya, convaiinnovations/laya-multilingual e convaiinnovations/laya-typed-decisions
| Checkpoint | Parâmetros | Contexto | Backbone | Cobertura | Indicado para |
|---|---|---|---|---|---|
laya |
421M | 512 tokens | ModernBERT-large (395M, bidirecional, totalmente fine-tunado) mais decision head treinado do zero | Inglês | Decisão geral em inglês |
laya-multilingual |
322M | 1024 tokens | mmBERT-base (307M) mais decision head treinado do zero (2 camadas transformer, option-marker scorer e head act/escalate) | Mais de 100 idiomas | Tudo que não é inglês |
laya-typed-decisions |
421M | 1024 tokens | ModernBERT-large (395M) mais decision head treinado do zero | Quatro workflows sintéticos | Observabilidade de agent-trace, atendimento ao cliente, processamento de notas fiscais e incidentes de segurança |
Repara numa coisa: o multilíngue é o MENOR dos três em parâmetros, mas é o que tem cobertura ampla de idioma. Tamanho aqui não é sinônimo de "melhor pro seu caso"
E tem o aviso que vem do próprio card do laya-typed-decisions: ele é um especialista, fine-tunado em quatro workflows sintéticos específicos. Fora deles, espere comportamento igual ao checkpoint base laya ou pior
Tome cuidado com isso, porque "typed-decisions" tem nome de bala de prata e não é
Como o router decide, passo a passo, em cada request
Antes do passo a passo, um mapa dos endereços, porque isso confunde: os checkpoints são publicados nas contas convaiinnovations/... no Hugging Face e o código do Router vive no repositório oficial do projeto, o NandhaKishorM/laya. Dois endereços, mesma família Laya
E é lá que o Router aparece como o ponto de entrada recomendado: ele detecta script e idioma em sub-milissegundos e despacha em um único forward pass
O pipeline, destrinchado:
- Detecção de script, em Python puro, ANTES do forward pass
O script é detectado em menos de 0,5 ms, antes de carregar ou rodar qualquer modelo. Quem faz isso é o módulo laya.lang, com detecção Unicode exata e 22 scripts cobertos: Devanagari, Han CJK, cirílico, árabe, hebraico, tâmil, tailandês, entre outros. A função é a detect_script
O erro comum deste passo: script que não está nas faixas cobertas some do radar. O Router trata script desconhecido como "sem letras" e cai no checkpoint padrão, que é o inglês
- Palpite best-effort de idioma latino
Quando o texto é latino, script não resolve sozinho: espanhol, italiano, alemão e inglês dividem o mesmo alfabeto. Aí entra a detect_language, que é explicitamente um palpite best-effort, não um detector definitivo
O erro comum deste passo: quando o palpite dá indeciso, o texto vira inglês por padrão. É exatamente isso que a issue aberta #54 relata (volto nela na seção de sintomas)
- Escolha do checkpoint
Com script e idioma na mão, o Router escolhe entre laya (inglês), laya-multilingual (100+ idiomas) e laya-typed-decisions
- Carregamento preguiçoso com despejo LRU
Os checkpoints são carregados sob demanda, com LRU eviction. Por padrão o Router mantém apenas UM checkpoint residente em memória (max_loaded=1)
O erro comum deste passo: tráfego que alterna scripts a cada request vira troca de modelo a cada request. O custo disso é brutal e tá documentado em issue (seção de sintomas de novo)
- Forward pass único
Aí sim roda a decisão, uma vez só, no checkpoint escolhido
O detalhe que eu acho mais massa: os passos 1 e 2 acontecem sem tocar em GPU. Você consegue inspecionar a decisão de roteamento sem pagar o preço de carregar modelo nenhum
Usando o Router na prática: instalação e API
- Instala o pacote
pip install laya
A versão disponível no PyPI é a 0.3.4
- Sobe o Router e roda a decisão
from laya import Router
router = Router()
router.predict(state, questions)
O predict() executa a decisão completa: detecta, escolhe, carrega se precisar e roda o forward pass
- Inspeciona a escolha SEM carregar modelo
router.route(state, questions)
O route() devolve a decisão de roteamento e a justificativa dela, sem carregar nada. Esse é o método que eu rodaria primeiro numa amostra do tráfego real antes de subir qualquer coisa
O erro comum deste passo: pular o route(), só olhar a saída final e depois ficar caçando por que a acurácia despencou em um idioma específico
- Força o checkpoint quando você JÁ sabe o caso
router.predict(state, questions, model="typed-decisions")
Se a request vem de uma fila que é, sempre, processamento de notas fiscais, não tem por que deixar o roteamento adivinhar
- Deixa mais de um checkpoint quente
router = Router(max_loaded=2)
Isso mantém dois checkpoints residentes em vez de um
E o custo de memória? Os três checkpoints somam cerca de 1,16B de parâmetros, aproximadamente 4,6 GB em fp32. Não é PC da Nasa, mas também não é de graça: é por isso que o padrão vem em 1 e a decisão de subir pra 2 é sua, olhando o perfil do seu tráfego
Por que isso importa em produto com base de usuários global
Aqui a conversa sai do papel
O laya-typed-decisions foi fine-tunado em quatro workflows sintéticos, e os resultados no benchmark typed-decisions, medidos em 400 casos de teste e 2.000 decisões no split oficial, são:
| Workflow | Resultado |
|---|---|
| Processamento de notas fiscais | 0,804 |
| Incidentes de segurança | 0,766 |
| Atendimento ao cliente | 0,764 |
| Observabilidade de agent-trace | 0,730 |
Traduzindo pro dia a dia:
- Fila de atendimento multilíngue: o mesmo ticket pode chegar em espanhol, alemão ou tâmil. Quem decide "resolve automático ou escala pro humano" é o head act/escalate, e o checkpoint certo pra esse texto é o multilíngue, não o inglês
- Triagem de incidentes de segurança: alerta entra, decisão sai, e 33 ms por pergunta muda o que dá pra colocar no caminho síncrono
- Processamento de notas fiscais: é o workflow com melhor número do especialista, e costuma ser o mais repetitivo, ou seja, o candidato perfeito pra forçar o checkpoint no
predict - Observabilidade de agent-trace: decisão em cima de trace de agente, que é justamente onde chamar um LLM gerador pra cada passo fica caro rápido
E quando NÃO usar o especialista? Quando seu workflow não é um desses quatro. O card avisa na cara: fora deles, espere comportamento igual ao base ou pior. Não adianta chutar model="typed-decisions" porque o nome soa mais sofisticado 😛
Quando o router erra: sintomas conhecidos e como contornar
Agora a parte que ninguém coloca no README bonitinho. Tem coisa documentada em issue aberta, e é bom você saber antes e não depois
O checkpoint inglês colapsa em silêncio fora do alfabeto latino
Sintoma: resposta errada com confiança alta, sem nenhum sinal de incerteza
Causa: no sweep de 51 idiomas, o checkpoint inglês marca 0,000 de acurácia em khmer reportando 0,952 de confiança. E a confiança média dele nunca cai abaixo de 0,885 nos 51 idiomas
Contorno: não dá pra usar confiança como guardrail (limite) nesse checkpoint. O filtro tem que ser o roteamento, não o score
Alemão curto tratado como inglês (Issue #54)
Sintoma: acurácia despenca em textos curtos em alemão
Causa: a issue #54 relata que o Router manda 64% do alemão curto pro checkpoint inglês, custando 20 pontos no MASSIVE de. O lang.py calcula is_english como lang in (None, "en"), ou seja, idioma indeciso vira inglês
Contorno: o relato mostra que passando o idioma explicitamente (visto como lang="de" no teste com laya 0.3.4, n=200) o resultado sobe para 0,535. Se você já sabe o idioma do usuário, informe, não deixe adivinhar
Thrashing de checkpoint com max_loaded=1 (Issues #172 e #137)
Sintoma: latência absurda, na casa dos segundos, em tráfego que deveria ser de milissegundos
Causa: a issue #172 relata que com max_loaded=1 e scripts alternados o Router recarrega checkpoint a cada request: 21.000 ms contra 50 a 136 ms com max_loaded=2 nos mesmos inputs. A issue #137 descreve o mesmo thrashing com requests heterogêneos alternados
Contorno: Router(max_loaded=2) quando o tráfego alterna. Prevenção: se der, agrupa requests do mesmo script em lote, que aí você ainda pega os 7,2 ms por pergunta
A mesma issue #172 traz outro detalhe importante: espanhol e italiano também aparecem roteados pro inglês, e a MESMA reclamação, quando vai pro multilíngue, volta com 0,96 a 0,99 de confiança contra 0,535 quando cai no inglês
Armênio caindo na rota inglesa (Issue #20)
Sintoma: texto em armênio indo pro checkpoint padrão
Causa: a issue #20 mostra que caracteres armênios passam no isalpha(), mas _SCRIPT_RANGES não tinha entrada para armênio. Resultado: detect_script e script_profile descartavam o texto, e script desconhecido é tratado como "sem letras", caindo no inglês
Contorno: o PR #23 propõe adicionar o bloco Unicode armênio às faixas de script compartilhadas. Enquanto isso, forçar o checkpoint ou o idioma resolve na sua ponta
O padrão dos quatro casos é o mesmo, se liga: o erro quase nunca é o modelo decidindo mal, é o ROTEAMENTO mandando o texto pro checkpoint errado. Por isso o route() é tão útil
Vídeo: fundamentos para acompanhar os exemplos
Pra quem quer firmar a base de programação antes de sair mexendo em Router e benchmark, este vídeo do canal apresenta o Curso Completo de JavaScript
Conclusão
O veredito de uso é curtinho:
- Router como entrada padrão, sempre. Chamar checkpoint na mão só quando você JÁ sabe o workflow
max_loaded=2quando o tráfego alterna scripts, porque 21.000 ms contra 50 a 136 ms não é detalhelangexplícito quando o idioma do usuário já é conhecido no seu produto, pra não depender do palpite best-effort- Especialista só nos quatro workflows dele, o resto vai de base ou multilíngue
Próximo passo prático: instala com pip install laya, roda route() em cima de uma amostra real do seu tráfego e olha a justificativa de cada decisão ANTES de subir em produção. Vale acompanhar as issues abertas também, que é onde os cantos escuros do roteamento estão aparecendo
E se você tá no Apple Silicon, existe runtime alternativo de terceiro: o laya-mlx, runtime MLX nativo mantido no repositório mizorewww/laya-mlx, fora do repositório oficial NandhaKishorM/laya
Faça o teste com o seu idioma e me conta o que o route() respondeu, tô curioso pra saber se o português curto escapa ou não do checkpoint inglês 😀
Até o próximo post!
Perguntas frequentes
Como forçar o Router a usar um checkpoint específico sem depender da detecção automática de idioma?
Dá pra passar o parâmetro model direto no predict, tipo router.predict(state, questions, model="typed-decisions")
Isso pula a detecção de script e idioma e manda a request direto pro checkpoint escolhido
É a saída mais segura quando você já sabe o domínio da pergunta e não quer arriscar um palpite errado
Por que o Router manda alemão curto pro checkpoint em inglês mesmo com o multilíngue instalado?
É o comportamento descrito na issue #54: quando o palpite de idioma dá indeciso, o lang.py trata isso como inglês, porque a checagem é lang in (None, "en")
No teste reportado com a versão 0.3.4 e n=200, 64% do alemão curto foi parar no checkpoint inglês, e esse roteamento errado custou 20 pontos no MASSIVE de
Passando lang="de" explícito na chamada, o resultado sobe pra 0,535, então o contorno prático é não depender só do palpite automático em textos curtos
Vale a pena configurar max_loaded=2 no Router pra tráfego multilíngue?
Segundo a issue #172, com max_loaded=1 e scripts alternando a cada request o Router recarrega o checkpoint toda hora, e isso custou 21.000 ms contra 50 a 136 ms nos mesmos inputs com max_loaded=2
Se o seu tráfego mistura idiomas request a request, manter dois checkpoints quentes evita esse thrashing (também documentado na issue #137)
O trade off é memória: os três checkpoints juntos somam cerca de 1,16B de parâmetros, uns 4,6 GB em fp32
O Router já suporta texto em armênio ou ainda cai no checkpoint errado?
O problema original, relatado na issue #20, era que caracteres armênios passavam no isalpha() mas o _SCRIPT_RANGES não tinha faixa Unicode pra armênio, então o texto era tratado como "sem letras" e ia pro checkpoint inglês padrão
O PR #23 adicionou o bloco Unicode armênio às faixas de script compartilhadas, corrigindo a detecção nesse ponto específico
Vale checar se a sua instalação já inclui esse PR antes de assumir que scripts menos comuns funcionam de primeira
Existe alguma forma de rodar o Laya fora do runtime Python oficial?
Sim, existe o laya-mlx, um runtime MLX nativo mantido no repositório mizorewww/laya-mlx
Ele é de terceiros e fica fora do repositório oficial NandhaKishorM/laya, então não tem o mesmo aval do projeto principal
Se seu caso de uso é Apple Silicon, é a opção que existe hoje, mas trate como comunidade, não como oficial
O checkpoint laya-typed-decisions serve pra qualquer tipo de decisão, não só os quatro workflows dele?
Não, e o próprio card do modelo avisa isso: ele foi fine-tunado especificamente em observabilidade de agent-trace, atendimento ao cliente, processamento de notas fiscais e incidentes de segurança
Nos benchmarks desses quatro casos ele fica entre 0,730 e 0,804, medidos em 400 casos de teste e 2.000 decisões
Fora desses workflows, o próprio projeto diz pra esperar comportamento igual ao checkpoint base laya ou pior, então não é a escolha certa pra decisão genérica
Formações
Formação Vibe Coding
Do Prompt ao Produto: Crie Software Real com IA
- 474 aulas
- 20 projetos
- 39h 27min
Blog | Mais populares

Choice, score e noul: quais são os tipos de pergunta do Laya e quando usar cada um?
Entenda os tipos de pergunta do Laya: choice, score e noul. Como cada um funciona, a acurácia de cada primitiva e quando usar em cada situação.

Como usar o laya para detectar phishing, spam e risco de churn em texto, email e ticket?
Veja como o laya detecta phishing, spam e risco de churn em texto, email e ticket com scores calibrados, rodando local via pip install.

Como fazer triagem de tickets de suporte com o laya: urgência, frustração e departamento
Triagem de tickets com laya: urgência, frustração e departamento em um forward pass, sem JSON. Veja instalação, código e a ressalva do zero-shot.
