Skip to main content

General computer-use agent.

Project description

Orbit logo

Autonomous agents are demos. Controlled agents are products.


Watch Orbit in action


The problem

AI agents can use computers now.

But in practice:

  • they loop
  • they click the wrong thing
  • they get stuck on simple steps
  • they're impossible to steer mid-task

Most frameworks either hide everything in a black box, or hand you raw tools with no structure.

Neither works in production.

Orbit

Natural language controls the screen.
Python controls the flow.

Instead of one monolithic agent, Orbit breaks execution into independent steps:

Do · Read · Check · Navigate · Fill

Each step runs its own model, has its own budget, and returns typed output. All steps share context.

Why this matters

  • Use a cheap model for simple clicks, a powerful one for complex reasoning
  • Cap LLM calls per step , nothing runs forever
  • Inject guidance mid-execution when the agent is struggling
  • Extract structured data directly into Pydantic models
  • Toggle planner=False for low-latency direct execution

This turns agents from demos into usable systems.

Key difference

Most agents see pixels.

Orbit sees the UI.

It reads the OS accessibility tree , screenshots only when needed, no DOM hacks. Works across desktop apps and browsers with lower token usage.

Quickstart

pip install orbit-cua
from dotenv import load_dotenv
load_dotenv()

from orbit import Agent
import asyncio

async def main():
    result = await Agent(
        task="Open Chrome and go to Wikipedia",
        llm="gemini-3-pro-preview",
        verbose=True,
    ).run()
    print(result.status)

asyncio.run(main())

Set your API key , Orbit supports any model via LiteLLM:

export GEMINI_API_KEY="your-key"   # or OPENAI_API_KEY / ANTHROPIC_API_KEY

Composable SDK

When you need precision, drop to the SDK:

from dotenv import load_dotenv
load_dotenv()


from orbit import Do, Read, Check, Navigate, session
from pydantic import BaseModel
import asyncio

class Product(BaseModel):
    name: str
    price: float
    in_stock: bool

class ProductList(BaseModel):
    products: list[Product]

async def main():
    action_model = "gemini-3-flash-preview"

    async with session() as s:
        await Navigate(
            "https://www.amazon.com/s?k=mechanical+keyboard",
            session=s, llm=action_model, max_steps=30, planner=False,
            extra_info="Avoid bookmark bar links; use direct navigation tools first.",
            verbose=True,
        ).run()

        if await Check(
            "The current page is a Captcha page and `Continue Shopping` button is visible",
            session=s, llm=action_model, max_steps=30, planner=False,
        ).check():
            await Do(
                "Click `Continue Shopping`, then solve the Captcha.",
                session=s, llm=action_model, max_steps=30,
            ).run()

        products = await Read(
            "All search results",
            schema=ProductList,
            session=s, llm=action_model, max_steps=30, verbose=True,
        ).run()

        cheapest = min(products.output.products, key=lambda p: p.price)

        await Do(f"click on '{cheapest.name}'", session=s, llm=action_model, max_steps=30).run()

        if await Check("Add to Cart button is visible", session=s, llm=action_model, max_steps=30).check():
            await Do("click Add to Cart", session=s, llm=action_model, max_steps=30).run()

asyncio.run(main())

The idea

Agents shouldn't be one giant prompt.

They should be composable systems.

Orbit gives you:

  • verbs instead of prompts
  • steps instead of guesswork
  • control instead of hope

Custom actions

Build reusable, domain-specific actions by subclassing BaseActionAgent:

from dotenv import load_dotenv
load_dotenv()

from orbit import BaseActionAgent, Navigate, session
from pydantic import BaseModel
import asyncio

class ProductList(BaseModel):
    products: list[dict]

class ReadTopProducts(BaseActionAgent):
    def __init__(self, category: str, **kw):
        super().__init__(max_steps=12, planner=False, **kw)
        self.category = category

    def task_prompt(self) -> str:
        return (
            f"Read top products for '{self.category}' from the current page. "
            "Extract name, price, and stock status only. Do not click or navigate."
        )

    def output_schema(self):
        return ProductList

async def main():
    async with session() as s:
        await Navigate("https://www.amazon.com/s?k=mechanical+keyboard", session=s).run()
        result = await ReadTopProducts(
            category="mechanical keyboard",
            session=s, llm="gemini-3-flash-preview", verbose=True,
        ).run()
        print(result.output.products[:3])

asyncio.run(main())

Examples

See examples/ for full end-to-end scripts, including a LinkedIn Easy Apply bot that applies to jobs autonomously.

Installation

Install from source

Build from source (requires Rust)
git clone --recurse-submodules https://github.com/aadya940/orbit.git
cd orbit

cd oculos && cargo build --release && cd ..
mkdir -p orbit/_bin

# Linux/macOS
cp oculos/target/release/oculos orbit/_bin/oculos

# Windows
copy oculos\target\release\oculos.exe orbit\_bin\oculos.exe

pip install .

Also requires Tk GUI toolkit for tkinter python.

sudo apt install python3-tk

macOS users: grant accessibility permissions as described here.

Support matrix

OS Architectures
Windows x86-64 (win_amd64)
Linux x86-64 (manylinux)
macOS Intel + Apple Silicon (universal2)
Python 3.10 · 3.11 · 3.12 · 3.13

Safety

No permanent file deletion , destructive operations go to Trash/Recycle Bin. Disk writes require explicit human approval via a configurable callback.

License

Apache 2.0 , Special thanks to OculOS and the open-source packages that make this possible.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

orbit_cua-0.2.30-cp313-cp313-win_amd64.whl (1.6 MB view details)

Uploaded CPython 3.13Windows x86-64

orbit_cua-0.2.30-cp313-cp313-manylinux_2_39_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.39+ x86-64

orbit_cua-0.2.30-cp313-cp313-macosx_10_13_universal2.whl (1.4 MB view details)

Uploaded CPython 3.13macOS 10.13+ universal2 (ARM64, x86-64)

orbit_cua-0.2.30-cp312-cp312-win_amd64.whl (1.6 MB view details)

Uploaded CPython 3.12Windows x86-64

orbit_cua-0.2.30-cp312-cp312-manylinux_2_39_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.39+ x86-64

orbit_cua-0.2.30-cp312-cp312-macosx_10_13_universal2.whl (1.4 MB view details)

Uploaded CPython 3.12macOS 10.13+ universal2 (ARM64, x86-64)

orbit_cua-0.2.30-cp311-cp311-win_amd64.whl (1.6 MB view details)

Uploaded CPython 3.11Windows x86-64

orbit_cua-0.2.30-cp311-cp311-manylinux_2_39_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.39+ x86-64

orbit_cua-0.2.30-cp311-cp311-macosx_10_9_universal2.whl (1.4 MB view details)

Uploaded CPython 3.11macOS 10.9+ universal2 (ARM64, x86-64)

orbit_cua-0.2.30-cp310-cp310-win_amd64.whl (1.6 MB view details)

Uploaded CPython 3.10Windows x86-64

orbit_cua-0.2.30-cp310-cp310-manylinux_2_39_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.39+ x86-64

orbit_cua-0.2.30-cp310-cp310-macosx_10_9_universal2.whl (1.4 MB view details)

Uploaded CPython 3.10macOS 10.9+ universal2 (ARM64, x86-64)

File details

Details for the file orbit_cua-0.2.30-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: orbit_cua-0.2.30-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 1.6 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for orbit_cua-0.2.30-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 d768731547e5134825b830ea6d7892eb76525b666c82d34c56bba3a02b2b012d
MD5 ba2625475a59538dcac69968cf925523
BLAKE2b-256 48f6306c98e2d266e219b46c6a64d035f6cf40ac2a5fd72878aab4dfe97f9516

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.30-cp313-cp313-win_amd64.whl:

Publisher: release.yml on aadya940/orbit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file orbit_cua-0.2.30-cp313-cp313-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for orbit_cua-0.2.30-cp313-cp313-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 c2fadc1973dc065c760f3cab9faf722c913ac54aa43be8a339c747a943f6ee1c
MD5 e2277ef37cb4023393202cab05cb8373
BLAKE2b-256 63a751b78cbbf31a0a3e9dd2a3f496b03c57e7264e7b20ed1549793b8fe6a2a9

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.30-cp313-cp313-manylinux_2_39_x86_64.whl:

Publisher: release.yml on aadya940/orbit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file orbit_cua-0.2.30-cp313-cp313-macosx_10_13_universal2.whl.

File metadata

File hashes

Hashes for orbit_cua-0.2.30-cp313-cp313-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 402325e5a6f3507a9b36cbe0cd58e419f7ac6aa99c12bc0e07c2753be5e7f45f
MD5 cdc0949a60e9c04071432caca05c9e5e
BLAKE2b-256 def6cbb8073be1fc1eb7f1a12f92f6d979a6e9cb92506f28119c9f9a6bea5485

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.30-cp313-cp313-macosx_10_13_universal2.whl:

Publisher: release.yml on aadya940/orbit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file orbit_cua-0.2.30-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: orbit_cua-0.2.30-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 1.6 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for orbit_cua-0.2.30-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 b2759936f9d1be7ddea370ee741430f473230cfbfac4d27ad71526ee85aac207
MD5 b50a6794dbb65270b7f82c0252d339c8
BLAKE2b-256 25ec2f19b5aa36f3c41787bb1aa802888325482212b885c320a4b2f3b6c979eb

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.30-cp312-cp312-win_amd64.whl:

Publisher: release.yml on aadya940/orbit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file orbit_cua-0.2.30-cp312-cp312-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for orbit_cua-0.2.30-cp312-cp312-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 51648da95f53acebf9d5a53715972be54600fdcc49d9fece5b2159bc18e17e77
MD5 900156cb498195e819e1dd77fa874e89
BLAKE2b-256 37c3f98dc1d64cc1384cea989861e24842db2839f46a2c1264ffa2bf5c19b9c7

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.30-cp312-cp312-manylinux_2_39_x86_64.whl:

Publisher: release.yml on aadya940/orbit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file orbit_cua-0.2.30-cp312-cp312-macosx_10_13_universal2.whl.

File metadata

File hashes

Hashes for orbit_cua-0.2.30-cp312-cp312-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 649f28d8e5967c63985153858aeaeec54c6908f00d26e263b5c3a0792e6d61d0
MD5 b441ebeb9fdd02e640a93f5fe22a15fb
BLAKE2b-256 b648b18c72d92b700a419f3f3ee3925d7939098a439310a87c35c6f3217710f4

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.30-cp312-cp312-macosx_10_13_universal2.whl:

Publisher: release.yml on aadya940/orbit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file orbit_cua-0.2.30-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: orbit_cua-0.2.30-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 1.6 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for orbit_cua-0.2.30-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 68f53395a1b1d9d4cbd1a6aa1c2d793dea7c136f3966df922ab6c9b561352913
MD5 182b3cd275ac93361a659a138fb74a04
BLAKE2b-256 22a7056928fb8182ea0ee88a806cadba0a1f40171d55a75eabd099dfb563a5c1

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.30-cp311-cp311-win_amd64.whl:

Publisher: release.yml on aadya940/orbit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file orbit_cua-0.2.30-cp311-cp311-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for orbit_cua-0.2.30-cp311-cp311-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 9f7da2235d37d02fb0dc51fe561ddbb01343dae446be7b1a5448e84303456e75
MD5 f34c91b451c2b68f6e0ee858e65e7953
BLAKE2b-256 5a11a34e684699e7389155a31221726656efda26f3f64290946b3bcfa4e8f587

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.30-cp311-cp311-manylinux_2_39_x86_64.whl:

Publisher: release.yml on aadya940/orbit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file orbit_cua-0.2.30-cp311-cp311-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for orbit_cua-0.2.30-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 1ff213b57d7f723fe75d6604eeb54bd42d3149e477d8d08c3bf43c8e1cf7a547
MD5 51caa5b475833232983dace4ab82ea36
BLAKE2b-256 450bdf197d2be840d4cc6dbc8b2d4a6de146962d949f75493c449db8b5d2a8db

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.30-cp311-cp311-macosx_10_9_universal2.whl:

Publisher: release.yml on aadya940/orbit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file orbit_cua-0.2.30-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: orbit_cua-0.2.30-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 1.6 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for orbit_cua-0.2.30-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 7f134206f8f5df767160abb9f822d98dc9feeb8f8a9712d7f7223132d4484413
MD5 d616a8e18fc2ef105062930165dd1cad
BLAKE2b-256 6564278ea989a0dfc69f0125661be25a1a24eddbe4dc8e6e3c6abd68cf7110bd

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.30-cp310-cp310-win_amd64.whl:

Publisher: release.yml on aadya940/orbit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file orbit_cua-0.2.30-cp310-cp310-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for orbit_cua-0.2.30-cp310-cp310-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 290869c6b1038acb2bc34257ecdd92f16b883bdd89f4df6e1cfd438dcd149492
MD5 9658d11ce3ef512e497fb0700d261240
BLAKE2b-256 4aa7ed353971b99ce16b22c8c146620576377b5a0c6aab8cf881381d2df2d3ba

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.30-cp310-cp310-manylinux_2_39_x86_64.whl:

Publisher: release.yml on aadya940/orbit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file orbit_cua-0.2.30-cp310-cp310-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for orbit_cua-0.2.30-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 b48c8815abbd1c083d5c7e8999cbb4f7a726e43cbd47e3a8b1033835ddb6200d
MD5 06e9ba8db20e6a3c937284600eec58cb
BLAKE2b-256 fe09e3bcd724e8f6552c1350c88b38b2c3332cad11ae653be101786a97303433

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.30-cp310-cp310-macosx_10_9_universal2.whl:

Publisher: release.yml on aadya940/orbit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page