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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.10Windows x86-64

orbit_cua-0.2.25-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.25-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.25-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: orbit_cua-0.2.25-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.25-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 afd1e55be922592bf4df3bec95373d650b62a432522d4a6dba44775b07ff7598
MD5 8d122aafd2b5eda8616bc65ef8b91e14
BLAKE2b-256 162118cfadff9663e9d18719b7c87571d6c5368c60979df875165be8b30beccc

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.25-cp313-cp313-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 f75f70014c8616c3f44d263c675c6144294b178d094f95fe244d17456c92230c
MD5 c08a5d5a7a3083379f48c87cc717797d
BLAKE2b-256 da995eafcc6cf5e2d4fe23b76ad21eb1e2bfff4fa0fb69793d852a65153c9dd4

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.25-cp313-cp313-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 fe8178cfa0b3d9b8a574b58b7a3cc8d9cc87e6355adc5bc4c2db87eb944e3ead
MD5 02b73b98e49f0e9750825b18857125a2
BLAKE2b-256 60cb355aa6c4a9f697d27812483aece586a0f94902e0ffdd7d93abc7fc1e844b

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.2.25-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.25-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 7e7a40f07f848d932f02a593e4199608a8ef009dcce446a3147fcae7f0fea02a
MD5 94d605eeb4a4fc3f08c57503ba3cd978
BLAKE2b-256 9de179596428d7256103480429402659900ec7bd7d527502e277b36869bcce8d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.25-cp312-cp312-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 565921a00fad9704a470815abb7641d5cfd3c56ed0bb417b516a9f9f645986b4
MD5 be8a520687791800619fbf24eb903763
BLAKE2b-256 0bb5dee0d27fa9adacc66c546845ab68f8673d115492a87db186647865056e59

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.25-cp312-cp312-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 cbd06cfdcb31d2c031dba0e8456673811e90e6259c20ba8759ff70efe7550ec9
MD5 9395c9cc04132ed26f80ccd49a976b0c
BLAKE2b-256 58d9ad1d7407c892a061cf6e0b2dfe167af014bbff8225c76c39b034845ab3ca

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.2.25-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.25-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 4168eef381f16c37de3f668f05feac6b2aa1464b9d517c4b588ba291bbea8088
MD5 bcf1839c29324a55c53144f74a6afe1c
BLAKE2b-256 9fde8458056175d64b53f2f3801c83176d47d0fe37a9f5437314a1dd3866dba4

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.25-cp311-cp311-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 b9bcfbb07a5be03cd7fc2c0fe3e474f211376fb86a7dd32755e81b3c074b789a
MD5 c2111f77009111ec4cff27b8b30be88c
BLAKE2b-256 8791b47168599951306d0b252c3d246b79a79da2972f2efe89d8dce99836ffe9

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.25-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 624aa9438046f39d79da69a7fcc4b8418c19bbf91a1c0cbb007e970ada44c912
MD5 5bf31655a4cfb9eed708e851dc60e7a5
BLAKE2b-256 8879dcf7d4ce6105e406e6ceedb207322a8e503614eec069164e16647a4c2913

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.2.25-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.25-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 0088840e0f0bc89741c829154e4dcb8afa569302fe3f7c62275bf7f509b5e49f
MD5 a8dd89c613f3f2a63a79c34346b22649
BLAKE2b-256 159e12413a4b0d4827b6802fec75ebb99e82ff9f029f21f5c877aeda5a0cd311

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.25-cp310-cp310-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 82d56e6b1ddfa04cad317cdb00862ea4bfe9dc129666f7041a0e2238f572e9af
MD5 2a374a1a0e5802951aaf141786c5bb59
BLAKE2b-256 d5ebd0d1ac49d4e6bed9042a0716a0786341f72128799e6705617b1d65738a92

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.25-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 eba85b7cff2d62f40c710755b33588d40a13651d477deb072a008a457d455e34
MD5 954738a2ff871bb5353800bc830b5526
BLAKE2b-256 7108cc2791e5ff50065bbfd840baf674b57b437aebe521700887bca11a5487a7

See more details on using hashes here.

Provenance

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