Official implementation of LAM: Language Articulated Object Modelers (CVPR 2026).
LAM generates articulated 3D objects (objects with moving parts — drawers, hinges, wheels, …) directly from natural-language descriptions. Instead of relying on a visual prior or pre-built 3D assets, LAM formulates articulated-object generation as a unified code-generation task: a team of LLM/VLM agents write, compile, debug, and self-correct code that defines both the geometry and the articulation of each object, which is then compiled into a standard URDF model.
🔗 Project page: https://gaoypeng.github.io/LAM
"a cabinet with five drawers"
│
┌───────────────────┴───────────────────────────────────────┐
│ Link Designer → hierarchical link structure (JSON) │
│ Geometry Coder → Three.js geometry code → OBJ meshes │
│ Articulation Coder → joint specifications (JSON) │
│ URDF Compiler → generated.urdf │
└───────────────────┬───────────────────────────────────────┘
│ (each stage runs a 2D/3D VLM feedback loop:
│ render → critique → fix, iteratively)
▼
articulated 3D object (URDF + meshes)
LAM/
├── run_pipeline.py # entry point — text → articulated object
├── agents/ # LLM/VLM agents (Link Designer, Coders, Checkers, Fixers)
├── providers/ # provider backends (OpenAI / Anthropic / Google / PointLLM)
├── prompt/ # prompt templates + few-shot examples
├── utils/ # config, mesh export, URDF generation, rendering helpers
├── data/ # example text captions / evaluation prompt lists
├── tests/ # unit tests
├── urdf_grid_visualizer/ # standalone web viewer for inspecting generated URDFs
├── config.example.yaml # configuration template (copy to config.yaml)
├── requirements.txt # Python dependencies
└── package.json # Node dependencies (Three.js → mesh export)
- Python 3.9+
- Node.js 18+ (used to execute the generated Three.js geometry code and export meshes)
- API keys for the LLM/VLM providers you intend to use (OpenAI, Anthropic, and/or Google)
- (Optional) PointLLM + a CUDA GPU, if you want to enable the 3D point-cloud critic (disabled by default)
1. Clone
git clone https://github.com/gaoypeng/LAM.git
cd LAM2. Python dependencies
pip install -r requirements.txt3. Node dependencies (for Three.js → mesh export)
npm ci # or: npm install4. Configure API keys
cp config.example.yaml config.yamlThen edit config.yaml and fill in the keys for the providers you use:
api:
keys:
openai: "YOUR_OPENAI_API_KEY"
google: "YOUR_GOOGLE_API_KEY"
anthropic: "YOUR_ANTHROPIC_API_KEY"
⚠️ config.yamlholds your secret keys and is git-ignored — never commit it.
config.yaml also assigns a model to each agent (the provider is auto-detected from the model name).
The defaults mirror the paper's setup:
| Agent | Default model |
|---|---|
Link Designer (linker_generator) |
gpt-4o |
Geometry Coder (shape_generator) |
gpt-5 |
Articulation Coder (articulation_generator) |
o3 |
Geometry / Articulation Checkers (vlm_critic, articulation_vlm_critic) |
gemini-2.5-flash |
Fixers (shape_fixer, articulation_fixer) |
gemini-2.5-pro |
Generate a single object:
python run_pipeline.py --description "a cabinet with five drawers" --output-dir outputBatch generation from a captions file (one description per line):
python run_pipeline.py --captions-file data/text_captions_short.txt --output-dir output --parallel 4Useful flags:
| Flag | Description |
|---|---|
--linker-model / --shape-model / --articulation-model |
Override the model for a stage |
--num-executions N |
Number of generation attempts per description |
--parallel N |
Number of parallel workers (0 = sequential) |
--no-vlm-critic |
Disable the geometry VLM feedback loop |
--no-articulation |
Shape only — skip articulation + URDF |
--no-articulation-feedback |
Skip the articulation VLM feedback loop |
--temperature / --max-retries / --log-level |
Misc. overrides |
Each generated object lands in its own folder under --output-dir:
output/<object_name>/
├── generated.urdf # the articulated model
├── part_meshes/ # per-link OBJ meshes
├── links.json # link hierarchy
└── articulation.json # joint specifications
urdf_grid_visualizer/ is a standalone Node web viewer for browsing generated objects and
interacting with their joints. It is independent of the Python pipeline.
cd urdf_grid_visualizer/server
npm install
URDF_BASE_PATH=/path/to/output PORT=3001 node server.js
# or, from urdf_grid_visualizer/: ./start.sh /path/to/output 3001- Batch grid preview:
http://localhost:3001/preview - Interactive single-object viewer:
http://localhost:3001/viewer/<category>/<instance>
@inproceedings{gao2026lam,
title = {LAM: Language Articulated Object Modelers},
author = {Gao, Yipeng and Ge, Yunhao and Cai, Peilin and Seita, Daniel and Itti, Laurent},
booktitle = {Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)},
year = {2026}
}See LICENSE.