Laya Snake: demo de terminal local
Um jogo Snake de verdade guiado por previsões do Laya MLX em Apple silicon, com um layout de terminal projetado para um clipe social legível. O painel esquerdo mostra o tabuleiro, a pontuação, o comprimento e a melhor pontuação. O painel direito mostra quatro probabilidades de direção, o movimento executado, duas estimativas do modelo, o tempo de inferência medido, a taxa de decisões e o status local/offline.

Execução
A partir deste repositório, em um Mac com Apple silicon:
uv run --extra demo laya-snake
O modelo padrão é aac6fef/laya-multilingual-mlx, usando os pesos FP16 originais. A demo primeiro verifica models/hub/laya-multilingual-mlx e models/laya-multilingual, depois o cache local do Hugging Face. Ela nunca baixa um modelo ausente durante o jogo. Em um checkout novo, baixe os pesos uma vez antes:
uv run --extra demo hf download aac6fef/laya-multilingual-mlx \
--local-dir models/hub/laya-multilingual-mlx
uv run --extra demo laya-snake
Use um terminal com pelo menos 104 colunas × 35 linhas, com fonte monoespaçada e true color. Menlo funciona bem no macOS. Um terminal menor pausa o jogo até ser redimensionado. O tamanho padrão do tabuleiro é 24 × 16, o comprimento inicial é 6 e a meta de apresentação é 12 decisões/segundo.
A exibição ao vivo respeita NO_COLOR. Se o seu shell o define, use env -u NO_COLOR uv run --extra demo laya-snake para a apresentação colorida. O benchmark ativa explicitamente o true color, para que essa configuração de ambiente não altere silenciosamente sua carga de trabalho de renderização.
| Controle | Ação |
|---|---|
| Espaço | Pausa / retoma |
| ↑ / ↓, ou + / − | Aumenta / diminui a meta com cadência em 2 decisões/segundo |
| R | Inicia uma nova rodada com a próxima seed |
| Q ou Ctrl-C | Encerra e restaura o terminal |
Modos úteis:
# Every move waits for a new inference, with no pacing delay.
uv run --extra demo laya-snake --max-speed
# Optional measured compilation + prefix-reuse path.
uv run --extra demo laya-snake --optimize --max-speed
# Use the fixed computation-budget setting validated on the recorded M3 Max.
uv run --extra demo laya-snake --fps 20
# Execute the model's raw first choice without the execution safety shield.
uv run --extra demo laya-snake --unassisted
# A finite run without a terminal display.
uv run --extra demo laya-snake --headless --steps 600 --max-speed
--model aceita um diretório local ou um ID do Hub já em cache. --width, --height, --seed e --initial-length configuram uma execução. Os tabuleiros devem ter pelo menos 4 × 4 com uma dimensão par, porque o planejador de segurança usa um ciclo hamiltoniano. As teclas de velocidade afetam o modo com cadência; --max-speed sempre avança assim que a decisão atual termina.
Gravar e exportar
A gravação contém estados reais do tabuleiro, probabilidades originais do modelo, ações executadas, tempos, proveniência do modelo e resumos da execução. Cada tabuleiro é pareado com a previsão feita antes de seu próximo movimento.
uv run --extra demo laya-snake --fps 12 --duration 100 \
--record artifacts/snake/run.jsonl
# ffmpeg is required for video export; on macOS: brew install ffmpeg
uv run --extra demo laya-snake export artifacts/snake/run.jsonl \
--start 65 --seconds 30 --output artifacts/snake/demo.mp4 \
--gif artifacts/snake/demo.gif
uv run --extra demo laya-snake export artifacts/snake/run.jsonl \
--start 85 --output artifacts/snake/poster.png
A exportação de MP4 usa por padrão 1920 × 1080, 30 quadros de vídeo/segundo, H.264 e velocidade de relógio de parede original. Ela renderiza as mesmas células de terminal a partir dos dados gravados; é uma reprodução renderizada, e não uma captura de tela. Um rótulo visível RECORDED RUN · 1× e um sidecar JSON identificam isso. Exportar a 30 FPS não transforma um jogo de 12 decisões/segundo em um de 30 decisões/segundo. Em cada carimbo de tempo do vídeo, o exportador usa o quadro de origem real mais recente. Gravações rápidas podem ter mais decisões do que a taxa de quadros escolhida consegue exibir.
Use --headless ao gravar sem um terminal anexado. A inferência do modelo continua acontecendo a cada movimento; o desenho ao vivo do terminal é omitido. Os arquivos de saída não são sobrescritos. Inicie uma nova gravação ao mudar a apresentação ou a velocidade, em vez de misturar pausas ou reinícios em um trecho social curto.
O MP4 usa por padrão um trecho de 30 segundos, e --gif exporta seus primeiros 15 segundos no mesmo ritmo original. Use --gif-seconds para mudar a duração do GIF. Os ativos sociais fornecidos incluem os dois formatos mais um pôster PNG.
O que a IA faz
Esta é uma demo de decisão neural assistida por features, usando o checkpoint Laya existente sem treinamento em Snake. Um planejador determinístico descreve direções legais, progresso seguro no ciclo e conectividade atual de células vazias. O Laya recebe essas descrições, incluindo qual direção segura faz o maior progresso. Ele retorna uma distribuição sobre UP, DOWN, LEFT e RIGHT. As barras de probabilidade são essas saídas originais do modelo.
O escudo de segurança padrão executa a direção admissível de maior probabilidade do modelo. Se a primeira escolha bruta for inadmissível, a UI mantém essa distribuição original e marca o movimento executado com SHIELD; o contador de intervenções aumenta. A execução padrão é rotulada Laya + cycle safety. --unassisted desativa essa restrição de execução; ainda fornece ao modelo as features do planejador. Nenhum dos modos estabelece que o checkpoint consegue inferir a estratégia do Snake a partir de um tabuleiro não processado.
Uma chamada de Agent.predict agrupa três perguntas reais por movimento:
| Exibição | Significado real |
|---|---|
| NEXT MOVE | probabilidades choice do Laya sobre as quatro direções descritas |
| DEAD-END RISK | 1 − P(safe route available), a partir de uma resposta noul do Laya |
| FOOD REACHABLE | resposta noul do Laya sobre o resumo de alcançabilidade das células vazias atuais fornecido |
| INFERENCE | tempo de relógio de parede sincronizado do Agent.predict, incluindo tokenização e conversão do resultado |
| DECISIONS | taxa recente medida de decisões concluídas |
| NETWORK OFFLINE | carregamento local do checkpoint e inferência local com o modo offline do Hub; isto não desliga o Wi-Fi do Mac |
As duas estimativas são saídas do modelo, não probabilidades calibradas de morte no Snake. A alcançabilidade atual das células vazias também difere da alcançabilidade futura após a cauda se mover. O risco pode permanecer baixo por muito tempo porque o planejador fornece uma rota segura. Nenhum valor aleatório ou previsão pré-gravada é substituído durante o jogo ao vivo.
O escudo de ciclo preserva a ordem cíclica do corpo e nunca avança além da cauda ou da comida. Toda ação admitida faz progresso positivo rumo à comida atual. Para um tabuleiro inicialmente válido, isso dá um sucessor seguro disponível e um limite finito de progresso rumo à comida. Os testes exercitam escolhas arbitrárias entre ações admissíveis até um tabuleiro ficar cheio.
Reproduza o teste de velocidade
uv run --extra demo laya-snake benchmark \
--rates 10,12,15,18,20,25,30,35,40,45,50,60 \
--sweep-steps 120 --soak-steps 600 --seeds 101,102,103,104 \
--output artifacts/snake/benchmark.json
Use --resume --output artifacts/snake/benchmark.json para manter os episódios concluídos e retomar a configuração gravada. Cada relatório identifica o checkpoint, o prompt, o ambiente e o hash da origem. Uma taxa reprovada não precisa de mais seeds; uma taxa aprovada precisa concluir toda seed solicitada.
O benchmark mede inferência do modelo, planejamento, composição com Rich, serialização ANSI em memória e atualizações do jogo. Ele exclui carregamento do modelo, warmup e a pintura do próprio emulador de terminal. Episódios sem teto medem os movimentos/segundo sustentados reais. Episódios com cadência verificam separadamente se pelo menos 99% dos ticks ativos cabem no orçamento de computação solicitado, em cada seed. O excesso por suspensão do SO continua incluído na taxa alcançada relatada.
A execução final truecolor no M3 Max concluiu 8,160 decisões com zero mortes, incluindo 2,400 passos sem teto a 63.61 passos/segundo no geral. Sua maior configuração de orçamento de computação testada e aprovada foi 20 FPS, com uma taxa com cadência alcançada de 18.69–18.94 passos/segundo. Configurações com cadência mais alta falharam no critério de prazo declarado, enquanto o jogo permanecia vivo. Veja o relatório completo do benchmark do Snake para resultados por seed, intervenções e limitações.
Para um clipe social, a meta padrão de 12 FPS dá aos espectadores tempo para ver a direção selecionada e a pontuação crescente. --max-speed demonstra a vazão medida. O vídeo de 30 segundos incluído preserva o ritmo original de sua execução de origem.