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
- Open the hosted URL — the world introduces itself (~1.5 s hook; any click cancels it and hands you the wheel).
- Click chip 别清空,放3球 — the negation guard honestly refuses 别清空 while 放3个球 executes. The refusal is shown, not hidden.
- 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.
- 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.jsBudgetAllocator / 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), midnvidia/llama-3.3-nemotron-super-49b-v1.5(narration), heavynvidia/nemotron-3-super-120b-a12b(direction — the officially promoted successor after llama-3.1-nemotron-ultra-253b-v1 left Token Factory Serverless), andblack-forest-labs/flux-schnellfor L8 art. - Engineering discipline. No frameworks, no npm dependencies, no build step.
selfcheck.mjsreruns 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
- 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.
- A default model died mid-window.
nvidia/llama-3.1-nemotron-ultra-253b-v1was 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. - 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.
- 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
Log in or sign up for Devpost to join the conversation.