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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.10Windows x86-64

orbit_cua-0.2.27-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.27-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.27-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: orbit_cua-0.2.27-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.27-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 cbb20298e3d803e85dc241d9b87591e4672b5cb732bc5281cc898eb3ead6c92d
MD5 125338fd9015d1c12d9531d00bb567ce
BLAKE2b-256 fa1f931581104428bce55b61cdcd09ce6c43fcd10b4ca48ae4b6ff8c583f386a

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.27-cp313-cp313-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 0a9ab864e6ac82e65b68fc53124b3752b697bbe7fdaf5eb4c7d97a321dbfe00e
MD5 ed491086766a07dc40207fbe1fb294bd
BLAKE2b-256 02007550d7541bfffa5c75b8852d3cc2c02076bad8ead0cadc73708197565599

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.27-cp313-cp313-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 fad0a6c5749abc237d83e82a9834b82010e5bde829535e508db864408b075279
MD5 7bf205f447bcd51bee066067d0709803
BLAKE2b-256 64954ece1540af00e013ad682176e7aaef4a32ee89a435dbe51f10fc2e518d3d

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.2.27-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.27-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 78ac798e723dd298aa47b66d8e6adbd0f731e34c9f4bae9a023f013ac5b2c523
MD5 ca27da6a632e55602338675ad7572b6c
BLAKE2b-256 1d520b6a5af422d17d4df7572e91d36ecfb01667a3adb155f3525a97df8472e8

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.27-cp312-cp312-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 609a214d39c80a2529ec3edc0dcc9ebfb23f05974ddf65798d3274a243d88812
MD5 a1d7328763d1f312c858fb6dfec3d946
BLAKE2b-256 b972b7f06fdb3abbba01087bc8483d4d4f9ee6666d91db67799201a3ec4ac0f9

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.27-cp312-cp312-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 def79b9648ffe54b9e0e6c2bf8a2aa1210ee83cdaafcf607ad18cc61215df660
MD5 d9af0a9b28860ad6126e68a5dde87f6b
BLAKE2b-256 448be4f7f8e845e1155d30a313100dd8a7ba4ef9edd63d3eb0be4f3ac15ca370

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.2.27-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.27-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 25193312d89e93398ed5a04487a2a0c905450d23aa05f88ee9fa3fa959b277b0
MD5 919746bd5d4c5654651172bfaa73db5e
BLAKE2b-256 6cc21f3fb78df0d00a7977e21a14623c4003bc7dab92a7f53f94fab975be99ff

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.27-cp311-cp311-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 146f46db97abc1628e0253027b0c16864e147d90374b25b37bd49d47bd545b74
MD5 11ff653c4c82d20cd825432e8f95dd93
BLAKE2b-256 d3e5a97fd98aa5ab1ed6861689cb225516ca0dab7365ff8a6f5b6fbdc1d2cacb

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.27-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 fb3b67fddfc4473af2f6ed61bde04ac48165d7abb6f02aff6e2fd81005e19ebd
MD5 755beec212778552dba682d89264d08c
BLAKE2b-256 a474e3c47175d875d50aa4a564e45ea4a13dd3ed0010d65bfbf3ef4f595c0ee0

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.2.27-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.27-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 9886433e8bebb6822c00273943654e749a1a5b0c77b8181117a2d07ea8d3fa29
MD5 50b47b7ab4458b5a2a174b7c2f0c47ea
BLAKE2b-256 18f75d48030db73ee207abe8b2821c14b6b03923bb8f2ff95d3d8ec5c834e173

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.27-cp310-cp310-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 3446ba887c4b0d34247864b91c4c04a22fbbb1a82a547631b5a27fa5c28ddda9
MD5 3e88c7609c79adc256b6f960ddfaeef6
BLAKE2b-256 e8a386ef393a4783a32a0518ecef07107b991d8ea483038d47d12835a13b49e3

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.27-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 74f22c36265019ad9c9045cb05fb8a8f7852da6299d1b4969c5e6a6c76c2b4a0
MD5 eee936ee2f650c7183b77503bdf230d2
BLAKE2b-256 54ac6a9aed589a895d93d640a1fa800c7ad575f47a52cf0c0b8ff64b400b7ce4

See more details on using hashes here.

Provenance

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