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).