Skip to main content
The public Python lifecycle is small: build a model-shaped observation, open a policy, choose one prediction interface, and close the policy deterministically.

Connect and close

Use a context manager for the synchronous SDK:
Use aconnect() when your application already owns an async event loop:
If a context manager is impossible, call policy.close() or await policy.close() in a finally block.
Open sessions consume prepaid credits. Deterministic closure matters even when inference has stopped. Inspect open sessions with dropbear sessions list, and terminate an abandoned session with dropbear sessions stop <session-id>.

Choose a prediction interface

Inspect a chunk with predict

predict() sends one observation and does not actuate:

Drive a caller-owned loop with next_action

next_action() refills its internal action buffer as needed. Validate every returned action before applying it:
On any timeout, disconnect, invalid action, or local fault, stop applying new actions and invoke your robot-side hold or stop path.

Run a bounded loop with run

run() calls observe, validates the returned model object, buffers action chunks, and calls act up to max_actions:
The callback is the actuation boundary. Do not use this example until the embodiment-specific limits, watchdog, collision behavior, and physical e-stop are tested locally.

Region and transport

Leave both settings on their defaults first:
  • region="nearest" selects the closest configured capacity.
  • region="available" may select another supported region when the nearest region has no capacity.
  • region="ap-southeast-2", "us-west-2", "us-east-1", or "eu-central-1" requests a specific region.
  • transport="auto" tries QUIC and can fall back to the hosted relay.
  • transport="quic" requires the UDP path.
  • transport="relay" uses the relay directly.

Progress, hooks, and timeouts

connect() prints lifecycle progress by default. Supply a callback to route messages into your logger, or None to suppress them:
RunHooks provides structured action, timing, and buffer events for a run() call:
predict() and next_action() default to a 60-second response timeout. Set timeout_s from your application fault budget. idle_timeout controls the cloud session’s inactivity limit and defaults to 3600 seconds; it is not a substitute for closing the session.

Optimization overrides

acceleration, control, rtc, and calibration are advanced connection overrides. Keep each on "auto" unless Dropbear support asks you to test a specific configuration:
The resolved configuration is available as policy.resolved_optimization_config for diagnostics.

Migrating existing SO-101 code

connect_so101() is a deprecated compatibility surface for the legacy turnkey SO-101 loop. New integrations should build observations with dropbear.so101.observe() and connect through dropbear.connect(). Existing users can continue the SO-101 guide while migrating their controller boundary. Next, confirm the exact camera, state, and action ordering in Model contracts.