Adapt Physical Ai¶
Adapt Physical AI — mvp.adapt_physical_ai
Cluster: Physical AI | Type: component | MCP Tools: 32
Overview¶
Simulation-only device I/O
adapt_physical_ai is a simulation and planning component. The included device driver is an in-memory simulation driver. No real robot, PLC, sensor, serial, Modbus, GPIO, camera, lidar, or ROS driver is bundled with this component, and its outputs must not be treated as validated physical control commands.
Physics simulation and motion-planning block that models rigid-body dynamics, collision detection, path planning (A* and RRT), forward/inverse kinematics for jointed robots, and simulated device command dispatch. Maintains a stateful physics world across calls — position, velocity, obstacles, gravity — so a trajectory can be built up step by step. Simulation state can be saved to and loaded from named snapshots, including through the MCP block's SQLite-backed store.
The MCP surface also exposes constrained backend-native adapter ops (backend_capabilities, backend_describe_op, and backend_call). These are explicit, allowlisted inspection/call surfaces for the bundled simulation, motion-planning, and in-memory device-driver backends. They are not arbitrary passthroughs and do not enable real hardware control. Missing transports, absent optional backends, simulation-only execution, advisory planning, and blocked hardware actuation are surfaced with completion_state, warning_card, evidence, and correlation IDs when supplied.
When to use:
- Simulating robot or agent trajectories before any separate, reviewed hardware integration step
- Planning collision-free paths through a 2D grid or continuous space using A* or RRT
- Computing forward kinematics for joint-angle sequences or solving inverse kinematics targets
- Prototyping a device-driver interface with the bundled in-memory simulation backend
Example:
from mvp.adapt_physical_ai import AdaptPhysicalAIBlock, PhysicalAIInput
block = AdaptPhysicalAIBlock(name="phys_ai")
result = block.infer(PhysicalAIInput(
op="plan_path_astar",
start=[0, 0],
goal=[9, 9],
grid_size=[10, 10],
obstacles=[{"x": 3, "y": 3}, {"x": 3, "y": 4}],
))
# result.value.path → list of [x, y] waypoints from start to goal
Works well with: adapt_synthetic_world, adapt_blender, goal_engine
Public API¶
DeviceDriver(Protocol)¶
Minimal interface a device backend must satisfy.
Methods:
connect(device_id: str) -> dict¶
Open a connection to device_id. Return status dict.
send_command(device_id: str, command: str) -> dict¶
Send command to an already-connected device_id. Return result dict.
get_status(device_id: str) -> dict¶
Return current status dict for device_id.
disconnect(device_id: str) -> dict¶
Close the connection to device_id. Return status dict.
SimDeviceDriver¶
Pure in-memory simulation driver (default).
Methods:
connect(device_id: str) -> dict¶
send_command(device_id: str, command: str) -> dict¶
get_status(device_id: str) -> dict¶
disconnect(device_id: str) -> dict¶
AdaptPhysicalAIBlock(AIBlock[PhysicalAIInput, PhysicalAIOutput, dict])¶
Physics simulation and motion planning block (27 ops).
| Field | Type | Default |
|---|---|---|
name | str | 'adapt_physical_ai' |
state | dict | field(default_factory=dict) |
resource_bounds | ResourceBounds | field(default_factory=ResourceBounds) |
usage | ResourceUsage | field(default_factory=ResourceUsage) |
device_driver | Any | field(default_factory=SimDeviceDriver) |
agentic_planner | PlannerRecommendationPlanner \| None | None |
Methods:
infer(data: PhysicalAIInput) -> Result[PhysicalAIOutput]¶
PhysicalAIInput(BaseModel)¶
Input to AdaptPhysicalAIBlock.
| Field | Type | Default |
|---|---|---|
op | Literal['ops', 'help', 'simulate_step', 'simulate_trajectory', 'check_collision', 'apply_force', 'set_position', 'set_velocity', 'plan_path_astar', 'plan_path_rrt', 'get_state', 'reset_state', 'add_obstacle', 'remove_obstacle', 'list_obstacles', 'set_gravity', 'get_energy', 'joint_forward_kinematics', 'joint_inverse_kinematics', 'device_connect', 'device_command', 'device_status', 'sim_save', 'sim_load', 'sim_list', 'stats', 'get_info', 'recommend_planner', 'list_patterns'] | 'simulate_step' |
position | list[float] | Field(default_factory=lambda: [0.0, 0.0, 0.0]) |
velocity | list[float] | Field(default_factory=lambda: [0.0, 0.0, 0.0]) |
acceleration | list[float] | Field(default_factory=lambda: [0.0, 0.0, 0.0]) |
mass | float | Field(default=1.0, gt=0.0) |
dt | float | Field(default=0.01, gt=0.0) |
obstacles | list[dict] | Field(default_factory=list) |
target | list[float] | Field(default_factory=lambda: [0.0, 0.0, 0.0]) |
grid_size | list[int] | Field(default_factory=lambda: [10, 10], min_length=2) |
start | list[int] | Field(default_factory=lambda: [0, 0], min_length=2) |
goal | list[int] | Field(default_factory=lambda: [9, 9], min_length=2) |
algorithm | str | 'a_star' |
max_steps | int | Field(default=1000, ge=0) |
force | list[float] | Field(default_factory=lambda: [0.0, 0.0, 0.0]) |
joint_angles | list[float] | Field(default_factory=list) |
device_id | str | '' |
command | str | '' |
sim_time | float | Field(default=1.0, ge=0.0) |
gravity | float | 9.81 |
name | str | '' |
hardware_acknowledgement_token | str | '' |
dry_run | bool | True |
approval_confirmed | bool | False |
PhysicalAIOutput(BaseModel)¶
Output from AdaptPhysicalAIBlock.
| Field | Type | Default |
|---|---|---|
op | str | required |
position | list[float] | Field(default_factory=list) |
velocity | list[float] | Field(default_factory=list) |
path | list[list[float]] | Field(default_factory=list) |
collisions | list[dict] | Field(default_factory=list) |
sim_time | float | 0.0 |
steps | int | 0 |
energy | float | 0.0 |
metadata | dict | Field(default_factory=dict) |
trajectory | list[list[float]] | Field(default_factory=list) |
backend | str | 'simulation' |
degraded | bool | False |
degradation_reason | str | '' |
simulation_only | bool | False |
review_pending | bool | False |
AdaptPhysicalAIMCPBlock(AIBlock[MCPPhysicalAIInput, MCPPhysicalAIOutput, dict])¶
27-op physical AI MCP block with SQLite persistence.
| Field | Type | Default |
|---|---|---|
name | str | 'adapt_physical_ai_mcp' |
state | dict | field(default_factory=dict) |
db_path | str | field(default_factory=lambda: os.environ.get('PHYSICAL_AI_DB_PATH', _DEFAULT_DB)) |
resource_bounds | ResourceBounds | field(default_factory=ResourceBounds) |
usage | ResourceUsage | field(default_factory=ResourceUsage) |
Methods:
infer(data: MCPPhysicalAIInput) -> Result[MCPPhysicalAIOutput]¶
MCPPhysicalAIInput(BaseModel)¶
Input to AdaptPhysicalAIMCPBlock — 27 ops.
| Field | Type | Default |
|---|---|---|
op | Literal['ops', 'help', 'simulate_step', 'simulate_trajectory', 'check_collision', 'apply_force', 'set_position', 'set_velocity', 'plan_path_astar', 'plan_path_rrt', 'get_state', 'reset_state', 'add_obstacle', 'remove_obstacle', 'list_obstacles', 'set_gravity', 'get_energy', 'joint_forward_kinematics', 'joint_inverse_kinematics', 'device_connect', 'device_command', 'device_status', 'sim_save', 'sim_load', 'sim_list', 'stats', 'get_info', 'recommend_planner', 'list_patterns', 'backend_capabilities', 'backend_describe_op', 'backend_call'] | required |
position | list[float] | Field(default_factory=lambda: [0.0, 0.0, 0.0]) |
velocity | list[float] | Field(default_factory=lambda: [0.0, 0.0, 0.0]) |
acceleration | list[float] | Field(default_factory=lambda: [0.0, 0.0, 0.0]) |
mass | float | Field(default=1.0, gt=0.0) |
dt | float | Field(default=0.01, gt=0.0) |
obstacles | list[dict] | Field(default_factory=list) |
target | list[float] | Field(default_factory=lambda: [0.0, 0.0, 0.0]) |
force | list[float] | Field(default_factory=lambda: [0.0, 0.0, 0.0]) |
gravity | float | 9.81 |
sim_time | float | Field(default=1.0, ge=0.0) |
grid_size | list[int] | Field(default_factory=lambda: [10, 10], min_length=2) |
start | list[int] | Field(default_factory=lambda: [0, 0], min_length=2) |
goal | list[int] | Field(default_factory=lambda: [9, 9], min_length=2) |
algorithm | str | 'a_star' |
max_steps | int | Field(default=1000, ge=0) |
joint_angles | list[float] | Field(default_factory=list) |
device_id | str | '' |
command | str | '' |
name | str | '' |
query | str | '' |
top_k | int | 10 |
hardware_acknowledgement_token | str | '' |
dry_run | bool | True |
approval_confirmed | bool | False |
backend_name | str | '' |
native_action | str | '' |
native_payload | dict[str, Any] | Field(default_factory=dict) |
request_id | str | '' |
task_id | str | '' |
run_id | str | '' |
MCPPhysicalAIOutput(BaseModel)¶
Output from AdaptPhysicalAIMCPBlock.
| Field | Type | Default |
|---|---|---|
op | str | required |
position | list[float] | Field(default_factory=list) |
velocity | list[float] | Field(default_factory=list) |
path | list[list[float]] | Field(default_factory=list) |
collisions | list[dict] | Field(default_factory=list) |
sim_time | float | 0.0 |
steps | int | 0 |
energy | float | 0.0 |
trajectory | list[list[float]] | Field(default_factory=list) |
backend | str | 'simulation' |
message | str | '' |
metadata | dict | Field(default_factory=dict) |
count | int | 0 |
retrieved | list[dict] | Field(default_factory=list) |
degraded | bool | False |
degradation_reason | str | '' |
simulation_only | bool | False |
review_pending | bool | False |
request_id | str | '' |
task_id | str | '' |
run_id | str | '' |
completion_state | Literal['verified', 'qualified-draft', 'blocked-escalated'] | 'qualified-draft' |
warning_card | dict[str, Any] | Field(default_factory=dict) |
evidence | list[dict[str, Any]] | Field(default_factory=list) |
PhysicalAIStore¶
SQLite-backed store for the adapt_physical_ai MCP sub-package.
Constructor:
| Parameter | Type | Default |
|---|---|---|
db_path | str | ':memory:' |
Methods:
save_simulation(name: str, state: dict, tags: str = '') -> str¶
load_simulation(name: str) -> dict | None¶
list_simulations(limit: int = 50) -> list[dict]¶
store_trajectory(sim_name: str, trajectory: list, steps: int, sim_time: float) -> str¶
add_obstacle(position: list, radius: float = 0.5, tags: str = '') -> str¶
list_obstacles(limit: int = 100) -> list[dict]¶
remove_obstacle(obstacle_id: str) -> bool¶
register_device(device_id: str, config: dict | None = None) -> str¶
log_command(device_id: str, command: str, result: str = '') -> None¶
save_state(name: str, state: dict) -> str¶
load_state(name: str) -> dict | None¶
log_error(op: str, error_message: str, params: dict | None = None) -> None¶
count_all() -> dict[str, int]¶
MCP Tools¶
| Operation | Source |
|---|---|
ops | physical_ai_mcp |
help | physical_ai_mcp |
simulate_step | physical_ai_mcp |
simulate_trajectory | physical_ai_mcp |
check_collision | physical_ai_mcp |
apply_force | physical_ai_mcp |
set_position | physical_ai_mcp |
set_velocity | physical_ai_mcp |
plan_path_astar | physical_ai_mcp |
plan_path_rrt | physical_ai_mcp |
get_state | physical_ai_mcp |
reset_state | physical_ai_mcp |
add_obstacle | physical_ai_mcp |
remove_obstacle | physical_ai_mcp |
list_obstacles | physical_ai_mcp |
set_gravity | physical_ai_mcp |
get_energy | physical_ai_mcp |
joint_forward_kinematics | physical_ai_mcp |
joint_inverse_kinematics | physical_ai_mcp |
device_connect | physical_ai_mcp |
device_command | physical_ai_mcp |
device_status | physical_ai_mcp |
sim_save | physical_ai_mcp |
sim_load | physical_ai_mcp |
sim_list | physical_ai_mcp |
stats | physical_ai_mcp |
get_info | physical_ai_mcp |
recommend_planner | physical_ai_mcp |
list_patterns | physical_ai_mcp |
backend_capabilities | physical_ai_mcp |
backend_describe_op | physical_ai_mcp |
backend_call | physical_ai_mcp |