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.28-cp313-cp313-win_amd64.whl (1.6 MB view details)

Uploaded CPython 3.13Windows x86-64

orbit_cua-0.2.28-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.28-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.28-cp312-cp312-win_amd64.whl (1.6 MB view details)

Uploaded CPython 3.12Windows x86-64

orbit_cua-0.2.28-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.28-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.28-cp311-cp311-win_amd64.whl (1.6 MB view details)

Uploaded CPython 3.11Windows x86-64

orbit_cua-0.2.28-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.28-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.28-cp310-cp310-win_amd64.whl (1.6 MB view details)

Uploaded CPython 3.10Windows x86-64

orbit_cua-0.2.28-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.28-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.28-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: orbit_cua-0.2.28-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.28-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 2cfa4a9fad46d28bc7c4b9d476499b68f4da051b096d89f47d0fc035660e7bde
MD5 ddd1cc3b3b4b90902dc2ff06dbd1c487
BLAKE2b-256 99edec30b832bb99a6acc360cf94815af5b3bae30f399ed33975012096532b8a

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.28-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.28-cp313-cp313-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for orbit_cua-0.2.28-cp313-cp313-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 409e12e1ab7dabc6c46f5669165ed835a0af0a2190d5850bf0547922098206ee
MD5 d910869e084223e52b580bc8bf142d36
BLAKE2b-256 1d9ba0ce5cb069f0463df9e46cb38ffc0e26883f3536204ea638da35ead2c497

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.28-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.28-cp313-cp313-macosx_10_13_universal2.whl.

File metadata

File hashes

Hashes for orbit_cua-0.2.28-cp313-cp313-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 85d33e47e2dedc557a923fd77e3c548a2c91d432af3982f943eb063b70984141
MD5 3066ac1b7e831e10b17eae2b92cf8b58
BLAKE2b-256 26bfccb15e702a201563c63d135109afd3189cc01c5cd55b5718ee1ac78ba736

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.28-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.28-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: orbit_cua-0.2.28-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.28-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 ac49f49510791e3cb283ee3db37d6129ebd3de20ac920367ac31cbc336e37d57
MD5 6e32591f82f2e881d56e2bbc0b51e65a
BLAKE2b-256 30ec7deaf46c24cd9eb135ffadf861e852dacda22f2600601aae7e76e4cdda5e

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.28-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.28-cp312-cp312-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for orbit_cua-0.2.28-cp312-cp312-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 951bee07455e304e255e65a217d2e1b1b3904a84d2c47df3f7331d177943a033
MD5 aec876074592b045f15e0438d6eeca61
BLAKE2b-256 c76f7e893b55eea23a255ee78d033e372de63d596459b7f0eb84a150405258ec

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.28-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.28-cp312-cp312-macosx_10_13_universal2.whl.

File metadata

File hashes

Hashes for orbit_cua-0.2.28-cp312-cp312-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 da331a4ca1ed4b9399d8892485723471ebb2904a9aa176b0ef87b1b6f53fdb95
MD5 8391b26424f13ea69f90993531e95d6c
BLAKE2b-256 babffc33fffb85f9a10b5adff532410718f1fbf4d95d1d62ec53e3d59b0e6821

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.28-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.28-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: orbit_cua-0.2.28-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.28-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 003ea8f7217e913ebc0492f86b135ade876bf7027926cabde074a7271c2f388e
MD5 174f29b456f938956ceaf313eac8f533
BLAKE2b-256 da80c7f10d99d457e717e97dcdfc1fd67d85854e0f3d716c561d5c151bc75604

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.28-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.28-cp311-cp311-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for orbit_cua-0.2.28-cp311-cp311-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 4e441ed338f40dccfc4cc83d5e2d0c01c33c89b58c78276bd2b1b3606a0a8577
MD5 b72e348445c9cfe52a0129f11f4ce801
BLAKE2b-256 9bca4c4d1a520baba15b6453a1869188daec8df9fe4285f4d5be29d1fac710f5

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.28-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.28-cp311-cp311-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for orbit_cua-0.2.28-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 3d9c470b7c2a8b447954c436e4d0107ff59111e2ad0d34207ebad923a7a26e00
MD5 f9c6edf08330d2cfa89aaf96161fbf71
BLAKE2b-256 c85127d99534326f88a88566450facaac29fafc522ed1fcbfc29cb45d67ea5c7

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.28-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.28-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: orbit_cua-0.2.28-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.28-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 836151832ae63ce4c6c21db2abac519c118e63f06d12b1922e850226828b58fc
MD5 6ed8aaafda3a7574e5ef0e8453f7d577
BLAKE2b-256 072fd8ba224035054ea1e560138759ac2515a5fc74132aea15b93321419dddfa

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.28-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.28-cp310-cp310-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for orbit_cua-0.2.28-cp310-cp310-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 d608ddd3e9ac3345701898b3206791df5050917540489aa7ef4fb9db7cc65d4d
MD5 7c87e47b281d584852cafa36b734e6b2
BLAKE2b-256 bc056bf77bd389b41ed221ea5c27f58424d98e51b4daf917844522ba43ff3c7e

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.28-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.28-cp310-cp310-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for orbit_cua-0.2.28-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 048f9b17207f273375d200ede7622d52ea2566423d2fbb9247d5065bbfce832a
MD5 a2385522cf2faeb9f20183bfc1df47f4
BLAKE2b-256 6b2719bfeefdf5694f7ec496da4abf676777f6380c03da1960152d0674f2b449

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.28-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