Erinaldordso's picture
Run Naldo on AltoClef with Muse supervision
8f6b7b7 verified
|
Raw History Blame Contribute Delete
15.5 kB
---
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).