Skip to content

Plugins & the registry

Inspect Robots components register by name and resolve from strings — the mechanism the CLI and eval("...", "...", "...") use. In-tree builtins register via decorators; out-of-tree packages publish entry points, so an installed plugin appears in inspect-robots list without being imported first.

Decorators

from inspect_robots.registry import embodiment, policy, scorer, task

@policy("my-vla")
class MyVLA: ...

@embodiment("my-arm")
class MyArm: ...

@scorer("smooth")
def smooth(): ...

@task("my-bench")
def my_bench(): ...

Resolving

from inspect_robots.registry import registered, resolve

registered("policy")          # {"scripted": ..., "random": ..., "my-vla": ...}
policy = resolve("policy", "my-vla", checkpoint="...")   # constructor kwargs forwarded

Shipping an out-of-tree plugin

Publish entry points from your package's pyproject.toml:

[project.entry-points."inspect_robots.embodiments"]
maniskill = "inspect_robots_maniskill:ManiSkillEmbodiment"

[project.entry-points."inspect_robots.policies"]
openvla = "inspect_robots_openvla:OpenVLAPolicy"

Groups: inspect_robots.tasks, inspect_robots.policies, inspect_robots.embodiments, inspect_robots.scorers, inspect_robots.sinks. After pip install inspect-robots-maniskill, it shows up in inspect-robots list and resolves by name in eval() and the CLI.

This is how the ecosystem stays decoupled: this repository is the framework; specific simulators, VLA weights, and benchmarks live in their own packages.