Survey basis: 200 instruments and modules used in university chemistry teaching and research.
Agents that work in a chemistry lab need more than meshes. They need to know that a fume-hood sash travels 673 mm and stops at 457 mm, that moving a balance's draft-shield door restarts its stability check, and which quantities a policy may observe and which are hidden ground truth kept for evaluation. ChemLab-Assets ships that knowledge together with the geometry.
Every asset is one specific commercial model, built from published brochures, manuals and papers. The models reproduce documented behaviour; they are not manufacturer CAD and have not been calibrated against physical units. Each asset folder contains:
- Geometry. A GLB for viewing, a URDF with primitive collision proxies for simulators, one OBJ mesh per functional part, and the Blender source file.
- A contract (
asset.contract.json). Components, joints, state slots with units and visibility, callable capabilities with JSON-Schema arguments and declared errors, physical mechanisms, interface points for manipulation, cited sources and the model's known limitations.
- A runtime. A Python module that implements the contract: time-stepped process models behind
describe, read, invoke and poll, separate agent and evaluator views, request-id idempotency and seeded noise.
- Reference data. Output templates built from published measurements, such as DSC thermograms, Raman, IR and mass spectra, GC retention indices and isotope-ratio standards, each with its citation.
All 198 instruments have been converted to USD and stepped in NVIDIA Isaac Lab through the Matterix framework, with joints driven from runtime state and panel buttons pressed in the scene reaching the runtime. The integration code lives in Matterix and is not part of this release.
asset.contract.jsonCHEM-199 · excerpt
// a state slot: typed, with a unit, a visibility and a read binding
"sash.height_m": {
"value_schema": { "type": "number", "x-unit": "m",
"minimum": 0.0, "maximum": 0.67 },
"origin": "derived",
"visibility": "agent",
"access": "read_only",
"read_binding": { "backend": "host", "artifact_id": "runtime" },
"sampling": { "mode": "instant", "time_domain": "simulation" }
},
// a capability: JSON-Schema arguments, declared errors, effects
"sash.set": {
"input_schema": {
"properties": { "height_m": { "type": "number", "x-unit": "m",
"minimum": 0.0, "maximum": 0.67 },
"hold": { "type": "boolean" } },
"required": ["height_m"] },
"errors": [ { "code": "PLANT_REQUIRED", … },
{ "code": "SASH_LOCKED", "side_effects": "none", … },
{ "code": "ABOVE_STOP_LOCKED", … }, … 3 more ],
"state_effects": [ { "state_id": "sash.height_m",
"timing": "immediate", … }, … ],
"implementation": { "process": "verified", "host": "verified",
"scene": "verified", "robot": "absent",
"hardware": "absent" }
}
Abridged: description fields (in Chinese), bindings and the remaining entries are omitted.