| name | generate-scene |
| description | Turn a natural-language scene request into a Genie Sim scene — an LLM writes a Scene-Language DSL program (`LLM_RESULT.py`), and `geniesim_generator.app` compiles it into `scene.usda` + a layout graph under benchmark/config/llm_task/. Works either through the Open WebUI agent, OR by having Claude write the DSL program directly and run the compiler (no WebUI / no MCP server needed). Trigger: When the user asks to "生成一个场景", "按需求生成场景", "generate a scene", "make a scene with <objects>", "build a tabletop layout", "create scene.usda from a description", "直接写脚本生成场景", "绕过 webui 生成场景", or wants the generator to produce a scene from a prompt.
|
| license | MPL-2.0 |
| metadata | {"author":"genie-sim","version":"1.0"} |
| prerequisites | ["geniesim_generator:search-assets","geniesim_generator:deploy-generator"] |
| inputs | [{"name":"prompt","desc":"Natural-language description of the scene to generate","required":true},{"name":"output_name","desc":"Stem for the produced `LLM_RESULT.py` + `scene.usda`","required":false},{"name":"use_webui","desc":"Route through Open WebUI (true) vs author DSL directly (false)","required":false,"default":"true"}] |
| outputs | [{"desc":"`scene.usda` + layout graph under `benchmark/config/llm_task/<output_name>/`, plus the `LLM_RESULT.py` source"}] |
When to Use
- User describes a scene in words and wants the generator to produce it
(
scene.usda + scene_info.json + layout graph).
- User has an
LLM_RESULT.py (hand-written or LLM-produced) and wants to
compile / preview it.
- User wants a quick one-shot scene without standing up Open WebUI / MCP —
Claude writes the DSL program directly (Path B below).
Prerequisite only for Path A (the Open WebUI agent loop): the MCP stack +
Open WebUI are running (deploy-generator first). Path B needs just the package
importable + ASSETS_INDEX available — no servers.
Do not use for:
- Standing up the servers →
deploy-generator skill.
- Just browsing assets →
search-assets skill.
The pipeline (what actually happens)
NL request
│ ── Path A: Open WebUI "geniesimscenegen" agent (uses search_assets/get_interactions)
│ ── Path B: Claude writes the DSL program directly (no WebUI / no MCP server)
▼
Python program: from helper import * → @register()… def root_scene() -> Shape
│ written to → src/geniesim_generator/LLM_RESULT.py
▼
cd src/geniesim_generator && python app.py (imports LLM_RESULT.root_scene, runs it)
│ gen_scene_layout_info → (scene_info, networkx graph)
│ gen_scene_usda → scene.usda
▼
benchmark/config/llm_task/<scene_id>/<n>/{scene.usda, scene_info.json, graph.dot, graph.svg, LLM_RESULT.py}
The program is the only handoff between "write" and "compile" — so Path A and
Path B differ only in who writes it. Path B (Claude writes it directly) needs
neither Open WebUI nor the MCP servers running; it only needs the package
importable and ASSETS_INDEX available.
Workflow
Step 1 — Produce LLM_RESULT.py from the request
Two ways; pick by whether the WebUI/MCP stack is up.
Path A — via the Open WebUI agent (the deployed loop)
Drive the geniesimscenegen agent (import config/geniesimscenegen.json;
MCP tools wired via config/openwebui.json). Describe the scene; the agent
searches the asset library, writes a DSL program, and its "save to file" action
drops it at generator/LLM_RESULT.py. Requires deploy-generator first.
Path B — Claude writes the program directly (no WebUI, no MCP)
When the servers aren't up (or you just want a one-shot scene), and run the compiler. This is the lightweight path.