[build-system] requires = ["setuptools>=77"] build-backend = "setuptools.build_meta" [project] name = "ohho-os" version = "1.2.0" description = "OhhO OS — the open-source, robot-agnostic engine for any robot, with or without ROS." readme = "README.md" requires-python = ">=3.10" license = "Apache-2.0" license-files = ["LICENSE"] authors = [{ name = "OhhO" }] keywords = ["robotics", "ros2", "vla", "agent", "embodied-ai"] classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "Intended Audience :: Science/Research", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Topic :: Scientific/Engineering :: Artificial Intelligence", "Topic :: Software Development :: Libraries :: Python Modules", "Typing :: Typed", ] # The `base` install is intentionally dependency-free: the core runtime, the # robot abstraction layer, the simulator and the CLI run on the standard library # alone, on any OS. Add only the extras your robot and workflow need. dependencies = [] [project.optional-dependencies] yaml = ["pyyaml>=6.0"] # load robot manifests from .yaml serial = ["pyserial>=3.5"] # Yahboom serial adapter (OmniBot base) arm = ["lerobot>=0.1"] # Feetech arm adapter (SO-101, OmniBot arm) agent = ["numpy>=1.24", "anthropic>=0.40"] # real agent brain (agent_engine + Claude) data = ["pyarrow>=14.0"] # LeRobot Parquet dataset writer # cyclonedds is a build/runtime dep of unitree_sdk2py (not on PyPI — install from GitHub). unitree = ["cyclonedds>=0.10"] # Unitree DDS adapter (G1, Go2, H1, B2 …) dji = ["pymavlink>=2.4"] # DJI / MAVLink adapter (drones) serve = ["fastapi>=0.110", "uvicorn>=0.27", "websockets>=11.0", "httpx>=0.27,<0.28"] # Starlette TestClient (pre-0.37) sim-serve = ["websockets>=11.0"] # sim-serve WebSocket server train = ["torch>=2.1", "numpy>=1.24"] # training pipelines (delegates to lerobot_engine) ros2 = [] # rclpy ships with your ROS 2 distro — source it, then install this extra dev = ["pytest>=7", "coverage>=7", "httpx>=0.27,<0.28"] all = [ "pyyaml>=6.0", "pyserial>=3.5", "lerobot>=0.1", "numpy>=1.24", "anthropic>=0.40", "pyarrow>=14.0", "torch>=2.1", "cyclonedds>=0.10", "pymavlink>=2.4", "fastapi>=0.110", "uvicorn>=0.27", "websockets>=11.0", "httpx>=0.27,<0.28", ] [project.urls] Homepage = "https://ohho-robotics.com" Documentation = "https://ohho-robotics.com/os" Source = "https://github.com/ohho-robotics/ohho-os" Issues = "https://github.com/ohho-robotics/ohho-os/issues" [project.scripts] ohho = "ohho.cli:main" [project.entry-points."ohho.robots"] builtin = "ohho.robots.builtin:plugin" [tool.setuptools.packages.find] include = ["ohho*"] [tool.setuptools.package-data] ohho = ["robots/*.json", "agent_rules/*.md"] [tool.pytest.ini_options] pythonpath = ["."] testpaths = ["tests"] # CI gates ohho/safety.py at >= 95% line+branch coverage: # coverage run --include=ohho/safety.py -m unittest tests.test_safety # coverage report --include=ohho/safety.py --fail-under=95 [tool.coverage.run] branch = true