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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.10Windows x86-64

orbit_cua-0.2.9-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.9-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.9-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: orbit_cua-0.2.9-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.9-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 52d8d58b2dd8137b5c55b245170ea934fe7cecc628ce2e721d56e8730aef74fd
MD5 3594563151fd52597e337590d79daae4
BLAKE2b-256 863bf942d2a1b79672ab03d8ce88b154b1618ab71a60fa9bf60fbf4327246d4e

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.9-cp313-cp313-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 a51c2a9e3ddc1429cffc5a7a7b06bc249ebd6d65d692ede4de0e04db1ff2c42e
MD5 5167fd9c7bb3fa63a1201e139db27e01
BLAKE2b-256 c2447cacbd3d60b107c50f1f3d21282bbb15bff1ed6c0b02060ca90d36f1752f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.9-cp313-cp313-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 493fb8afe55cbf3aba6a173851b8463adf3f24042ea46580eb711463de9ecf52
MD5 ab61afcea09d1875d1c59eee6291c7b7
BLAKE2b-256 41bf1bba1e2fc8ab82fa9d80eb574a3aafff823235177bc9b7f2cb633379f7b3

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.2.9-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.9-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 44322c8a272aa4744d158833274f23083db5df34a0f838fc524a1f29634ed2e8
MD5 fabcf6042679708f56a67cda624cf64f
BLAKE2b-256 eea007e40001ee6f278883217cb830ab470a49232d8a5f854a3ad1e0c61faf08

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.9-cp312-cp312-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 689fc0a09a4f93e1169ba15b1de6fbe1586bf1d563a5addb51208197979c0847
MD5 4db3243774e449e68c3e8082577b4cff
BLAKE2b-256 6f3e5240c8b6ea2d6c5f31c6a1ad517c7fa5fa3e507f271dceb9577617b2c7f9

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.9-cp312-cp312-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 dff668dafa689246a6e1acf301d6f1d7230869334f4307252d427e34358493b5
MD5 9f94193dfce781377f1b21ccd9440fce
BLAKE2b-256 45ccae41df48923c8562c4ff633ed0bd82189de3b6ca4179e7bb720f0eae830c

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.2.9-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.9-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 d853950cfc7caa831f2abe544ff86bfa5e1a5248367229a6af5b3d33ea0728a9
MD5 1cb5137054088d1200e1c668f9773dd9
BLAKE2b-256 838245cc433818bb64a19ae0c85c7965e33fab9d384ddce284fdc1bc35494514

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.9-cp311-cp311-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 176681b98c312419d446b9530bbb7046a6d0f4c950131580053a9e227e5b250f
MD5 82af78b4afc2c4e1b36ff1748c5c6547
BLAKE2b-256 31060d24dee47ef08fa296b6f1328ef28e614e7153166a362245c98fd1e71a01

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.9-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 af2d8016a40b5841fbd30f71a224b64f5a6381422ea99b7cdc4e02b0a04dd78e
MD5 b40b972e915641bf0e4b545d4c102dbd
BLAKE2b-256 e112d112c3b61cd9a970e87fdc438a2c4b1c245a72b3e08e69d6228c2f9d3042

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.2.9-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.9-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 44830258b627e93bb70e6a5a0f28ddb6c7a07da2b7ee47359133862417d40a75
MD5 ad6d49f5f52bc2712cc1db6763667a98
BLAKE2b-256 302eeaedeb925c9d85c64756915a2b1c9776a33c3e827900fd436678bb8bfa55

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.9-cp310-cp310-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 8bd991c8fa224677fbe3b29ddb8b03b02fa5dfd6dab2ee5cf796a486b80a8b32
MD5 ffb47c51084ada1ecdc15368e416d7ea
BLAKE2b-256 c5f6696626d5b50053ff7e5d7ff59b011fc70c0709bf7051af40f465999780c6

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.9-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 aa2f849c67644e493f7e152010e98c2372e1f29a95f993aa653c1b2680c4e434
MD5 e67da709b115e5e4ab22e302bd4e3448
BLAKE2b-256 66536973ff1f65c06eacddcb52e9bccb0df7085895e10676be27c2e752c0cbaf

See more details on using hashes here.

Provenance

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