Skip to main content

BotManifold SDK

Official Python SDK and CLI for BotManifold: verify robot policies in simulation, manage datasets and training jobs, and run the teleop bridge for real arms.

Installation

pip install botmanifold

Optional extras:

Extra Adds For
async httpx[http2], httpx-sse AsyncBotManifoldClient
serve uvicorn botmanifold serve
bridge mujoco, lerobot[feetech], pymycobot the local teleop bridge (botmanifold bridge ...)
dev pytest, ruff development
pip install "botmanifold[bridge]"

The bridge extra pulls in lerobot and its dependencies (torch, opencv-python-headless, ...). The base install is a lightweight API client; verify users never pay for it.

Quick start

from botmanifold import BotManifoldClient

client = BotManifoldClient(api_key="bm_...")

report = client.verify.run("my_policy.zip", scenario="messy_room")
print(report.verdict)   # Verdict.SAFE, Verdict.UNSAFE or Verdict.ERROR
print(report.score)

CLI

botmanifold --help

# Verify a policy (a ZIP, or a running policy server)
botmanifold verify my_policy.zip --scenario messy_room
botmanifold verify --url http://localhost:8765 --scenario messy_room

# Local development
botmanifold serve my_policy.py --port 8765          # serve a policy over HTTP
botmanifold mock-server episode.jsonl --port 8765   # replay recorded episodes

# Datasets and scenarios
botmanifold datasets list
botmanifold datasets quality <dataset_id>
botmanifold datasets episodes <dataset_id>
botmanifold scenario validate <scenario>

# Managed training jobs
botmanifold train submit ...
botmanifold train status <job_id>      # also: list, logs, cancel, set-provider

# Teleop bridge for real arms (needs the `bridge` extra)
botmanifold bridge serve ...           # also: teleop, upload, sessions, robots, pair, resume,
                                       # jog, control-take, confirm-calibration,
                                       # confirm-diagnostics, confirm-leader-web

Run any command with --help for its options.

Async usage

import asyncio
from botmanifold import AsyncBotManifoldClient

async def main() -> None:
    async with AsyncBotManifoldClient(api_key="bm_...") as client:
        report = await client.verify.run("my_policy.zip", scenario="messy_room")
        print(report.verdict)

asyncio.run(main())

API reference

Client

client = BotManifoldClient(
    api_key="...",      # or set BOTMANIFOLD_API_KEY
    base_url="...",     # optional, defaults to production; or BOTMANIFOLD_API_URL
    timeout=30,         # request timeout in seconds
)

The client exposes verify, training and pipeline.

client.verify

# Verify a policy file and wait for the result
report = client.verify.run(policy="policy.zip", scenario="messy_room", num_episodes=5, timeout=300)

# Or verify a running policy server
report = client.verify.run(policy_url="http://localhost:8765", scenario="messy_room")

if report.is_safe:
    print("Policy is safe")

# Non-blocking
report = client.verify.run("policy.zip", scenario="messy_room", wait=False)
final = client.verify.wait(report.job_id)

# Poll an existing job
status = client.verify.status(job_id)

client.training

Training runs, checkpoints and managed jobs: list_runs, get_run, list_checkpoints, get_convergence_status, submit_job, get_job, list_jobs, cancel_job, get_job_logs, set_gpu_provider, and the reporting calls report_metrics, report_gpu, register_checkpoint. Reporting needs BOTMANIFOLD_TRAINING_API_KEY. The Training Monitor service these talk to is not deployed in staging or production.

client.pipeline

Dataset management: list_datasets, get_dataset_quality, list_episodes, exclude_episodes.

Hardware

bundles = client.get("/api/hardware/bundles")
for b in bundles["bundles"]:
    print(f"{b['name']} - ${b['price_cents'] / 100:,.2f}")

See examples/hardware_quickstart.py.

Teleop bridge

botmanifold.bridge is the local agent that drives an arm (SO-100, myCobot 280), records demonstration episodes as LeRobot datasets, uploads them, and talks to the Studio Teleop panel over WebSocket (directly or through services/teleop_relay). It also hosts the myCobot diagnostics checks. The setup guides are in docs/guides/.

Environment variables

Variable Description
BOTMANIFOLD_API_KEY API key for authentication
BOTMANIFOLD_API_URL Custom API base URL
BOTMANIFOLD_TRAINING_API_KEY API key for training reporting calls

Development

# From the repository root (a plain `uv sync` removes this package)
uv sync --all-packages --all-groups --all-extras

uv run pytest sdk/python/tests -q
uv run ruff check sdk/python/botmanifold

License

Proprietary - see LICENSE file.

Metadata

Release files for botmanifold 0.3.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 botmanifold 0.3.1
File Size Uploaded Provenance
botmanifold-0.3.1.tar.gz 154.5 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for botmanifold 0.3.1
File Interpreter ABI Platform
botmanifold-0.3.1-py3-none-any.whl Python 3 none any Details

Total release size: 332.7 kB

Release files / botmanifold-0.3.1.tar.gz

Download URL botmanifold-0.3.1.tar.gz
Size 154.5 kB
Tags Source
SHA-256 checksum
How to use checksums
20e26800dd18f470cff700b8027800f51cba407992df7f50b7ccb85d4e28097e
BLAKE2b-256 checksum
How to use checksums
f1bcdb60f11667de10ec8a507f744bdc37ccb14529d9f21957faaa93123aca15
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.12

Release files / botmanifold-0.3.1-py3-none-any.whl

Download URL botmanifold-0.3.1-py3-none-any.whl
Size 178.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
d34c4e12530f3cceb8c3da4f09290e144cc8c4cb34c6b5d2b9ddb56bde2a3879
BLAKE2b-256 checksum
How to use checksums
969039f6ed31307a65fed507a9dc6b97d6e50d2fa8ca5f0da44aa35b5ce9b4ef
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.12

Security for botmanifold 0.3.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.3.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