OpenClaw bridges
3D scenes by voice.
I built this so my 8-year-old could direct his Roblox, Blender, and Daz scenes through natural language.
He says “make Torus.1 50% thinner on the Z-axis,” and the live environment updates.
Under the hood: an AI helper bridge through OpenClaw driving live scene state.
Three things crossed here that I cared about.
AI work. My long-running
3DCG interest.
A kid who’d already started building in Blender, Roblox Studio, and Suno.
codex-local
What 9B can actually do.
codex-local is my Codex CLI fork. I tuned it to babysit a local model through a structured task list.
It runs multi-turn agentic coding sessions, edits multiple files, completes the work, and does it with just Qwopus-3.5:9B underneath.
- 9Bparameters (Qwopus-3.5:9B)
- 20+turns of sustained coherence
- 10+files edited per prompt
- 20Model steering nudges
What makes this work isn’t the model. It’s everything I built around it:
- Trim the tool menu — Codex has ~120 tools. Small models get confused by big menus; we show them ~10.
- Plain-English tool cheat sheet — We paste simple “here’s how each tool works, with an example” text into the system prompt.
- Rewrite shell-ish tool names — Models call
ls, cat, grep like tools. We catch that and convert to a proper shell call.
- Browser user-agent for curl — Sites block
curl/8.0. We auto-add a real browser UA to any curl command.
- Web search + web fetch — No built-in web search in local mode, so we added two tools for looking up real API docs.
- Fix broken patches — Small models mangle patches: (a) write git-diff format, (b) leave
@@ -1,6 +1,6 @@ line numbers, (c) forget + prefixes and closing markers. We fix all three automatically.
- Better patch error messages — Default errors are cryptic. We rewrote the common ones to explain what to try next.
- Better network errors — Instead of “error sending request”, we show the real cause (DNS, TLS, connection refused, etc.).
- Catch announce-without-act — When the model says “Now I’ll do X” and stops, a judge model spots it and we re-prompt “take the action.” Up to 3 retries.
- Stop repetition — (a) Same tool + same args 3× → STOP block in next prompt. (b) Same file failing 3× with different commands → same STOP block.
- Trim old conversation — Keep the most recent turn intact, summarize older turns, drop stale file reads, pin errors so the model can’t forget them.
- Log the model’s thinking — Reasoning text goes to debug logs so we can explain weird behavior later.
- Reroute wrong picks — If the router picked “text-only model” but the conversation has tool calls, we upgrade to the tool-capable Coder.
- Diagnostic logs — Extra logging for “which tools did we pass?”, “did the STOP fire?”, “what did the bail judge decide?”
- LM Studio / OpenAI-compat support — Ollama and OpenAI-style servers disagree on URLs, payload shape, tool-call encoding, etc. A “flavor” switch lets one codebase talk to both.
- Token + time budget knobs — New per-role
max_tokens and timeout_seconds in config.toml. Set either to 0 for unlimited (reasoning models need this).
- Pin current file contents — Models forget a file changed and generate patches based on the old version. We pin live on-disk contents at the top of the prompt.
- Catch thinking loops — Some models spiral: “Actually, wait. Hmm. Let me reconsider.” We watch the stream for 6+ self-doubt phrases after half the token budget is burned, abort mid-generation, and re-prompt “stop second-guessing.”
- Stream the coder’s output — To make the anti-spiral work, we switched from “send, wait, parse” to “open stream, watch tokens, abort if needed.” Also lets us log reasoning in real time.
- Skip extras in local-only mode — Normally a router, reasoner, and compactor help the main model. Locally we can’t afford extras, so the Coder handles everything.
Most local-model coding agents stall the moment a task goes past trivial. With these nudges in place, 9B parameters really work.