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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.10Windows x86-64

orbit_cua-0.2.15-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.15-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.15-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: orbit_cua-0.2.15-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.15-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 36b7ad8a7e2127091954e0569d86eee3d6b5357b378bcf08bcaa8cdf4a35bc37
MD5 d0aa00ffe5268bfc8a68a7f4d7a5d160
BLAKE2b-256 d38dc42bf91bc1db3d223107984f42107d41bc0c484cf922839b30f0dbfc5ba8

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.15-cp313-cp313-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 62941d332475881adf8e295ae70d2d5763ff2dd5bee780b19fa4f692d2783a7a
MD5 1740e087abf3194f8a7c6c9d7c399fb1
BLAKE2b-256 2b3cee78cae0f7e2cea49810ab7ae75f47b936892eff7f3d4884dfb7fa2b5f03

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.15-cp313-cp313-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 f3c126c4fcafde7fec84d590fc2bc4a28b49aefce6e38dcfcac0120c0d07c86a
MD5 d326033c9c58eae413cacf29a5b7005d
BLAKE2b-256 ff1f1a61297e163dbd9629e8e71e28fa0e9c74364f90475a257541520c5ec126

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.2.15-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.15-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 3fd50f186319bd4acaaf686600b4b28d77657557e4f0a4637d9b5fc019ee5ebf
MD5 4af5a64693cc2c88044a267dcdc5be23
BLAKE2b-256 71d2b264228cedbaa4ff7edc22d6779f1a9728da501967509f785a6619036c00

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.15-cp312-cp312-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 fe6c28b9fde4145461e939fd6e99faa0991b02a9a17681e00bf76fbb8932ead0
MD5 1c1eb488f266ba3ca26241810bb880b0
BLAKE2b-256 9a98a2b03078c2983d0e31d26271baedc6c699953794836c4cf011a6585e7a8f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.15-cp312-cp312-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 f8c7829ac4933891244ca87475db486c7c6d0dfe4e372dafe6ca2a0d35e1ecc4
MD5 8a4dc8f2463326ef1b4afa5c81c84d56
BLAKE2b-256 1ee29428aa72b5255f0be5c2d4d7499f95614c6dac1a7ae855c4dae1155514a6

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.2.15-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.15-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 b378fb1d1611cdde7e6ded0653475fa3c3184155735a4d582e7ef6662a484852
MD5 11e6e7208a9619dbeca501939bcc793d
BLAKE2b-256 ad9f9d4e1ccc9c45cb73e71febef858963acf99ea7473df0a1de406e10d512ea

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.15-cp311-cp311-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 c55a37630d603d129820e0975efb79700ef1d94082260ed30e1368f26f483583
MD5 39dd33d8c15d63bc163a46f2f99dc146
BLAKE2b-256 539c9ada74b10944390929f83b1d72c332f405ec5ba810abb41b53375b75ab0f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.15-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 26ad593cebd778c35f28cad8a4002ddeebb3b2f0100b3010c7c17eea19608fcc
MD5 42b131866e151385067a90e17f57e867
BLAKE2b-256 da887485d9795ed658d31abce5fa1e3bd7fe364594a03c0ea00294d6a0189dad

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.2.15-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.15-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 29d79bb731d71ba16c7abb0e6f05d5194d3b9db46556b4837e28de95e72f147a
MD5 7338882f299086eb60b8581003d6a050
BLAKE2b-256 c7705694f63fd637e32948271119414c350128c876a0bacf0c5e10e2c357e0bd

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.15-cp310-cp310-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 61c409eda4dee3ddd1b24c95530912de31bf7e2d28f079fe73848b377eb833c0
MD5 7cf6f8a08865d82da55c7be1b11d24e2
BLAKE2b-256 58f4bdd8c0e9174a7e45836777cfb99484b58bbd7f9426a51be10a144cc5db79

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.15-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 54ca57366ebf41ace4034e19ea718e7fa65d6b54e502c5ddf125b9128b5d005e
MD5 53657cdc3780ecce97e0d3acd689620c
BLAKE2b-256 b5481e486740ec6060a3097a0ea25972c41fa6c7fccf1686df497d8563998b6e

See more details on using hashes here.

Provenance

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