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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.10Windows x86-64

orbit_cua-0.2.2-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.2-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.2-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: orbit_cua-0.2.2-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.2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 4446dfaf4c9e992ddf7a702502f19f2ed86bcb52fae3f9954bc291d4299cb37f
MD5 fbea7144c10c933630062a377e8933ec
BLAKE2b-256 5a34ca1435c12a6e1191ab3bc0bf8511e825cc0e27971098990f1a4c49d74974

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.2-cp313-cp313-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 7acf94aedf1de835fd8b02ca714a927a39bb000bca8575cf8e0de2104c968096
MD5 65380ca9b1379441b050ddd9e9486ec2
BLAKE2b-256 22b656bd087a7c2f82af30943129f56cd389b848bfa9ce500b0acc7dff892fc0

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.2-cp313-cp313-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 99aaa8dd348a4f0c172398e7935a992497d4605b2a577fc1d9c802879d2cf4ed
MD5 82f19d79adb154176fe789096e2167c7
BLAKE2b-256 97f29dfe7e1b97511b41b83f74114ac49aac5b2f9fb8fcd9356cf64ca5dd51cc

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.2.2-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.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 bb0ce0a8f9035e0dbf7efdbaf3a8a67079ab5baef9b6b9544af9763ed63b880e
MD5 c5d38437dbd6862656e6fad1e2869c7a
BLAKE2b-256 2d083e09d15fc8bfeb8a134ceee877acda31e019eb9959f12f0f61189b3ecfb5

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.2-cp312-cp312-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 23360142ec20ff2f8e5803e9515f2f65e80d274a6fd7845178fde125b9d75205
MD5 c88298e94efa1e2ae18da8ad777028f1
BLAKE2b-256 6318097b4e41cc8e9fa02459b7bc93c4b0546fa8b728631366eb25ebe9960891

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.2-cp312-cp312-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 69032098bed88e65c9217a1c121d1d380938dc8611f3a42e0fdcfeaa737f8e61
MD5 a407932b0a2756df31de37806e7a6d01
BLAKE2b-256 5d9e5471d217376f772ddd2d1408e56d9cf4e8fc2d2634772c88ec686146a905

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.2.2-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.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 75336669a357f3bf1e0cbe3f08074f4d844c602feddec134e5cfd4b9d68de1b2
MD5 2fd4589a7bbb1efd6ec424d4e51022e0
BLAKE2b-256 dc49f3d0cd7717e9b0dfd958de6e1e571a26f5dff504e7a82a977cff558a1836

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.2-cp311-cp311-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 22dca335f7552644e687dfbec765d6ce60012516abd6305c80a39d3349bda44b
MD5 bcfba97cf0c2ed6cbdb985d591fc5331
BLAKE2b-256 8d69d3020b6cf7990df3b24853e60e87e6013250d2d54bb07601fe024733adf4

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.2-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 322de7c8c34132d279fc4c40ce4a599757eb5ade6b819f6ee13cc9069b7da95a
MD5 0fec79d457c2f42fe986a983d730784e
BLAKE2b-256 1d5c28c93279e4ece934a26afdaacbfd13a1d1e214c1a6df9aa0b431e1ad11d1

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.2.2-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.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 fbd7f2df8a40270b18d5d9ead7dbdc97b6c4156f8e2cbb228aaa0013078b2e58
MD5 95d6569244becb6a2736aad74ce22669
BLAKE2b-256 252f6714ee1940d9078093c894ddb2d0f9ae7d06089f4225796c3067e1fa1923

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.2-cp310-cp310-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 f1cd7f10e7fff70dba6232f2530bc9d49dc84af9f09e972afeb7f3ebf9674029
MD5 aae4690e3a24706bd71b35f6084c079c
BLAKE2b-256 d997b9a7914d15ae71a763d2350cc976ae2ebfa384f1e8a3bc530423e5381248

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.2-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 e7ffad08d6573b9729cec644471087e046b85d8499d9db418f199509428abc8f
MD5 72773c5c65d6d451a75880de7b2c0c33
BLAKE2b-256 a77275228bf15283d82fe8ed0f2fc3c2f8ab5f725654bd77da45d80e5b8a2fef

See more details on using hashes here.

Provenance

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