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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.10Windows x86-64

orbit_cua-0.2.8-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.8-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.8-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: orbit_cua-0.2.8-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.8-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 d421627bf2d4dbb28947356f7ca81b645b2c5e946db76999072122c483ae8cf9
MD5 dbe219a7e89b0513a8f7b9be3088dfd0
BLAKE2b-256 e1e1709d13c57df59dbe3a8eda5156a731244f001cf1705b8428d85824eb029d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.8-cp313-cp313-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 b5a6fe742074153c64ec359e966f18e9353c57fd8969fd06ae201c92c06ae060
MD5 98d0f24e0806821e5a92ed2c6f4ae252
BLAKE2b-256 3eb59be95f987360947b6862b6433b7bafc0e609b7866ae60f9c27cd9236ffb8

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.8-cp313-cp313-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 88c0655be1f115aa9c7f6daac50b226a42248fefd65743f59305110b8671c5c5
MD5 9b5f0ae4e4bb1b04cec39efbdfe2979c
BLAKE2b-256 a5f9bf01a863c9219f1099888bd91f438eac1c878b4e0d8affed82e1e8cffe2b

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.2.8-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.8-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 054361df5f1acf96e3e43ff863361940c30b34b197a1040ed5ac4c0a681113da
MD5 6e52fee15f9b48c29c2b77b491163aec
BLAKE2b-256 a8004dfe095637fe0a409f0ea97a416a2088cd345d13402862de1dc9243be6e4

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.8-cp312-cp312-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 7b6eb724157983cfe3949479ba5e896059a929fad99eb1fe1a43ebd4e7ae2f90
MD5 38cda185f793685bcc74a191564227ba
BLAKE2b-256 37a369a990fb61c5057962bfaaf79a394b803156ab9b19ec08fc4755b38e2409

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.8-cp312-cp312-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 a81b18fc27dbe7233afe22601d4a18a2778659560ae28e1f876b082e5ac28e44
MD5 21a0b5056d31664be25083c5cafe4793
BLAKE2b-256 97521705a23f316883d95d7c4af69f197688b594ea4de67c5cfefefe147b769c

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.2.8-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.8-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 b4dca182ebb8e14ffc212c64270a08ef821314b2dd018eb1ab6e89563eb24045
MD5 b6e9432c22d8c04023831373ae973827
BLAKE2b-256 a85e2d3f41c260b7149eb4bdf7dd75cd2fd5516ad9a83ef4e3bc535ef972fb0a

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.8-cp311-cp311-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 804e3f8c5aced91514a6674a77a159eb777a26b64ef62642ea2ddae2bee4de2e
MD5 87fd0cfb18d2a901d7c9da122aed8e72
BLAKE2b-256 c452336d30c349adc2969f7c283e594d60944f0c8533e711a36f9d9c365c6685

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.8-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 4e126c2ac2cf425da06ae1d654ee238973775aa29f502496255baf30019623b7
MD5 059daa17cfd2b8ee714ea5ada0745d51
BLAKE2b-256 4e291ccccd5a6ac9643bda8a5df45f97aac7422d09f19e88b1a959d6b5edff82

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.2.8-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.8-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 78cbb5c042a1b090d74691bd035fcbccd8b5e161fc3e76b637ec92cc7e603254
MD5 84c2aaa632d1dbbe7c9d7088b3030141
BLAKE2b-256 85f7f0eb6cc17b8953e289f6dab87bd57371b9c2b9b18fd8efa3f34757d2672d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.8-cp310-cp310-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 f58f32731113274c9cfb4a7142719d86a6a796b5eda8482cfb7687176e65136e
MD5 81c6651e6b679d7f2dcefc5bf7ceadf0
BLAKE2b-256 f0953e5184c297c1b56f728bb7abe87d1701ddfcaf926e5dfb407f5c7f1f8dad

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.8-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 384ded937bb7025bb9be7e22b766a11456af1d77533f94fc6b8bc899a4d65ec3
MD5 cb02a927f9153496331bf9188f8461fc
BLAKE2b-256 5143e1ea89b6718e70c445198d024c26f32e57bc22b55484440a580e01f89a5d

See more details on using hashes here.

Provenance

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