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.

OpenClaw bridge: a creator-AI-3D scene editing demo

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.

What makes this work isn’t the model. It’s everything I built around it:

  1. Trim the tool menu — Codex has ~120 tools. Small models get confused by big menus; we show them ~10.
  2. Plain-English tool cheat sheet — We paste simple “here’s how each tool works, with an example” text into the system prompt.
  3. Rewrite shell-ish tool names — Models call ls, cat, grep like tools. We catch that and convert to a proper shell call.
  4. Browser user-agent for curl — Sites block curl/8.0. We auto-add a real browser UA to any curl command.
  5. Web search + web fetch — No built-in web search in local mode, so we added two tools for looking up real API docs.
  6. 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.
  7. Better patch error messages — Default errors are cryptic. We rewrote the common ones to explain what to try next.
  8. Better network errors — Instead of “error sending request”, we show the real cause (DNS, TLS, connection refused, etc.).
  9. 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.
  10. Stop repetition — (a) Same tool + same args 3× → STOP block in next prompt. (b) Same file failing 3× with different commands → same STOP block.
  11. 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.
  12. Log the model’s thinking — Reasoning text goes to debug logs so we can explain weird behavior later.
  13. Reroute wrong picks — If the router picked “text-only model” but the conversation has tool calls, we upgrade to the tool-capable Coder.
  14. Diagnostic logs — Extra logging for “which tools did we pass?”, “did the STOP fire?”, “what did the bail judge decide?”
  15. 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.
  16. 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).
  17. 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.
  18. 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.”
  19. 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.
  20. 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.

Running local models effectively on a potato

Operating doctrine

How I actually work with AI.