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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.10Windows x86-64

orbit_cua-0.2.6-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.6-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.6-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: orbit_cua-0.2.6-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.6-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 6242c03284bcd33a353ead31bce427b110544c13db3e751bb78f2caa8a5e1841
MD5 bc356dad696cececf0805098190358de
BLAKE2b-256 1eb310a2955754be11b0d9cf31fdd36fe8e9f4c4912f7bfa108978a7da94cde3

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.6-cp313-cp313-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 0f9195116044069cda063974b02b6f4d1cbcc366a1eab2d53420d5594327020a
MD5 05ca01fda6667317d92dedfb9656a1c9
BLAKE2b-256 045398d179cd264e5fe69682d454d8fddf390f242e368168168ec6bbd18be619

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.6-cp313-cp313-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 a3f6a186b0e893480cc3e519cf7b09ab2f5c5ed2d9e304fdb9b99ade826c1e88
MD5 42033413c0b84a55c159459f357a4696
BLAKE2b-256 8c0a5e5e97422ebec2087bd7501b60747834059d5e19740c343ef2ffab0e9e2e

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.2.6-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.6-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 d5df902d42c4458cd3cff164aa2c8501bc8730e32c09015597a8331d577a10a3
MD5 e7e8df572466a94b452e9fa55891c0f6
BLAKE2b-256 731fab91b0f2cfeaa9ceab51a37f496fcfd4c4bfd985759198660ce0ab1e81dc

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.6-cp312-cp312-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 9f6f44486e9686c0997ee740cd35cb7081b9c5f66652e94b5ed909d98a916db8
MD5 e44912ba77e1f8d896fb50b91d14427b
BLAKE2b-256 10513f083efeae096bfb5c366b02f9377dbc7ec36bbcaf39a57ae90a782aa963

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.6-cp312-cp312-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 8312463721d4fd76e0bb18dc9fed942bcc7f3a0eec45d182e9b8f97fd6415808
MD5 5cbfcacf3ef974264a72ac05d49f0162
BLAKE2b-256 810881804318a2ef03f0b8749b986b6fa9114a5308579c8964cc0d7a07e5ec4c

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.2.6-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.6-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 9fcfded1a0df6e239678fd5f00420c6bc63a49ecac17787010d61e61d2872090
MD5 91c7df1671bc4481e676e8f8be670da4
BLAKE2b-256 14c9d986cac49e2844491b32b41477e9acd3a29bf5b5f3caa5c11748d0dc7159

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.6-cp311-cp311-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 24eecaa6a0914ec8d9e089db32eac2f97b7356455ba79bb1030d8d2ed3a90f14
MD5 5f2a638f09d5f40e6a776b408373700c
BLAKE2b-256 90771a8b1e5369dc9be272c92d699b1b8a2f4df5e4dae9b54abbe68a2a0b1732

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.6-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 b743d6f7156378184a5fd8e6235e1a95dff26b857d645891833113f00276a03e
MD5 d15ac4796a66b68f1bd7ce3a8c5cc67b
BLAKE2b-256 c98aaad6a9c5c997c65e5c6862d3645bf63b9eac652b6bf7b94a79a613919ce6

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.2.6-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.6-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 9d1ce76d5ef173c70d9fcfe2bf1b81e4fc71117d8f5802073d8858b2a2119fcd
MD5 c101d0be39882bbe2851dcac20600531
BLAKE2b-256 ae5fa621e5aa85ce2d94c5ee25f79d2508bcfe4f0f3e5d74b45f6cf9715ca8bc

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.6-cp310-cp310-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 6c51adc4120e9b75bde090f2ba9881ca96c6138628cd1de655c0a7f2c4ea6fb0
MD5 6421c28f529e881dcb87dd24970627af
BLAKE2b-256 c3a2f65ec5ef0fb0f943c47db9ad289e95637a8a1fb56d565e2ef007d6367ff9

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.6-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 1c901663eaa4c6d8d32069090badabf37a87513b39d0943f9aba7d9bce0067ce
MD5 f12dd050c3da504a16dd7856f319737b
BLAKE2b-256 5c58a9725e1cd91e0847946fdca70105739428c421d4129e0357069468aa6e2f

See more details on using hashes here.

Provenance

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