Skip to content

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