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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.10Windows x86-64

orbit_cua-0.2.18-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.18-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.18-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: orbit_cua-0.2.18-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.18-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 7537042410d2ae5f83947a745c8534bae5aa19adedcd65fa4845a72ffe7219d3
MD5 96d2dc83a38e01ebf1624b8a319229cb
BLAKE2b-256 bb1fb180af286e7988a23f73d865858467f8deef2754f8cd8d6fde5844387fe5

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.18-cp313-cp313-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 6a309dbea839857ad9c3348f49fc9479d3bcc8942bb09a8e1ab4d7701db6099d
MD5 fea6d9e9838ac58266e23dcbbc37d358
BLAKE2b-256 d4b727fd9e8aac475e443eb8fe981a17231410475b0a058103f3ac771414960c

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.18-cp313-cp313-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 f540b954959e75842c7160125863fd5bb37fe2798f1c57e3cf324168bd9173bd
MD5 6cdc5a28d3af3d5a54898b79a44f9737
BLAKE2b-256 4e8c16f1f93282bf94457cba492e1ebf4041662e37d5d06c98a827be514d77ba

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.2.18-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.18-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 e1d09d0677a40c8233e143345b8c21f047b131cfa0ab958920aaa52b6e903a3a
MD5 a0407772d55f7735f6cf659bfec34eea
BLAKE2b-256 2522da52acc67275aba8b3ca7a68f714addf5226c0a43c0c170f42be413dce04

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.18-cp312-cp312-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 37ac85596e04d8c5cb6323a52219c0a240fa908a891479eb7d9cd0710af57bcf
MD5 97039b3b963312e2f580e01859478455
BLAKE2b-256 d985cc9df82f3add9c7f2d04cc7bffee3d141ae8fc687a02ecdf304795f0a935

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.18-cp312-cp312-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 5fb642b8afbdd02b9328cc5db2c17f714d290d46c8979b05ff5b46ff5ad98cf5
MD5 dd3520bfd5da835690a2158313c22847
BLAKE2b-256 6cc9101334f538b056d0b7014b5d43080d09b05f744b868fa5c34d66a6c72ed9

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.2.18-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.18-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 6bdabc4c2a383d9454e4a32ad52b6a80075f02408ee3d17cd90908d24a0c9db7
MD5 c21b27fb4b3c9eddc3be8b4401db318e
BLAKE2b-256 e35c8c40973ffa636c132898adc630f855593e448d925f2ae827a58ede2c4a68

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.18-cp311-cp311-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 94faccbea28e6dbed2eb431a1d508a1678933c85533783d3433970ba9b91379f
MD5 eafc779d22d9e68d8549634ad3d3b5e7
BLAKE2b-256 afc1b869d3f399d11f8ca3ee334af3320cc246969f667211bfa058c798784b59

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.18-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 620218be099fa8729fee094bd6fd36ee9deec619c40239a999ac9b62a95ec8b1
MD5 3b328a6f26ad78545105502c58c0151f
BLAKE2b-256 48609729d2c02375b644e0e3e07542e086d0a79d1448a5122c09e1bcf07e015c

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.2.18-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.18-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 218f9b11bbd898a18b8649f802f9b735d27b545dc134eba9076b4217cc2079a3
MD5 65983dab7d59186b5e053e516f0a2cb9
BLAKE2b-256 9f5dc7aeea2824ead1a62fd0129bbb0f471f0548c56899574c3d1aee9953790f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.18-cp310-cp310-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 eac284ac032a7eade7c4e958966d9a6077aa9c7ec70d8f45b6094cad5d40ec17
MD5 b95d6a1919f9cc6b06624f0dff3a0734
BLAKE2b-256 ab7bf42a37cfd16ece69f76884ddcb775cd79eb2f60883c94232cc35142688d5

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.18-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 b9bb6850c3974bb1bba4e5115fc399ec68d891b2e6de2ad2b0acb233f429d9e9
MD5 de181842f2e01fc50b777e763b899bd7
BLAKE2b-256 e057e6630371a3b1abd6b9e7f602596236b8bf2a344be3979f133fbe4b7543f4

See more details on using hashes here.

Provenance

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