MODEL CONNECTION GUIDE
Connect a model.
Run your model on your computer or server, then connect it to VeraPulse to test a task and record the results. Start with the working example below, or connect a compatible controller of your own.
Try a working example
This small Python controller picks up the cube and places it in the target. It is a scripted reference, not a trained model. It only controls the simulation.
- Download the reference controller. It uses Python 3.10 or later and no extra packages.
- Start it with
python3 reference_policy.py. - Open the simulation’s Run a model in simulation panel. Enter
http://127.0.0.1:8791, then choose Connect and Run pick-and-place. - Save the recording to your workspace. Open Results to compare saved runs with the same task settings.
A browser may ask for local-network access to connect to a model on your computer. If your browser blocks this connection, use an HTTPS endpoint on your server. Saving a model address never starts a run automatically.
Try SmolVLA on Balina
In the simulation’s model panel, choose Use Balina · private preview, then Connect and Run pick-and-place. Enter your private robot-console access key before connecting. Balina runs the model on its GPU; no local installation is needed. This hosted preview is restricted to operators, independently of website accounts.
Balina receives three 256 × 256 simulated views (front, overhead and side), joint state and the task description. SmolVLA returns movements for all six joints; the simulation applies speed limits and records the run. No physical robot is controlled.
Experimental: this is the base SmolVLA checkpoint, with approximate joint-range mapping and simulated cameras. It has not been trained for this scene, so a successful connection does not mean it can complete the task. Task-specific demonstrations and fine-tuning are the next step.
What works in this version?
SO-101 state-based controllers and the private SmolVLA image adapter. Every run starts from the same pick-and-place scene. Other robots and hosted training are future additions.
OpenVLA, π0.5, and other public models need a separate adapter for their observations, action format, robot calibration, and inference runtime. They cannot be loaded directly by uploading a weights file here.
Observe the real robot with SmolVLA
Open the read-only live preview ↗. Load the overhead and wrist camera views, enter a task, and inspect the model’s predicted joint values. The missing third camera is explicitly black-padded. This private Balina preview never sends motor commands and requires the robot to be idle.
Build your own adapter API reference
Three small API endpoints
Use JSON responses and allow the VeraPulse website origin through CORS. HTTPS is required except for localhost. Optional model keys use an Authorization bearer header; they stay in the current lab tab and are not saved in your workspace. Firebase sign-in tokens are never sent to the model.
1. GET /metadata
{
"protocol": "verapulse-policy-v1",
"name": "My controller",
"version": "1.0",
"robotId": "so101",
"actionType": "joint_velocity",
"observationKeys": [
"robot",
"objects"
]
}Supported observation keys: robot, objects, physics. Only requested keys are sent. The private Balina adapter uses protocol verapulse-policy-v2 to request cameras and task as well. Camera and task sharing with other destinations is not enabled in this preview.
2. POST /reset
The request contains protocol, a unique runId, the robot definition, starting environment, and dt: 0.05. Reset controller memory and reply with the same run ID and ready: true.
3. POST /act
The request contains the run ID, a sequence number starting at zero, dt: 0.05, and the selected observation fields. Return the matching run ID and sequence number:
{
"runId": "copy-from-request",
"sequence": 0,
"action": {
"type": "joint_velocity",
"joint": "shoulder_pan",
"velocity": 0.1
},
"done": false
}The v2 adapter returns action.type: joint_velocities with a complete velocities map keyed by joint name. Values use radians per second. Balina keeps its predicted action chunks on the server and replans after five control intervals.
Use action: null to wait one control interval and done: true to finish. Each accepted action advances three physics steps. The simulation waits for each response, so inference delay does not change the control interval.
Positions are radians and velocities radians per second. Joint names and speed limits come from the robot definition in the reset request. Invalid joints, speeds, sequence numbers, oversized responses, and request timeouts stop the run.
Understand the results
A run ends after success, 30 simulated seconds, 180 seconds of elapsed time, or a stop. Clicking Stop, changing controls, switching accounts, or leaving the tab also stops it. Individual requests time out after eight seconds.
Success requires a grasp, a lift of at least 5 cm, and a released cube resting inside the target. Results include model name and version, elapsed simulation time, control intervals, and a task fingerprint. Compare runs with the same fingerprint. This measures performance in our simulation with assisted pinch grasping; it does not establish real-robot performance.
Results are measured in the browser. Imported measurements are retained for your records and are not independently certified. Your success/failure label remains separate.