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 · Bootstrap

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 and drives the browser via its live DOM. Screenshots only when needed. Works across desktop apps, browsers, and Electron apps — including Cloudflare-protected sites.

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())

Bootstrap — install packages before the workflow starts

from orbit import Bootstrap, Do, session
import asyncio

async def main():
    # Install system packages once — no LLM, pure subprocess
    await Bootstrap(["ffmpeg", "imagemagick"]).run()

    async with session() as s:
        await Do("Convert video.mp4 to a GIF using ffmpeg", session=s).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.40-cp313-cp313-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.13Windows x86-64

orbit_cua-0.2.40-cp313-cp313-manylinux_2_39_x86_64.whl (2.5 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.39+ x86-64

orbit_cua-0.2.40-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.40-cp312-cp312-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.12Windows x86-64

orbit_cua-0.2.40-cp312-cp312-manylinux_2_39_x86_64.whl (2.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.39+ x86-64

orbit_cua-0.2.40-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.40-cp311-cp311-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.11Windows x86-64

orbit_cua-0.2.40-cp311-cp311-manylinux_2_39_x86_64.whl (2.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.39+ x86-64

orbit_cua-0.2.40-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.40-cp310-cp310-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.10Windows x86-64

orbit_cua-0.2.40-cp310-cp310-manylinux_2_39_x86_64.whl (2.5 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.39+ x86-64

orbit_cua-0.2.40-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.40-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: orbit_cua-0.2.40-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 1.7 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.40-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 b4725daa2bec16063ad807010c0e3a4febeaddfbe638714ee1ff60dcb3ef3a41
MD5 3e83057f50b60468e2dd9afc245190d9
BLAKE2b-256 90e899cc2f3daa558a06ffa730d0e61505a1439ec1c52569fbf1578235770fb5

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.40-cp313-cp313-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 15732c21f86ca6b4851b464f4d8369a00b3477f8ed5955671afb8cf9e5310a98
MD5 40d277416144f7a7b776c81d565bab00
BLAKE2b-256 be77c18925fdc0918242a9269a797f77eb293381b82db1248df4b9d0a27450bd

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.40-cp313-cp313-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 4bc0f191ed2bb45b6fdb48ae94c4e88d293fca93c73a8eca2c2549bcd923d454
MD5 f1aa2458e2c6eecefb084727e242704e
BLAKE2b-256 d95eb68a7612a81d3462b42ae85854a3b15cfe9efdbb9cabf4a3f35f6f6f81da

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.2.40-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 1.7 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.40-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 443372bc0cb8b572aeb8e7edaff686cd344902488454b9aa06216b1dec1f4ba9
MD5 7ee56bf582e1e7d46703a300487eaa30
BLAKE2b-256 0caff0162480b6b76b2497514c2b19a2e6b6a21fd7da397aab8e3d76fca49e2f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.40-cp312-cp312-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 be89458bd56557025a4a3c322931844ab8fa710a4c6295eb547f418318d47f9b
MD5 52f38cbc2a2450f7702b5da718f91ab4
BLAKE2b-256 847c80bd7cd835e17710fd67a056afcd7406b965ed6bb91b811bcf70b3ebaf73

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.40-cp312-cp312-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 c419f0bbf58b8d297e311c7bb4a94b06a853ad752534903570cc60418b386630
MD5 e16d2e5ff2508a2584d4845d1fdea339
BLAKE2b-256 c578fd651c85b8c47df122786358eeed7fb7d5e485482b4a9fa3e76daacdfdfe

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.2.40-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 1.7 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.40-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 810c0191437d8a3c5798dc28313d3a87e3b4a93c8774eae23fbdf387a7ed6c90
MD5 092445fb5945535058fff0be62bdea03
BLAKE2b-256 aa1049aaff2d3ee8c7f3be395882791b871630cfe8fe2bccb623d5f07949ae66

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.40-cp311-cp311-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 db47e74727d8efed3f6f9196950327fb9a12af6398bb490f9065d295a72ec2ab
MD5 5fcebb98ce482ba9a363511c5c6322d4
BLAKE2b-256 c17a9615739f10ccc91788000c631ee04605c44b737341ad7e7eb283f86e31a0

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.40-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 f95c7b38fbd9592b680926e80eeb92e8dd67a625dd12336d8cdfad300671b319
MD5 4b348188b29838044c6bb7e8c3f2f656
BLAKE2b-256 aa1d6cd523b74981361ebd152c661afff132411eea8b55a80bdef96654a2f22c

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.2.40-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 1.7 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.40-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 2c7db809b9e5d1e88e047156683da53ff431bf1dd07f3a7b4a44614b62be65a6
MD5 e5cc24e3ee40a3a40e68aeef20369a3b
BLAKE2b-256 100dfe5770d4d1995add82c6a63507f5ad2f29d5111ec5e646ed4c94ed9266b6

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.40-cp310-cp310-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 8a990b186b8056ec6ae8d6d63d9dcffe0730f0c9629d1fd992acb77c8690eefb
MD5 c97bd28b84c2cb7bb2a9b94d371851a0
BLAKE2b-256 c037c4b9462666e1c06d02c464870a38c319aed3019880838d2ca36ea0aece72

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.40-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 1e4eb643b0c481173efeedec4d7d264a72b4f349cda30588ee8e2b0ab5294e1d
MD5 79933b92926c797105a888e9e1ba9f12
BLAKE2b-256 d1083a14c2e8accd4e6a997848e5b9495cf662c9639f94d36668ef106b5eba64

See more details on using hashes here.

Provenance

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