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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.10Windows x86-64

orbit_cua-0.2.47-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.47-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.47-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: orbit_cua-0.2.47-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.47-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 77fb1757a299dc821a56ebb91cd81bbf123581befb52594c1d567f86cabab475
MD5 a1508d7db1247890e223c8c85c84ff6d
BLAKE2b-256 7f23131640f4828852a533534f652d6aeb329a14092408489f0bc4d77ff2c01b

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.47-cp313-cp313-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 6281e597100935cca7c5e87dbe0cfd436813e41e3de14b7e0c737d54a678603d
MD5 ee75af79a7d889c363fe4aecdec595a1
BLAKE2b-256 571f8b71d756f04e6968585e9373ac2273e3039471f70c790c5bbc0fbd654042

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.47-cp313-cp313-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 eb67127a0d0dada78b0e18135efe4768983cacdd3848351f710860d75a651855
MD5 d6557c28edb25b916b5d0578266f1798
BLAKE2b-256 f394e1d01d55172b09d760c2eda923b3ae6d8c94c4b58ccc2deab90745ed8bc8

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.2.47-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.47-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 742e7f935490e7a95ab929fdecef3d49f59930493162a237ae2984680e08ac67
MD5 c5162aeb6272afd88b3bc0b907d6d8b7
BLAKE2b-256 e2b31e81bf5c7c41c76a4ab4208723bc5360f3e610bc37687053deadbd5611fb

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.47-cp312-cp312-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 5af607fc7028217aac1e5ec3fa986d02a6dab267ebfb2025e02bed06b94c2ca8
MD5 72398e3a689b06bd8b21115280dfb071
BLAKE2b-256 b052cb974caf40a9dfc55293635c1af2ec6e9216bfe3c8b68ff015b4330595fd

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.47-cp312-cp312-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 8c1b5ee9d68969d4ff1d263b035ae55506c52e2fe5c1649c007dd0c355ddc7ee
MD5 b1b55be9e1d91850fc9a27734e0d62f8
BLAKE2b-256 9b213ecdf78ce6382fafbf4f595a46869e27a4dae4bfb761418849f582245e31

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.2.47-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.47-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 a3b417e4ad905f3b2d244454863c1b5de55c754006107dde1a06fe97fb32fcfa
MD5 ebb23e34e82eda9faa0fd27c67c34448
BLAKE2b-256 80e3f7d3276655d3e89ccb63a8017e3803e71f022516599a34b06648ddf1ed7a

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.47-cp311-cp311-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 40f7325af655efc10080945fdb48249dc0e33546ee04505f1b40c705dfd83dff
MD5 96fef2dfca179489b7dd69007b178bf7
BLAKE2b-256 db292c2d3116a8b12f9519141f0b611b6dfa88518ede62b061b741602d7b6ff0

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.47-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 4fce4ec1398a8bfc56a86df749a16ceff86424b4303495d3344fe3727843ff2b
MD5 178ac00c51faa5509727c136da1bd7cf
BLAKE2b-256 c26b74f4b1550610b50c0d4c533f93d3ad4ad4f82f556bafb8efd4f1e597a8d1

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.2.47-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.47-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 9fa1d6579bbec7fb45cbfba37f374b7518f7268d525749117fb936b1366e3093
MD5 870b8b1d58b29a21783a4ecb4cd3f60e
BLAKE2b-256 9807a61b18d82cb8c5735c632dc7f860a465d42f47f2f058c6190f8beea75b6a

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.47-cp310-cp310-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 3b3840da80cb0e1ac4a112a745b60d5571c19cb9b8d8bd8941c4555fe4cd1b7e
MD5 7c256d30c596688c0069d3f630fa545e
BLAKE2b-256 64e1e75ce689fbd44127c146755eef96ff82d709265cd3046a4558fcc2092fdc

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.47-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 73b3903a5564f701e305f700122885c3c40e0691be8c5a00395ad7008cac7c1e
MD5 36707d16a5a4df03c16869ea40c2e57e
BLAKE2b-256 c4d11f7dc85e8e2bbb6d65d27710b21539ca93f3462dbc7a9f3f473b252a299f

See more details on using hashes here.

Provenance

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