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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.10Windows x86-64

orbit_cua-0.2.20-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.20-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.20-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: orbit_cua-0.2.20-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.20-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 bafec7d8d782fedca3752337677d4748ec52c9b4c77d64d15ff9411299e7a5b0
MD5 a9457114678de649bacb3452688d5b37
BLAKE2b-256 b32b2ec559d18537ea43f468d7e349d2aa4cd0f29394e99eaab5d2f7069c6bd3

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.20-cp313-cp313-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 7c25b1cbb9b98c175b7b6ec2ea1e5f06f15402f6c3fd43460fffd03ea0cc1af6
MD5 d4cc0b4a7d47070278537b2e5d2d12c1
BLAKE2b-256 b86fc3645f673527de2a76c34d8ad6d5010af98f580385951a10e329713f759c

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.20-cp313-cp313-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 c9b2652bc0c4c55500dbbca1ff49753c225f842d8285ee55e0669c3ee8085391
MD5 8ac037455b327f6f81918c2f2724ae7d
BLAKE2b-256 06648e896f3cdf22a2cfd094d818f6d9eccea56e6b19e0887ef7431af215917f

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.2.20-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.20-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 f63da5a2bbe29ef6f14aa67b0c28d14308cb5a32fc6986af4fc7a7668be2d0a6
MD5 8cc5b6222b19a18da17df403eb5ad6b5
BLAKE2b-256 534a05dc9fb054ec7ee0ed04d9cd1e347a3bce4d57aee12fac50d1a5c6472d70

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.20-cp312-cp312-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 62ddfd1700f97e0a9bacc0d43ac133bd252babca7810625fe24c012691ee9bbe
MD5 fda856d4f6787bd69fb8b974a8001eef
BLAKE2b-256 397dee035185e25996ed0b860f4a156f1b90aa4efe296f30f3f32bce3352ee1f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.20-cp312-cp312-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 c3dd99557abe230a6dc4765d1345756f57406589a7aef9afe2441e37f2e794fb
MD5 ebc69b044943bd4eddb314ca49179431
BLAKE2b-256 a22482a58001198b1b3c4ed8f146896a1a4d4fdd9e7099eb1d43f444dc07f8a1

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.2.20-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.20-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 ee1bb82f5d73e5e68d92b9c9e153b5f45ede5be4fc3d6a87862274c02fbbf1ac
MD5 b2edb02c8f82b4490447fa005b5476d1
BLAKE2b-256 e4881f6235c789b7932f68ae53f74956ad925bb111f8cf455a8f9d3d523cabf7

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.20-cp311-cp311-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 5d1b73a87e7ed7755f88c258e0967addf11278b01bfd83f32152ef85035ccf11
MD5 095477407a7677a9a8829c7b6d91b335
BLAKE2b-256 43bc21eb1bfa59745b498602efb697d3ad48800078430eae2f2c2b432f8d757f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.20-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 7c40545b981bff0da7d27a8dcd442c808b3a565e2e9071dae7fc9621272a0a60
MD5 06dc7d76a39bc64be6ca3d9bcab8fb86
BLAKE2b-256 277de743a839831d17c5096b22b51f70cf1a06c8f6752327d565962819fab236

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.2.20-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.20-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 6a00b7d27cd4164bb1e248c70baa6df22b3414d32e170241b9a804476ff540e3
MD5 b1f75113976482ccb6113902ab2911d0
BLAKE2b-256 86fe67dea3605b5d96f1c41988f55c092c51af43b85820e23c9ec5a56ccedd5f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.20-cp310-cp310-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 16c0ff95050b6007dd12f092ddb185585e943dfe92e98330828497abbc19f2ca
MD5 56c56c8f89250a4d413406c75ee8bc18
BLAKE2b-256 b10c820a92f16d169481e623d4ba17408cafff602521f438edceaa744783617e

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.20-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 ea5dce0a82bf2e3df0aef74bf64b5e428a1c25476f80873eab454114893668ed
MD5 2cc016d8dcb23636928e92da246bf4b7
BLAKE2b-256 e637377cdfb521976d2ab8658b5171884dda3f7f46c1ecdff5b2c9b5a586449e

See more details on using hashes here.

Provenance

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