Skip to main content
Reactor owns model inference, episode context, and action messages. Your application owns camera capture, state measurement, target validation, low-level control, and stopping behavior. These docs do not include a validated hardware driver.

Observation and action loop

  1. Create one session per robot/episode stream. Subscribe before connecting; publish named cameras after READY. The SDK maintains transport keepalive.
  2. Send measured joint and gripper state, start all camera streams, then set the task prompt.
  3. Receive action_chunk, validate its shape and finite values, and check it belongs to the active episode. Track chunk_index and obs_seq to reject already-consumed messages.
  4. Apply your robot’s position, velocity, acceleration, and workspace limits before replacing the pending plan. Execute accepted targets at the controller’s cadence.
  5. Continue sending current measured state and new camera samples. There is no execution acknowledgement command gating the next chunk.
Validate both six-joint arrays independently and keep the grippers at columns 6 and 13. Supplying state for only one arm leaves the other arm on its zero fallback. Establish the execution cadence for the YAM controller; do not infer it from message arrival times. Action chunks describe a new plan from an observation anchor. Queuing complete chunks behind each other accumulates stale plans. Replacing a pending chunk also requires care: a large jump from the current measured state must be rejected or handled by the local controller, not blindly executed.

Freshness and temporal context

Use actual captured frames. Repeating a still image at video rate can fill the model’s four-frame history with copies and change its temporal conditioning. Video and state use separate transport paths; obs_seq does not make them an atomic observation or identify your last capture exactly. For paced simulator requests, use an adapter that explicitly manages camera delivery and episode state. For live control, log capture time, model counters, receipt time, and the rows actually executed. Set a cross-camera skew limit and measure capture-to-execution age and controller queue depth. Camera FPS, action cadence, and inference latency are separate quantities. Set an application-specific maximum action age and observation age. On a stalled view, inference timeout, disconnect, malformed output, or out-of-bounds target, stop replacing the plan and invoke your controller’s defined hold/stop behavior. Do not continue indefinitely on the final chunk.

Episode transitions

Stop or hold the controller before changing an episode. A changed prompt re-anchors model context but does not reset episode counters. For a new episode, send reset, wait for episode_reset, discard buffered actions, and republish measured state and frames before the next prompt. The reset acknowledgement is not a physical-stop acknowledgement. After an ambiguous interruption, a fresh session gives the clearest boundary between old and new messages. See the reference for exact command names and troubleshooting for symptoms.