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)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| botmanifold-0.3.1.tar.gz | 154.5 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| 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.
To learn more about protecting yourself from malicious actors, visit our package security documentation.