Type 左边放6个球,右边放一个方块,重力调到0.3 — and the world obeys.

OriEra WorldChat is a zero-dependency static web app where conversation is the world. One sentence becomes ordered world commands; a 420-particle field and draggable physics bodies act them out; an AI Director plans the next act when the story deserves one; text-to-image regenerates the world's sky and posters mid-scene; and everything you did — plus everything the director remembered about you — survives a page reload.

The problem it argues: AI-native worlds die of two costs. Latency — a world that waits on a 250B-class model for every "put a ball there" is unplayable. Credits — paying heavy-tier prices for kindergartner tasks. The Best Apps and Agents track description says it directly: "let Nano or Super handle the fast, everyday calls... and your credits stretch further." WorldChat makes that sentence visible and measurable: a router log shows which Nemotron tier answered every call, and a credits panel accounts actual spend against an all-heavy baseline, live.

What a judge sees in 30 seconds

  1. Open the hosted URL — the world introduces itself (~1.5 s hook; any click cancels it and hands you the wheel).
  2. Click chip 别清空,放3球 — the negation guard honestly refuses 别清空 while 放3个球 executes. The refusal is shown, not hidden.
  3. Click "Direct a scene" — the heavy tier returns an act (beat + art theme + world transform + a memory line); the Recalled: line shows memory being used, not just stored; retheme fires the L8 art slots.
  4. Reload the page — same world, same memories, same generated art. It still remembers you.

Honest status (read before scoring). The offline demo is fully playable and fully verified: node selfcheck.mjs → 49/49 checks, exit 0 (rerun 2026-10-19), and the full pipeline (parse → queue → simulate → canvas render → hot-swap → director → memory) passes in a real Chromium engine (test/e2e.html → "ok":true). The LIVE path is code-complete but has never executed against the real Token Factory service — we had no API key during the entire window (Nebius signup is blocked at the billing-country step from our location). What we did instead:

  • Probed the real gateway unauthenticated: all endpoints reachable and the documented paths accepted — 401 on /v1/models and all three chat tiers, bare 404 on /images/generations (undocumented unauthenticated routing, reported to Nebius as platform feedback).
  • Built node selfcheck.mjs --live: five read-scale probes (models catalog, fast/mid/heavy chat at ≤24 tokens, one 256px image) that print status/latency/tokens per probe — screenshot-able router-log evidence the moment any key exists. Without a key it fails loudly; it never fakes responses.
  • Model-ID defaults are best-effort against published docs (verified against Nebius's own deprecation announcement); the Settings → Discover models button re-fills them from your live catalog.

How we built it

  • Architecture mirrored from the OriEra engine (our pre-existing Apache-2.0 project; the submission folder adapts two browser kernels and one example — it does not ship the Rust engine):
    • engine/kernel.js — the L7 inference runtime: sentence → tool-call parser with a negation guard and Chinese-numeral counting; a frame-budgeted CommandQueue with provable coalescing (放3球,放5球 merges into one frame of 8 balls, but 左6球,右6球 stays two commands because their side arguments conflict); and MemoryStore.
    • engine/kernel.js BudgetAllocator / UsageMeter — new code mirroring the engine's compute-budget design: per-lane EWMA shares, per-hop token metering, and the "saved X%" panel vs an all-heavy baseline (lane weights fast 1 / mid 8 / heavy 40, clearly labeled illustrative; accrues from live calls only).
    • engine/genai.js — the L8 generative-content pipeline: payload magic-byte validation, named-asset hot swap (same handle, new pixels, crossfade), SlotBindings fan-out, and ArtDirectorSystem; the vendor adapter is retargeted from Zhipu CogView to Nebius Token Factory /v1/images/generations.
    • engine/director.js — the L9 director: an act = name + beat + art theme + world transform + a memory line; auto-triggers every 6 commands or on demand; degrades to deterministic rule-authored acts offline.
  • Models & platform. Everything rides one OpenAI-compatible Token Factory endpoint. Defaults (Settings-editable, auto-discoverable from your live /v1/models): fast nvidia/nemotron-nano-9b-v2 (parsing), mid nvidia/llama-3.3-nemotron-super-49b-v1.5 (narration), heavy nvidia/nemotron-3-super-120b-a12b (direction — the officially promoted successor after llama-3.1-nemotron-ultra-253b-v1 left Token Factory Serverless), and black-forest-labs/flux-schnell for L8 art.
  • Engineering discipline. No frameworks, no npm dependencies, no build step. selfcheck.mjs reruns 49 real checks every time — including "no retired model ID ships as a default". Node ≥18 is needed only for the optional static server, the bundled loopback CORS relay, and the selfcheck.

Challenges we ran into

  1. No API key, for the whole window. Nebius signup blocked at the billing-country step, so no trial credits. We refused to fake it: offline completeness first, explicit OFFLINE/LIVE badges, unauthenticated probes against the real gateway to verify endpoint shapes — which surfaced an undocumented behavior (bare 404 on unauthenticated image calls) that we wrote up as platform feedback instead of papering over. Update (Oct 21): Nebius Support reviewed this exact situation (case AISTUDIOSUP-2289) and confirmed: mainland China is not supported for billing registration, with no individual exceptions, no manual account verification, and no alternative registration options — the same applies to Builder Program credits. The blocker is official policy, not anecdote; the offline-complete + LIVE-ready submission stands as our honest answer to it.
  2. A default model died mid-window. nvidia/llama-3.1-nemotron-ultra-253b-v1 was removed from Token Factory Serverless (2026-08-31 deprecation notice). We switched the heavy default to the promoted successor, added a selfcheck regression guard, and made Discover reset any dead ID from the live catalog instead of silently calling it.
  3. Making "credits stretch" provable instead of claimed. Savings without metering is marketing, so the BudgetAllocator and UsageMeter ship in the demo, with per-hop accounting and a labeled baseline the judge can watch move.
  4. Parsing real sentences. Mixed Chinese/English clauses, full-width digits, Chinese numerals up to 百 (一百个球 → 100; 一千个球 refuses honestly), negation that must refuse rather than half-execute, and Nemotron blocks that wrap the JSON — every one covered by a selfcheck assertion.

Accomplishments that we're proud of

  • A fully playable AI-driven world in one static page — zero dependencies, runs offline forever, hosted on GitHub Pages with no build step to drift.
  • A 49-check selfcheck (exit 0) plus a real-browser end-to-end that drives parse → queue → simulate → canvas render → hot-swap → director → memory and prints "ok":true.
  • An honest evidence trail: even keyless, we extracted real signals from the live gateway (401/404 probes) and turned the platform's undocumented behavior into feedback rather than a workaround.
  • The router log: every model hop shows tier, model family actually called, latency, and any fallback reason. Nothing about the AI's behavior is hidden from the judge.

What we learned

  • The hard part of AI-native UX is not calling a model — it is scheduling them: which call deserves which tier is an engine decision, not a prompt decision.
  • Honest degradation is a feature: the offline path makes the demo un-blankable on stage and made every claim on this page verifiable.
  • Model deprecation is an operational fact of building on hosted inference; defaults need discovery and regression guards, not faith.
  • Platform friction (billing-country walls, undocumented error codes) is real integration feedback — we filed ours with Nebius instead of swallowing it.

What's next

  • First hour with any key: run node selfcheck.mjs --live, screenshot the five probes, then run the guided demo LIVE and capture the real router log with a real "saved %" number.
  • Widen the command vocabulary (more verbs, compositional multi-object scenes) and let the director chain multi-act stories.
  • Port BudgetAllocator/UsageMeter back into the Rust engine's native L2 scheduler — the browser demo is the argument; the engine is the product.
  • Try Nebius AI Cloud for heavier world-simulation steps that don't fit a chat completion.

Built With

  • html5
  • javascript
  • localstorage
  • nebius-token-factory
  • nvidia-nemotron
  • openai-compatible-api
  • oriera-engine
Share this project:

Updates

Submission history