File size: 15,480 Bytes
8f6b7b7 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 | ---
title: Minecraft Friends AI ZeroGPU
emoji: 🧠
colorFrom: blue
colorTo: green
sdk: gradio
sdk_version: 6.27.0
python_version: '3.12'
app_file: app.py
pinned: false
---
# Programa — Naldo autônomo + endpoint CPU
O controlador padrão do `Naldo_Bot` é o **AltoClef 0.19** (comando `@gamer`,
speedrun survival real: equipamento, stronghold, dragão) com supervisão de
alto nível via **OpenCode Muse** (`muse-spark-1.3-contributor-free`). Mundo
**Survival / Normal**, mapa atual inalterado; o inventário existente do Naldo
é mantido (run assistida, sem itens dados nem teleporte). Status ao vivo em
`GET /opencode-bot/status` e log em `GET /opencode-bot/log`. O Voyager antigo
continua disponível apenas como alternativa manual (`VOYAGER_AUTOSTART=0` por
padrão); as seções Voyager abaixo são o legado manual.
## Endpoint local de compatibilidade (Granite)
O endpoint OpenAI-compatible público continua disponível para clientes antigos e
para os componentes locais auxiliares. Ele não é mais o cérebro generativo do
`Naldo_Bot`; o Naldo usa OpenCode conforme a seção seguinte.
- GGUF oficial: `ibm-granite/granite-4.0-h-tiny-GGUF`
- Arquivo: `granite-4.0-h-tiny-Q4_K_M.gguf`
- Revisão fixada: `08d5a8a9741dd5c1a95d2d39e25253226aa1464e`
- Quantização: `Q4_K_M`
- Arquitetura: Granite 4.0 H-Tiny MoE/Mamba2, 7B totais e ~1B parâmetros ativos
- Contexto operacional do Voyager: 8.192 tokens
- Saída padrão: 384 tokens
- Saída máxima: 512 tokens
- Alias principal: `granite-4.0-h-tiny`
- CPU: 16 threads de decode e 16 threads de prefill/batch
Os aliases antigos permanecem aceitos apenas para compatibilidade de clientes e
continuam roteando para o Granite local. O Voyager do Naldo não usa esses aliases
para geração.
## Cérebro do Naldo_Bot: OpenCode Muse + AltoClef (legado manual Voyager abaixo)
O Naldo ativo é o AltoClef 0.19 (`@gamer`) supervisionado pelo OpenCode Muse;
o restante desta seção descreve o legado manual do Voyager (alternativa
manual, `VOYAGER_AUTOSTART=0` por padrão).
Action, Curriculum, Critic e Skill Manager do `Naldo_Bot` usam uma ponte
OpenAI-compatible local em `127.0.0.1:7864`, que traduz as chamadas do Voyager
para um servidor `opencode serve` preso ao loopback em `127.0.0.1:7865`.
- OpenCode pinado: `opencode-ai@1.18.33`, instalado localmente no runtime sem `npm -g`.
- Provider: `opencode`.
- Modelo principal: `muse-spark-1.3-contributor-free`.
- Fallbacks: `fledge-alpha-free` e `nemotron-3-ultra-free`, somente do provider OpenCode gratuito.
- Nenhuma credencial do usuário é copiada; o processo recebe HOME/XDG próprios no runtime.
- As mensagens de inferência enviam `tools: {}`. No OpenCode 1.18.33 isso foi validado
sem execução de bash/arquivos; permissões customizadas de sessão não são usadas porque
o Zen gratuito as rejeita com `FreeTierError`.
- O bridge não inventa suporte a `temperature`/`max_tokens`: registra os valores pedidos
e preserva a resposta integral, evitando cortar JavaScript do Action Agent.
- Embeddings continuam locais em `127.0.0.1:7860/v1/embeddings`.
- Se OpenCode ou bridge morrerem, o supervisor interrompe o Naldo e recupera o cérebro
antes de religar o bot; não existe fallback generativo para Granite ou Gemini.
O Curriculum em Creative continua usando o estado real e os checkpoints persistentes.
A conclusão da tarefa continua exigindo verificação independente do mundo.
Referência do modelo:
https://huggingface.co/ibm-granite/granite-4.0-h-tiny-GGUF
## Embeddings
O Voyager original usa embeddings no SkillManager e no cache de QA do CurriculumAgent.
- Modelo oficial: `Qwen/Qwen3-Embedding-0.6B-GGUF`
- Arquivo: `Qwen3-Embedding-0.6B-Q8_0.gguf`
- Revisão fixada: `370f27d7550e0def9b39c1f16d3fbaa13aa67728`
- Pooling: LAST, conforme documentação do Qwen3 Embedding para llama.cpp
- Vetores normalizados
- Alias OpenAI-compatible: `text-embedding-ada-002`
Referência:
https://huggingface.co/Qwen/Qwen3-Embedding-0.6B-GGUF
## Inferência local somente em CPU
A inferência Granite e os embeddings locais não usam GPU:
- `CUDA_VISIBLE_DEVICES=""`
- `HIP_VISIBLE_DEVICES=""`
- `ROCR_VISIBLE_DEVICES=""`
- `GGML_VK_VISIBLE_DEVICES=""`
- `n_gpu_layers=0`
- `offload_kqv=False`
- `op_offload=False`
- wheel CPU do `llama-cpp-python==0.3.35`
- threads detectadas por affinity/cgroup
- mmap ativado
- chamadas de geração serializadas para evitar disputa de CPU
O decorador `@spaces.GPU` existente é somente a sentinela exigida pelo host ZeroGPU;
a função não é chamada pela API.
## Compatibilidade Voyager (legado manual)
Por padrão o Voyager não inicia sozinho. `PLAYER_MODE=0`. O servidor não injeta o antigo prompt Bedrock.
Os dois Voyagers jogam em Creative: mineração, colocação, equipamento e inventário
são verificados a partir da observação real. O `placeBlocks` recebe o ID exato
da tarefa canônica; o agente não pode substituir `bricks` por `brick`.
O endpoint aceita temperatura 0.0, que coincide com os defaults do Voyager para
ActionAgent, CurriculumAgent, CriticAgent e SkillManager.
O endpoint mantém a compatibilidade HTTP de chat e embeddings para os clientes.
## API
- `GET /`
- `GET /health`
- `GET /status`
- `GET /v1/models`
- `POST /v1/chat/completions`
- `POST /v1/embeddings`
- `GET /minecraft/status`
- `GET /opencode-bot/status` (Naldo ativo — AltoClef)
- `GET /opencode-bot/log`
- `GET /voyager/status` (alternativa manual)
- `GET /gemini-bot/status`
## Segundo jogador: Gemini_Bot
`Gemini_Bot` executa uma segunda instância completa do Voyager no mesmo servidor
Java 1.19, com processo Mineflayer e checkpoint próprios. Curriculum, Action,
Critic e Skill Manager consultam o Gemini CLI por um proxy local exclusivo;
somente os embeddings usam o modelo local. O `Naldo_Bot` ativo é o AltoClef,
supervisionado pelo OpenCode Muse; o bridge OpenCode descrito acima serve
apenas à supervisão. Ambos validam tarefas Creative pela
mudança real no mundo ou pelo inventário.
O Curriculum permanece no modo automático do Voyager: cada IA observa o estado
atual, consulta seu checkpoint e decide o próximo objetivo. Não existe sequência
fixa nem fallback circular. Objetivos e projetos já concluídos ou falhados são
rejeitados semanticamente; a IA recebe o motivo e precisa escolher algo novo.
Se o provedor não produzir uma decisão válida, o bot permanece conectado e
aguarda com backoff, sem construir estruturas por roteiro.
Projetos suportados continuam verificáveis (`wall`, `bridge`, `room`, `tower`,
`road`, `arch`, `monument`, `shelter`, `courtyard` e `gate`). Quando a IA escolhe
um deles, a geometria é executada por `buildProject`, que usa `placeItem` e
registra todas as coordenadas físicas para o Critic. Um projeto concluído não
pode ser escolhido novamente. Naldo_Bot e Gemini_Bot tomam decisões separadas e
mantêm checkpoints independentes.
O adaptador `/pause` não envia o comando global do mod: os dois bots e os
jogadores Xbox compartilham um mundo que continua rodando durante a inferência.
`placeBlocks` prioriza destinos com linha de visão e usa a face encontrada por
`GoalPlaceBlock`, mantendo a confirmação do bloco no mundo. A física está fixada
em `prismarine-physics@1.6.0`, que inclui a correção oficial de água no Minecraft
1.19; os quatro pins do protocolo permanecem inalterados.
Os logs `[llm_metric]` registram bot, papel, latência e tokens reais por chamada
de Curriculum, Action, Critic e Skill Manager. No Gemini CLI, a temperatura zero
é aplicada por `modelConfigs.customOverrides`, além do cliente Voyager.
Se as construções cercarem o bot, o helper procura uma área de superfície já
carregada e livre, a 8–12 blocos por eixo. O voo Creative de recuperação verifica
o volume do jogador em toda a rota, usa segmentos de até 0,4 bloco, sobe no máximo
4 blocos para ultrapassar a construção e pousa em solo confirmado. Não destrói
blocos, não teleporta e não altera a exploração horizontal do Curriculum.
- CLI fixado em `@google/gemini-cli@0.61.0`, modelo efetivo `gemini-3.5-flash-lite`.
- Segredos privados do Space: `GEMINI_BOT_KEY_1` a `GEMINI_BOT_KEY_6`.
- Nenhuma chave deve ser salva no Git, no checkpoint ou nas saídas de status.
- Status: `/gemini-bot/status` (conexão, tarefas, métricas e falhas por posição
da chave; nunca revela valores de chaves).
- Controle de inicialização: `GEMINI_BOT_AUTOSTART=0` desativa somente o
segundo bot. O Naldo_Bot e o mundo persistente seguem independentes.
API pública de compatibilidade:
`https://erinaldordso-minecraft-friends-ai-zerogpu.hf.space/v1`
Modelo de chat público (não é o cérebro do Naldo):
`granite-4.0-h-tiny`
Cérebro interno do Naldo:
`opencode/muse-spark-1.3-contributor-free` via `127.0.0.1:7864/v1`
Modelo de embeddings:
`text-embedding-ada-002`
## Upstream Voyager
Os dois processos instanciam as classes de currículo, Action, Critic, Skill
Manager e o loop `Voyager.learn()` do mesmo checkout MineDojo/Voyager fixado em
`55e45a880755d0c8c66ca7fb5fe7962ac8974f89`. Cada runner verifica o HEAD
do checkout e a origem das cinco classes antes de aprender; os endpoints de
status expõem `engine_runtime` apenas para o PID validado. Os adaptadores
Creative e os parsers necessários aos modelos não são código byte a byte igual
ao upstream. Checkpoints e mundo ficam em `/persist` e não são substituídos
pela atualização do código.
Projeto original:
https://github.com/MineDojo/Voyager
Este Space executa o Voyager fixado em `55e45a880755d0c8c66ca7fb5fe7962ac8974f89`
com correções de reconexão, observações nulas e exploração horizontal limitada.
O `mineBlock` só aceita blocos até dois níveis abaixo dos pés, para o bot cavar
um poço de onde consegue sair, e o pathfinder mantém a escavação do upstream
justamente por isso.
## Instalação conforme a página oficial
O `README.md`, `installation/minecraft_instance_install.md` e
`installation/fabric_mods_install.md` do upstream são o contrato de instalação.
`tests/test_installation_conformance.py` trava o que é possível automatizar.
| Passo oficial | Onde está neste Space |
| --- | --- |
| Python >= 3.9 | `voyager_stack.MIN_PYTHON`, verificado no boot |
| Node.js >= 16.13.0 | `voyager_stack.MIN_NODE`, verificado no boot |
| `git clone` | `VoyagerStack._ensure_source`, no commit fixado |
| `pip install -e .` | `VoyagerStack._ensure_python_package`, com verificação posterior |
| `npm install` + `npx tsc` em `mineflayer-collectblock`, depois `npm install` em `voyager/env/mineflayer` | `VoyagerStack._ensure_node` |
| Dependências de `requirements.txt` | `requirements.txt` deste repositório |
| `Voyager(ckpt_dir=..., resume=True)` para retomar | `voyager_runner.py` deriva `resume` dos arquivos do checkpoint e o passa ao construtor |
| Mundo em Creative + Peaceful | `server.properties` |
| `fabric-loader-0.14.18-1.19` | instalador Fabric pinado em `minecraft_stack.py` |
Desvios, todos deliberados:
- **`mc_port` em vez de `azure_login`.** O README aceita os dois ("You can also
use mc_port instead of azure_login"). Este Space sobe um servidor Bedrock
dedicado em `127.0.0.1:25565` com Geyser/ViaProxy para os amigos Xbox, então
não existe `MinecraftInstance` local para o `azure_login` abrir. A
reconexão automática do upstream é substituída pela supervisor do Space e
pelos patches de recuperação não destrutivos.
- **Subconjunto de mods do Fabric.** A lista de 5 mods da página é para um
*cliente* (o próprio README diz para abrir o mundo em LAN). Um servidor
dedicado recebe o subconjunto de servidor: Fabric API 0.58.0+1.19,
Complete Config 2.0.0 e Multiplayer Server Pause 1.1.0. **Mod Menu** é
exclusivamente de cliente e **Better Respawn** crasha o servidor ao salvar um
jogador Creative recém-conectado (mixin dereferenciando `respawnDimension`
não inicializado), então o jar é removido em `_ensure_voyager_mods`.
- **`pip install -e . --no-deps`.** A distribuição é instalada e verificada, mas
a resolução de dependências fica por conta de `requirements.txt` deste Space:
deixar o pip re-resolver em boot moveria a pilha de inferência de um Space já
em execução.
- **Versões pinadas.** `chromadb==0.4.22` (o upstream fixa 0.3.29, anterior ao
`langchain==0.0.350`) e `langchain-community==0.0.2` (exigido pelo
`ChatOpenAI` usado pelo upstream). `cchardet` fica de fora de propósito: é um
acelerador opcional do `chromadb` e compilá-lo no build do Space quebraria a
build inteira.
- **Modelo local.** `granite-4.0-h-tiny` no lugar do GPT-4, servido por
`app.py` como endpoint OpenAI-compatible em `127.0.0.1:7860`.
- **`learn(reset_env=False)`.** O reset do upstream é um hard reset do ambiente
do Mineflayer; sem `azure_login` ele derrubaria a conexão a cada tarefa. O
`Voyager.learn()` do upstream continua sendo o loop, só sem o reset.
## Mapa
O mundo é um superflat de farm, com superfície em Y=64 (fixa em
`minecraft_stack.WORLD_SURFACE_Y` e validada por `tests/test_world_map.py`): grama
no topo, três camadas de terra, cascalho e uma faixa de minério de carvão até
esmeralda entre 6 e 24 blocos abaixo da superfície, repetida na banda de
deepslate no fundo da coluna. Sem lagos, sem features e sem estruturas, para a
superfície continuar previsível para o pathfinder e para quem constrói.
O mapa vive em `/persist/minecraft-friends/world-20260928-ores-y64-v1`. Como
`generator-settings` só é lido quando o mundo é criado, trocar o mapa exige um
diretório novo; os saves dos jogadores humanos são carregados para o mundo novo
(`_carry_player_saves`) e o save do bot não é, para o Curriculum oficial sair do
seu ramo de inventário cheio. O token OAuth da Xbox fica em
`/persist/minecraft-friends/relay` e não é tocado pela troca de mapa.
Os checkpoints continuam em
`/persist/minecraft-friends/voyager/ckpt-20260927-flat-y64-v1` e
`/persist/minecraft-friends/gemini-voyager/ckpt-20260927-flat-y64-v1`, porque a
superfície continua plana em Y=64 e as skills aprendidas foram preservadas.
Validação offline, sem iniciar modelos ou servidor de jogo:
`python -m pytest tests -q --ignore=tests/test_player_save_diagnostics.py`
O contrato do runtime (decisões upstream, adaptação declarada do retry do
curriculum e patch aplicado sobre a árvore oficial) é verificado por
`tests/test_voyager_official_contract.py` e `tests/test_voyager_patch_application.py`.
## Mapa normal 20261003 (Naldo)
- Mundo novo de terreno normal: `/persist/minecraft-friends/world-20261003-normal-v1`
(`minecraft:normal` com estruturas; sem camadas flat). Todos entram no spawn
natural do mapa novo: nenhuma playerdata antiga e importada na troca
flat->normal (posicao antiga enterraria o jogador na montanha, longe do Naldo).
- Checkpoint novo e vazio: `/persist/minecraft-friends/voyager/ckpt-20261003-normal-v1`
(resume=False; sem herdar skills, tasks ou posicoes do mapa antigo).
- Antigos mantidos, nunca apagados: `world-20260928-ores-y64-v1`,
`world-20260927-flat-y64-v1`, checkpoints `ckpt-20260927-flat-y64-v1` e o
`relay/token.json` da Xbox (sem novo login).
|