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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.10Windows x86-64

orbit_cua-0.2.5-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.5-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.5-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: orbit_cua-0.2.5-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.7

File hashes

Hashes for orbit_cua-0.2.5-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 48993648e4e8c6a8482de06b06953aa6ff8a27f1b5fa7731240eebed3e3eeca4
MD5 52d1a0bebfd560ad2cecbf97c98a35ed
BLAKE2b-256 4c9b3b690d4b2000fb15c20695917252ae3665031083960b40ee8b7771363778

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.5-cp313-cp313-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 d28f236e32503ecf9d62b7e3c62c50d70f8b4ddacea205c57ba13c0f507e0c18
MD5 5c5b06715c8ccbadbda33f02f2af12f7
BLAKE2b-256 7f7f8828f6203fbe0f749f3ad6938d6bd046242a78d3118646a0adbbb85f1354

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.5-cp313-cp313-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 41a0f726e71b833936cad381b1ffb6b6211c56d4af5e203c86c3e8ce5a4d792f
MD5 c72a2766c92dd613e35f5b64c1fcda1e
BLAKE2b-256 1bf71f8e513756eea3a877ae35eec29679906b7f521d6ae978da70c325c7fbad

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.2.5-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.7

File hashes

Hashes for orbit_cua-0.2.5-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 457192f230a9eb6b15e3323caa731222d4a6c29ea199f4c8bfedf98a9d646dae
MD5 c97644078e350bcd15a6c8d6902a5b6d
BLAKE2b-256 704aa82c98534e13ecd8901a99aaee46ca9550f64169ae693db65729a03b920c

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.5-cp312-cp312-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 15829eb77feace42069fe77210126d5d7f867908dd7e77beb275a10f1bd90f5e
MD5 07c00caedd703158936c184f5986bf0b
BLAKE2b-256 e4b16ea52b5eae01e8f5b882263141d45233282dbd53dc21b825c4a0aca3c97c

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.5-cp312-cp312-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 c0faa5fd1e713840cfbf2accb6394acb95594e18612c1cb85bf7ec6d390d58e9
MD5 4889ba0a2eaf25eaf20854bf6db9b159
BLAKE2b-256 05f69240fe31bbafad9b9e7537a18c2bf546db49836707dff7576f9ed4d06fff

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.2.5-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.7

File hashes

Hashes for orbit_cua-0.2.5-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 57e8341280001f40546a85f1e583f44796cf91f1ba2777dd5db8dc292f2dcfda
MD5 5f9affe87bf93d1c20b307179dd73d26
BLAKE2b-256 61b320bbe501e19b34b479f404ce776277ba8e18da9c8c5e1aec0b8bcd1aa3ca

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.5-cp311-cp311-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 5736a5185ff556f7dccb7720c4380007666f63299fcb78eb296ecec74f788004
MD5 1ea175da4d478d93fd8881d886fe4b8d
BLAKE2b-256 e50f00b2ae13688daa72b301886b69fea965afaee63506fa36ab8293cde1afce

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.5-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 a3245738c4062895aa15077ced6eef2839e8a88a69a28e58d8e5eee9bfefd953
MD5 873bf60160d9991a2ddf63dea68e4eac
BLAKE2b-256 c68d9059a11f40c9bbafe5b5fe8244ce033a56e400b8396732e6036179cabc7e

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.2.5-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.7

File hashes

Hashes for orbit_cua-0.2.5-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 a820263bbe9cb7d7c9601a45ec4843197d3106a65efb0b834aa21058c63a0a12
MD5 53d9a3c8b74e5e51eef02c3feb8ee3c3
BLAKE2b-256 8399a1ad0f3b0d7f342e65accf79f86c48cde1b9690b7f5c0a9c26ae174c2d5a

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.5-cp310-cp310-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 9ebba72bb08c9aabd06e186b7fa4ca94a97f38bb1ae2f299705a2bda2fd7b5b3
MD5 30ee13dd497ac6aeb117e36cbd66b2ba
BLAKE2b-256 2c084f7bdb480e2da4935dc4a26d7e485b09be3477806bfa07bf977a7aa35219

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.5-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 4a179248339e6738d9baef7ca5a891de9199ff9f2f985de79c7312150155d69e
MD5 f81761414fe341629cf1f1000df5cd23
BLAKE2b-256 355d4c4c730f8434c373ef7f27e69e15a11c419d2891281242bc690483358670

See more details on using hashes here.

Provenance

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