O registro próprio que o relatório do 6º Encontro prometeu: entre ~10h e 11h de 11/07/2026, a turma apontou seus modelos locais para um servidor de Minecraft e cada LLM virou um bot de verdade — percebendo o mundo, decidindo em JSON e executando a ação no pulso seguinte. Este é o experimento central do TCC: os mesmos modelos, hardwares completamente diferentes, uma única pergunta — quem aguenta um loop de 3 segundos?
Ciclos de decisão gravados no banco por minuto — cada ciclo é uma chamada de LLM que virou (ou tentou virar) uma ação no jogo. O vale no tráfego da Arena entre 10h e 11h era isto aqui.
Latência mediana por decisão nas configurações que produziram JSON válido (≥75%). O loop do bot pulsa a cada 3 s — só o gemma3:1b, em GPU dedicada ou Apple Silicon, fica do lado certo da linha.
Mediana de tokens/s medida no hub, todas as configurações com 20+ ciclos — incluindo os modelos "thinking" (🤔), cujo desempenho vale mesmo com as respostas descartadas. O mesmo gemma3:1b rende 60 tok/s no M3 Pro e 53 na RTX 2050; o granite4.1:8b, que não cabe nos 4 GB da GTX 1650, se arrasta a 2 tok/s.
Cada ciclo é cronometrado em dois pontos: no bot (llm_response_time_ms, que inclui rede e fila) e dentro do hub (hub_duration_ms e hub_ttft_ms, medidos no evento llm.complete, sem ruído de rede). A diferença entre os dois é o custo da infraestrutura — mediana de 90 ms (p95: 362 ms), ou seja, a latência é quase toda inferência mesmo: o hub não é o gargalo. Tokens/s calculado nas duas pontas concorda; cada decisão consome ~1.300 tokens de contexto de entrada. Valores são medianas (p50).
| Modelo | Hardware | Ciclos | Resposta (bot) | Duração (hub) | Overhead | TTFT (hub) | tok/s (bot) | tok/s (hub) | Tok. entrada | Tok. saída |
|---|---|---|---|---|---|---|---|---|---|---|
| gemma3:1b | RTX 2050 · 16GB | 187 | 2.4 s | 2.3 s | 92 ms | 2.3 s | 49.4 | 52.5 | 1411 | 122 |
| llama3.2:latest | M2 · 8GB | 124 | 5.7 s | 5.6 s | 61 ms | 5.6 s | 18.0 | 18.3 | 1595 | 102 |
| qwen2.5:0.5b | Radeon iGPU · 7GB | 116 | 9.7 s | 9.5 s | 75 ms | 9.5 s | 11.9 | 12.1 | 1498 | 115 |
| gemma3:1b | M3 Pro · 18GB | 110 | 1.7 s | 1.6 s | 99 ms | 1.6 s | 54.5 | 60.1 | 1370 | 94 |
| qwen3.5:2b-mlx | M2 Pro · 16GB | 107 | 4.8 s | 4.7 s | 109 ms | 4.7 s | 53.0 | 54.6 | 1165 | 256 |
| gemma3:4b | M2 Pro · 16GB | 94 | 4.2 s | 4.2 s | 63 ms | 4.2 s | 25.2 | 25.8 | 1257 | 108 |
| qwen3.5:2b | CPU only · 24GB | 77 | 14.5 s | 14.5 s | 58 ms | 14.5 s | 17.6 | 17.7 | 1241 | 256 |
| qwen3.5:2b | Iris Xe · 16GB | 60 | 37.2 s | 37.1 s | 64 ms | 37.1 s | 6.9 | 6.9 | 1242 | 256 |
| gemma4:12b | M3 Pro · 18GB | 52 | 19.7 s | 19.6 s | 100 ms | 19.6 s | 13.0 | 13.0 | 1187 | 256 |
| qwen3.5:4b | RTX 2050 · 16GB | 50 | 22.7 s | 22.6 s | 78 ms | 22.6 s | 11.3 | 11.3 | 1168 | 256 |
| granite4.1:3b | CPU only · 10GB | 38 | 24.3 s | 24.1 s | 114 ms | 24.1 s | 5.5 | 5.5 | 1299 | 132 |
| qwen3.5:2b | M3 Pro · 18GB | 30 | 6.0 s | 5.7 s | 183 ms | 5.7 s | 42.8 | 44.6 | 1021 | 256 |
| granite4.1:8b | GTX 1650 · 14GB | 29 | 76.8 s | 76.7 s | 58 ms | 76.7 s | 2.2 | 2.2 | 1437 | 168 |
| qwen3.5:4b | CPU only · 15GB | 26 | 99.2 s | 99.2 s | 71 ms | 99.2 s | 2.6 | 2.6 | 1231 | 256 |
| qwen3.5:2b | CPU only · 16GB | 24 | 37.4 s | 37.1 s | 156 ms | 37.1 s | 6.8 | 6.9 | 1263 | 256 |
| qwen3.5:2b | CPU only · 10GB | 10 | 35.7 s | 35.6 s | 95 ms | 35.6 s | 7.2 | 7.2 | 1021 | 256 |
Todas as configurações com 10+ ciclos. JSON válido mede aderência ao formato; ação OK mede se o comando decidido executou no jogo.
| Modelo | Hardware | Ciclos | p50 | tok/s | JSON válido | Ação OK | Observação |
|---|---|---|---|---|---|---|---|
| gemma3:1b | RTX 2050 · 16GB | 187 | 2.4 s | 52.5 | 100% | 96% | ✅ sustenta o loop |
| llama3.2:latest | M2 · 8GB | 124 | 5.7 s | 18.3 | 99% | 96% | ✅ sustenta o loop |
| qwen2.5:0.5b | Radeon iGPU · 7GB | 116 | 9.7 s | 12.1 | 77% | 72% | no limite: erra ~1 em 4 respostas |
| gemma3:1b | M3 Pro · 18GB | 110 | 1.7 s | 60.1 | 91% | 95% | ✅ sustenta o loop |
| qwen3.5:2b-mlx | M2 Pro · 16GB | 107 | 4.8 s | 54.6 | 0% | — | 🤔 estourou os 256 tokens pensando |
| gemma3:4b | M2 Pro · 16GB | 94 | 4.2 s | 25.8 | 100% | 89% | ✅ sustenta o loop |
| qwen3.5:2b | CPU only · 24GB | 77 | 14.5 s | 17.7 | 0% | — | 🤔 estourou os 256 tokens pensando |
| qwen3.5:2b | Iris Xe · 16GB | 60 | 37.2 s | 6.9 | 0% | — | 🤔 estourou os 256 tokens pensando |
| gemma4:12b | M3 Pro · 18GB | 52 | 19.7 s | 13.0 | 0% | — | 🤔 estourou os 256 tokens pensando |
| qwen3.5:4b | RTX 2050 · 16GB | 50 | 22.7 s | 11.3 | 0% | — | 🤔 estourou os 256 tokens pensando |
| granite4.1:3b | CPU only · 10GB | 38 | 24.3 s | 5.5 | 97% | 89% | correto, mas lento demais |
| smollm2:135m | Iris Xe · 8GB | 36 | — | — | — | — | hub fora do ar — sem dados |
| qwen3.5:2b | M3 Pro · 18GB | 30 | 6.0 s | 44.6 | 0% | — | 🤔 estourou os 256 tokens pensando |
| granite4.1:8b | GTX 1650 · 14GB | 29 | 76.8 s | 2.2 | 100% | 79% | correto, mas lento demais |
| qwen3.5:4b | CPU only · 15GB | 26 | 99.2 s | 2.6 | 0% | — | 🤔 estourou os 256 tokens pensando |
| qwen3.5:2b | CPU only · 16GB | 24 | 37.4 s | 6.9 | 0% | — | 🤔 estourou os 256 tokens pensando |
| qwen3.5:latest | CPU only · 7GB | 15 | — | — | — | — | hub fora do ar — sem dados |
| qwen3.5:2b | CPU only · 10GB | 10 | 35.7 s | 7.2 | 0% | — | 🤔 estourou os 256 tokens pensando |
O achado mais importante do dia não estava no plano: 424 ciclos voltaram com resposta vazia — todos com exatamente 256 tokens de saída. Os modelos com raciocínio explícito (qwen3.5, gemma4:12b) gastaram o orçamento inteiro de LLM_MAX_OUTPUT_TOKENS=256 pensando e nunca chegaram a falar. Sob restrição de tempo real, o "pensar antes de agir" custou a ação inteira. As métricas de velocidade deles valem; as de qualidade viraram um retrato do trade-off, não do modelo.
Por modelo, sobre os ciclos em que o hub respondeu (erros de infraestrutura contados à parte). "Reparado" são respostas que chegaram como JSON quebrado e o jsonrepair salvou — elas contam como válidas. O contraste é brutal: ou o modelo acerta o formato quase sempre, ou nunca.
| Modelo | Ciclos | Erro de hub | JSON válido | Reparado | Falha de parse |
|---|---|---|---|---|---|
| gemma3:4b | 94 | 0.0% | 100.0% | 0.0% | 0.0% |
| granite4.1:8b | 29 | 0.0% | 100.0% | 3.4% | 0.0% |
| llama3.2:latest | 124 | 0.0% | 99.2% | 8.9% | 0.8% |
| gemma3:1b | 297 | 0.0% | 96.6% | 2.0% | 3.4% |
| granite4.1:3b | 38 | 23.7% | 96.6% | 0.0% | 3.4% |
| qwen2.5:0.5b | 116 | 0.9% | 76.5% | 7.8% | 23.5% |
| qwen3.5:2b 🤔 | 201 | 5.5% | 0.0% | 0.5% | 100.0% |
| qwen3.5:2b-mlx 🤔 | 107 | 0.0% | 0.0% | 0.0% | 100.0% |
| qwen3.5:4b 🤔 | 76 | 0.0% | 0.0% | 0.0% | 100.0% |
| gemma4:12b 🤔 | 52 | 7.7% | 0.0% | 0.0% | 100.0% |
| smollm2:135m | 36 | 100.0% | — | — | — |
| qwen3.5:latest 🤔 | 15 | 100.0% | — | — | — |
Cada ordem do jvras58 ficou visível no prompt por até 5 ciclos. O placar moral: obediência não correlacionou com velocidade.
| Ordem | Quem obedeceu | Quem ignorou |
|---|---|---|
| "me segue" | Carangueijo0 (SEGUIR ×3, a 77 s por decisão), Bardo, amarante | almir — o bot mais rápido do dia preferiu EXPLORAR ×20 |
| "GREC coleta madeira" | Bardo, amarante e Carangueijo0 saíram coletando | o próprio GREC, que ficou de OLHAR |
| "calegario pegue bife" | calegario tentou (EXPLORAR → ANDAR → PAROU) — não havia bife | almir, de novo |
| "GREC va seguir sua vida" | Bardo e Carangueijo0 entenderam literalmente: SEGUIR ✕ 4 | a ironia passou batida por todos os modelos |
Distribuição das 650 ações válidas (os 502 ciclos sem resposta utilizável caíram no fallback EXPLORAR, fora desta contagem). Um dia pacífico: 1 ATACAR contra 235 EXPLORAR.
A entropia da distribuição de ações mede a variedade do comportamento de cada modelo, em bits: 0 = escolheu sempre a mesma ação; 3,32 = usou as 10 ações por igual. Calculada sobre as ações válidas dos modelos com 20+ decisões. Nem pouca nem muita entropia é "melhor" — mas um agente que só sabe EXPLORAR não está decidindo, está repetindo.
O raio-x completo da qualidade de decisão por modelo:
| Modelo | Ações válidas | Ação OK | Execução p50 | Ação favorita | Entropia (bits) |
|---|---|---|---|---|---|
| gemma3:1b | 287 | 95.8% | <1 ms | EXPLORAR (52%) | 2.00 |
| llama3.2:latest | 123 | 95.9% | <1 ms | EXPLORAR (43%) | 2.52 |
| gemma3:4b | 94 | 89.4% | <1 ms | COLETAR (32%) | 2.54 |
| qwen2.5:0.5b | 88 | 71.6% | 1684 ms | COLETAR (59%) | 1.99 |
| granite4.1:8b | 29 | 79.3% | <1 ms | FALAR (31%) | 2.53 |
| granite4.1:3b | 28 | 89.3% | <1 ms | ANDAR (32%) | 2.31 |
} que o modelo esqueceu.