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 namesModels 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 patchesSmall 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 thinkingReasoning 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 loopsSome 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.