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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.10Windows x86-64

orbit_cua-0.2.12-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.12-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.12-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: orbit_cua-0.2.12-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.12-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 ad753b5e733191e192d4298d04cd20c15bea4062cb1dfd47b4a936b7997e8443
MD5 e2b6f8b6bd752f3ec29abc405da4a9b0
BLAKE2b-256 4eb1e7af4a8398d55ed078e6a94f34dd15e40c56852593b15ff17c828dd752fc

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.12-cp313-cp313-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 b5753451f887918831abda9b3ac9547a0b17d33c569e957c9082b353d91311b0
MD5 d207e1d429a88247686f6a6bc35f3603
BLAKE2b-256 598727adba36d2fd2fb77a9a43f5ac72b456afe51688284d0b178ca3ba5c7bc4

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.12-cp313-cp313-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 26839fa234b6efb68a34a0ecfd59758cf1804d4743190269a47973d9cefeb8d2
MD5 906e35c358ddc0c85a1f675bf4e76a50
BLAKE2b-256 7574c8648c318ce3492bd489aa0f48e178deeb17d0ed3559eac6693a8a567a63

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.2.12-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.12-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 23d2a67865a50c8b9595f5c1f538d0e6dd1729398c64e41c911df6d2e5b482fa
MD5 9f77062985a815fd3906a2b5a7b7d379
BLAKE2b-256 8c8f46b740dde94ab39a9988a7891bbf4daa45d66b03208ae0a90a0c74fe737d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.12-cp312-cp312-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 87aa05b23c469eda3c37b9c74c7bf8c629f2625f5d6ab205a3e4bc98dc7ef96c
MD5 39678a34606c24f44a75baa88bf1b3d5
BLAKE2b-256 dbaf619caa506f1915f05cc91bcfacb6ccb1b47ddc0767151d5dfb49825df083

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.12-cp312-cp312-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 dfc0b1012ab500f1384b67006225dcbff561aa2f637bd846b08e37a7b1446e86
MD5 b5c6d0d9a6f0adf7fc893111a8e74396
BLAKE2b-256 c916cc159e02942b050e7ce0f2018f28ec2cbe11c8be577590559ba275f8f63e

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.2.12-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.12-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 b127e45b3188e6f15e232a37b3afa4740c5cb26c92028ca7c60f04892371e734
MD5 afe0a9ad9db6c45bb6fa08bc034c1f5b
BLAKE2b-256 6741f50d69fc7c25ba9542771ac521fab4d951f12add7b29520b3a691c61d5a8

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.12-cp311-cp311-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 b8ab450a6f7d74f5b6031996148f08c26f4bd6bafb49afc03b3fcdef608a70b1
MD5 a960f8ef5e8e778bd9b09a0c7ac48295
BLAKE2b-256 4cdbcccab522b82e606ea6014959b4075f23436cefccc09f7dabb9e43b0f1b65

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.12-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 de7cc888243a2e2542c56364076094b98488ab7b954ad7b147e427caa5706215
MD5 887dcb64a76a4af314e98e2330ab4a4b
BLAKE2b-256 903eed21ee81646638b003e688220cc155627ef65cba00abf398f41b42cda7f0

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.2.12-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.12-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 8f50eed3c78b8be35c325b7abd7081052dd7abe86276dfea6068b17b938b414b
MD5 d7bf9edcc6415e0af9aa42895da9d500
BLAKE2b-256 eb55f6f75c480ea13d761de4678190da01a266f44b571911dd016e8cdf2313c5

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.12-cp310-cp310-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 77d525287f9fc675ed9124627cdb2e0306892bc2f2eb722e7bc12e5d90ce7c51
MD5 2bd113cddb54044026ce9e4e92357b7f
BLAKE2b-256 3bc26a43b12c6ca46896c72b05ddd47d9278d075d6fdc11c96773a229837fef2

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.12-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 f6fd341729076a7ca74409a2d0fe76cfebe4773367b14fea5b963c822236814e
MD5 43c5edde5506c12eb21fd004b89b112f
BLAKE2b-256 2f37ee53b776b7dd00c42d310631804cc243666a196a778edf3ab9a5f1c5f7fd

See more details on using hashes here.

Provenance

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