Skip to main content

OPERANDI SDK — let your robot operate any appliance

Your robot can walk, see, and grasp. It still can't operate the microwave, the washing machine, the oven, the coffee machine — because it doesn't know how. OPERANDI is that missing layer. This SDK is the module you drop into your robot's software to access appliances that were previously inaccessible.

from operandi_sdk import OperandiClient, execute
from my_robot import MyRobotAdapter          # you implement ~6 primitive skills

client = OperandiClient("https://api.operandi.cc", api_key="ok_live_…")

match = client.identify("Bosch Series 6 dishwasher SMS6ZCI00G")   # what your camera read
pkg   = client.operate(match.slug, robot_profile="so101")          # verified operation package
result = execute(pkg, robot=MyRobotAdapter())                      # SDK runs it, safely

print(result.summary())     # COMPLETED · 7 steps · package=sim_validated

What you get vs what you implement

OPERANDI provides You implement
The knowledge: every control + its physical interaction Actuation — your ~6 primitive skills
Grounding — where: each control's OCR text_targets, region, shape primitive; localize() returns a bbox per control from a panel photo a camera + OCR (or your own detector)
Grounding — did it work: each step's signal + expected reading expect; evaluate() decides pass/fail read_sensors() — raw readings (display text, door, lamps…)
The plan: ordered procedures as a behaviour tree —
The safety envelope: force limits, never-do, interlocks (the SDK attaches the force limit to every call)
Orchestration: sequencing, retries, safe abort —

The package no longer hands you prose like "pad labelled START" and "display shows 5:00" — it hands you the exact OCR string to find (text_targets: ["START"]) and the machine-checkable expectation (signal: "display", expect: "5:00"). So your adapter is small:

from operandi_sdk import RobotAdapter, SensorPerceptionMixin, SkillCall, Observation, localize

class MyRobotAdapter(SensorPerceptionMixin, RobotAdapter):
    def execute_skill(self, call: SkillCall) -> bool:
        # call.anchor carries: text_targets (OCR strings), region, primitive (shape), spatial
        # call.force_limit: the safety cap, e.g. "<=8N"  (respect it)
        boxes = localize(self.camera.ocr(), [call.anchor])     # OCR-grounded bbox per control
        pose  = self.depth.pose(boxes.get(call.control_id))    # your 2D->3D (or use the detector)
        return self.arm.actuate(call.skill, pose, max_force=call.force_limit, **call.params)

    def read_sensors(self, predicate) -> Observation:          # implement ONCE; verifies every step
        return Observation(display_text=self.camera.read_display(),
                           door=self.camera.door_state(),
                           moving=self.camera.motion())
        # the SDK evaluates predicate.expect against these — no per-appliance check code

Prefer full control? Implement observe(predicate_id, predicate) yourself instead of the mixin, or override per-kind check_display_change / check_door_state (see PerceptionMixin). The mixin is just the fast path.

Try it with no hardware

pip install -e .
python example.py             # identify -> operate -> execute, against a fixture
python example_grounding.py   # PROVES grounding: localize controls from a panel photo,
                              # then verify every step against (simulated) sensor readings

Safety contract

  • Every actuation carries a force_limit derived from the appliance's safety envelope — respect it (the manual's interlocks become your hard limits).
  • Verification is closed-loop: each step's success-signal is polled over its timeout, and if it still doesn't appear the SDK aborts — it never re-presses by default, because a failed verification doesn't prove the press failed (the display read may be the failure) and repeating a non-idempotent control (+30s, cycle keys) doubles the input. If your integration KNOWS a control is safe to repeat, opt in with verify_retries=N and implement the optional on_verify_retry(call, predicate, attempt) hook to adapt between tries. On abort (or a skill fault) the SDK stops the whole procedure and calls on_safety_abort() so you can e-stop / retract.
  • A package's validation_tier (auto → sim_validated → robot_cleared) tells you how much trust it has earned. Gate hardware execution on your own policy.

Zero dependencies

Stdlib only — no requests, no heavy ML — so it fits constrained on-robot runtimes.

Metadata

Release files for operandi-sdk 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for operandi-sdk 0.1.1
File Size Uploaded Provenance
operandi_sdk-0.1.1.tar.gz 56.2 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for operandi-sdk 0.1.1
File Interpreter ABI Platform
operandi_sdk-0.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 95.4 kB

Release files / operandi_sdk-0.1.1.tar.gz

Download URL operandi_sdk-0.1.1.tar.gz
Size 56.2 kB
Tags Source
SHA-256 checksum
How to use checksums
76a6db08ad5d0de586203e685166038f40f4e715df693e464919e5cf5536144d
BLAKE2b-256 checksum
How to use checksums
e32823f79cb53639a2860582f748985b3ec81edbc71250ab771b85e8acae4ef9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / operandi_sdk-0.1.1-py3-none-any.whl

Download URL operandi_sdk-0.1.1-py3-none-any.whl
Size 39.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
3e070868540cad1f1428182e79c488244b05992859e73d4c413ff4b8d13465fd
BLAKE2b-256 checksum
How to use checksums
77403d29a31f800b0b5eff279a6830b00455a66306b5c12e98cc0f202ae495ae
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Security for operandi-sdk 0.1.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page