Skip to content

Snake Tower Migration

This is the practical way to move Snake v0.2 from the laptop to a tower that stays on.

First Principle

There are two different goals:

  1. Exact exact Snake
  2. Same runtime, local model on LM Studio

Those are not the same thing.

If you want exact behavior, keep the same cloud models and just move the process plus state to the tower. If you want LM Studio, you keep the DDA-X runtime and state, but the model changes, so the behavior will drift.

Option A: Exact Mirror On Tower

Use this if you want the closest possible continuity.

  1. Clone this repo on the tower.
  2. Check out commit ba1e4fd811bd6ab82369b1aa3e3cf0bd1a6a1353.
  3. Copy the entire data/discord_agent_v0_2/ directory from laptop to tower.
  4. Recreate .env on the tower with the same Discord and OpenAI values.
  5. Keep:
  6. DISCORD_AGENT_PROFILE=configs/discord_agent/snake_v0_2.json
  7. DISCORD_DATA_DIR=data/discord_agent_v0_2
  8. DISCORD_CHAT_MODEL=gpt-5-mini
  9. DISCORD_EMBED_MODEL=text-embedding-3-large
  10. From the repo root, run:
.\run_snake.ps1

Or double-click / shell-run:

run_snake.cmd
  1. If you want it to stay running in the background, use:
.\run_snake.ps1 -Detached

That preserves the same runtime profile and the same saved state.

Option B: Tower + LM Studio

Use this if uptime and local inference matter more than exact model continuity.

What Changes

  • Same Discord bot code
  • Same Snake v0.2 profile
  • Same copied data/discord_agent_v0_2/ state
  • Different model backend

So this is still Snake, but not exactly the same Snake as the OpenAI-cloud build.

Required Env Settings

Point the provider at LM Studio's OpenAI-compatible server:

OPENAI_BASE_URL=http://127.0.0.1:1234/v1
OPENCLAW=lm-studio
DISCORD_CHAT_MODEL=<your-lm-studio-chat-model-id>
DISCORD_EMBED_MODEL=<your-lm-studio-embedding-model-id-or-keep-openai>
OPENAI_EMBED_DIMENSIONS=

Notes:

  • Leave OPENAI_EMBED_DIMENSIONS blank for most local embedding servers.
  • If LM Studio is only serving chat, keep OpenAI embeddings instead:
  • DISCORD_EMBED_MODEL=text-embedding-3-large
  • and keep your OpenAI key in OPENCLAW

That hybrid path is often the least annoying.

The lowest-risk sequence is:

  1. Port the exact OpenAI build first.
  2. Verify Snake wakes up with the same state and channel behavior.
  3. Only then try LM Studio for chat.
  4. If LM Studio feels too different, keep local tower hosting but stay on OpenAI models.

That separates uptime problems from model-behavior problems.

Tower Setup Notes

  • Snake does not need VS Code open.
  • Snake only needs:
  • tower powered on
  • internet access for Discord
  • Python process running
  • LM Studio running too, if using local inference
  • The saved mind/state lives on disk under data/discord_agent_v0_2/
  • Sleeping the machine makes Snake unreachable, but does not erase the saved state

Suggested Deployment Layout On Tower

D:\agents\dda_scaffold\
  .env
  run_discord_agent.py
  src\
  configs\
  data\discord_agent_v0_2\

NVIDIA / LM Studio Notes

LM Studio supports running a local OpenAI-compatible server and also supports headless mode for remote or always-on machines. Their docs also note Windows hardware acceleration support for NVIDIA, AMD, and Intel Arc GPUs. If you want the tower to stay always-on without the full desktop app in front, use LM Studio's headless mode / background service path rather than tying it to an interactive desktop session.

Official docs:

  • OpenAI-compatible endpoint docs: https://lmstudio.ai/docs/app/api/endpoints/openai
  • Headless mode docs: https://lmstudio.ai/docs/app/api/headless
  • System requirements: https://lmstudio.ai/docs/app/system-requirements

What To Copy Before You Shut The Laptop

At minimum:

  1. data/discord_agent_v0_2/
  2. configs/discord_agent/snake_v0_2.json
  3. .env recreated manually
  4. current repo commit hash

If you want the cleanest handoff, copy the full repo directory and then pull updates later.

One-Command Tower Habit

After the tower clone is set up and .env exists, your normal flow can just be:

git pull
.\run_snake.ps1

Or background:

git pull
.\run_snake.ps1 -Detached