Skip to main content

General computer-use agent.

Project description

Orbit is a composable toolkit for building Computer Use Agents (CUAs) focused on providing structure and control. It provides both a standalone multi-step agent and a composable SDK.

Most CUA frameworks either automate the complete task as a black box or expose raw tools with no structure. Orbit sits in between , natural language controls the screen, Python controls the flow. Each primitive (Do, Read, Check, Navigate, Fill) is an independent agent with its own budget, model, and typed output, but they share context within a session. This means you can use a lightweight model for simple clicks and a heavier model for complex tasks, control max LLM calls per step, and extract structured data from the screen into Pydantic models. Also, if you realise the agent is struggling at a particular step, you can pass in some extra guidance through the extra_info kwarg, this lets you control the stepwise information flow. We also let you use planner=False for lower-latency direct execution on simple steps, or keep the default planner=True for decomposing on complex tasks to multiple simpler tasks. Orbit uses the OS accessibility tree instead of screenshots or DOM parsing, which means a bit less token usage and direct access to UI elements across both desktop apps and browsers.

Composable SDK

For more controlled workflows, use verbs with a shared session in a pythonic way:

from orbit import Do, Read, Check, Navigate, Fill, session
from pydantic import BaseModel
import asyncio
from dotenv import load_dotenv

load_dotenv()

class Product(BaseModel):
    name: str
    price: float
    in_stock: bool

class ProductList(BaseModel):
    products: list[Product]

async def main():
    # Use lighter model(s) or stronger model(s).
    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,
            verbose=True,
            planner=False,
        ).check():
            await Do(
                "First click on the `Continue Shopping` button, then solve the Captcha using the Screenshot tool.",
                session=s,
                llm=action_model,
                max_steps=30,
                verbose=True,
                planner=False,
            ).run()

        products = await Read(
            "All the search results",
            schema=ProductList,
            session=s,
            llm=action_model,
            max_steps=30,
            verbose=True,
        ).run()

        if products.status != "success" or products.output is None:
            raise RuntimeError(f"Read failed: status={products.status} summary={products.summary!r}")

        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,
            verbose=True,
        ).run()

        if await Check(
            "Add to Cart button is visible",
            session=s,
            llm=action_model,
            max_steps=30,
            planner=False,
            verbose=True,
        ).check():
            await Do(
                "click Add to Cart",
                session=s,
                llm=action_model,
                max_steps=30,
                verbose=True,
            ).run()

asyncio.run(main())

Standalone Agent

For one-shot tasks, just describe what you want:

from orbit import Agent
import asyncio

async def main():
    result = await Agent(
        task="Open Chrome and navigate to Wikipedia",
        llm="gemini-3-pro-preview",
        planner=False,  
        verbose=True,
    ).run()
    print(result.status, result.summary)

asyncio.run(main())

Implementing Custom Verb

You can create reusable domain-specific actions by subclassing BaseActionAgent and defining both the task prompt and output schema.

from orbit import BaseActionAgent, Navigate, session
from pydantic import BaseModel
import asyncio


class Product(BaseModel):
    name: str
    price: float
    in_stock: bool


class ProductList(BaseModel):
    products: list[Product]


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"OBSERVE: Read top products for category '{self.category}' from the current page.\n"
            "Extract product 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,
            planner=False,
            extra_info="Only include visible, on-page product cards.",
        ).run()

        print(result.status)
        if result.output:
            print(result.output.products[:3])

asyncio.run(main())

Installation

Install from PyPI:

pip install orbit-cua

Install from Source:

git clone --recurse-submodules https://github.com/aadya940/orbit.git
cd orbit

# Build the OculOS daemon (requires Rust)
cd oculos && cargo build --release && cd ..
mkdir -p orbit/_bin
# Windows:
copy oculos\target\release\oculos.exe orbit\_bin\oculos.exe
# Linux/macOS:
# cp oculos/target/release/oculos orbit/_bin/oculos

pip install .

macOS users might need to grant additional permissions for UI Interaction as defined here.

Set your API key for whichever provider you use. Orbit supports any model via LiteLLM:

# Gemini
export GEMINI_API_KEY="your-key"

# OpenAI
export OPENAI_API_KEY="your-key"

# Anthropic
export ANTHROPIC_API_KEY="your-key"

Safety

Orbit never permanently deletes files , destructive operations go to Trash/Recycle Bin. Disk writes require human approval via a configurable callback.

License

Apache License 2.0

Special Thanks to

OculOS and other open-source packages used ...

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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.10Windows x86-64

orbit_cua-0.1.1-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.1.1-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.1.1-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: orbit_cua-0.1.1-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.7

File hashes

Hashes for orbit_cua-0.1.1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 bd35ea98698aa88cbc43d188cb85e3e3cc00c36bd235323cb9bf5c488e9c5b67
MD5 ca3729bddbe874f50e3e5e8e709dc355
BLAKE2b-256 637d371974831ac1ff8784935c9a8a2897804c2de2104abf62c32083f875514f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.1.1-cp313-cp313-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 02108e4de9b8fb23c86408ee6720ba5be1ecf20ad948e68a1de085b2efabf4ac
MD5 1665a7c45fe1008633970bb881fb04ab
BLAKE2b-256 5d093922530f3b804e5933ebbc4cd71edb9c8c89daefae402a65c07e611f0e51

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.1.1-cp313-cp313-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 cd0279458a4602afc8ce255617b16064da66b62b028bd53948858c000bcbb625
MD5 becefa6f727cde413c8846cb4b94f3e1
BLAKE2b-256 bcb6ce40cb3b3de46a6c3bee6d9135af920b0f7a3465491c2bcd44a9f4635957

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.1.1-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.7

File hashes

Hashes for orbit_cua-0.1.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 4096b963c0f2c651ce7a1abd7d726293c472e1a845319ab8414bad89496b2e01
MD5 68523e63b64416e185d56e6c5bdcd19e
BLAKE2b-256 1d7694773c2a81d4db7abe29f15a3b15bd659db21fdf4fdb1b8f75879bebe5c7

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.1.1-cp312-cp312-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 c10b57d12779261d0920898619e0315d300cbdf2cd475deb48adb4ff18e59f2a
MD5 1a5e228676db6cb8ea0a23cfbfb42324
BLAKE2b-256 5dfc7017f34e251bd11eb6505b1ae464c53702ab29373f7e0e904974db4ccf3f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.1.1-cp312-cp312-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 f173d95975076bc79375e5f89e6d06dbbf52ef8d9d5bdfb3321b5ad7fe7f60a3
MD5 6599b650e670dc2f9723ad114c76d3ff
BLAKE2b-256 ee772942fc389cead0a99d862e69345849fb362b5ee1bc922e9ffa815a7c687b

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.1.1-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.7

File hashes

Hashes for orbit_cua-0.1.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 2ffc6443f1c6267943bd2d57fe89dcf6ef4da64526c673561c3ddab4650dbe59
MD5 f405f1921cac5f2a9a78648f21afd9f6
BLAKE2b-256 201846971a0b6cad14ee318a80418c3d6f80eebdd452e4fd6303ed2fdaebf2e1

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.1.1-cp311-cp311-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 6831cd808535222c7d1187f3412abaf74d5a9abcda65a9cad7524595c20eef69
MD5 ece76272cfbeb23ea52f690d676887a3
BLAKE2b-256 1ccb7d8f226e515af7755aaac095f38f5ecd5a30bdcc2547db007e979fd3e06e

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.1.1-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 9ac29d0cf1befa78691794f0dbffa64592d12608c98cef84db8a4312d0422636
MD5 90ef877590a07b5cdd8298716ccb4439
BLAKE2b-256 bbfdf4d0b61e348d3d381417c78413e30ad4d413cce589d515159ad813fd1c74

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.1.1-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.7

File hashes

Hashes for orbit_cua-0.1.1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 2e439a38c085af173afcf15dcae474dd0b37c20d64b895e10e2489c0ef61bd72
MD5 d0f448d2b57ac2bf9c7de061a7de9554
BLAKE2b-256 58f01a692b5cb7eeccb529b8b39273ccfd0608db8a498ca0921aa2af46637238

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.1.1-cp310-cp310-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 e0b8db2c51eef0f12f5deeedacab09b168e5076571d754d060aa43cbb884812c
MD5 28140d53c2fa3964b1a60e1d080e6bd9
BLAKE2b-256 7e48d208d0fb2804cb926465140917eb93d0e5daa0884634614c18a18275173a

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.1.1-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 51fbc4dcb84705436b30dc5de218cb90fab3c7bbdbf6f32dd33f5018590f560c
MD5 93e61f18a90c93b8eb9445957f31a3e6
BLAKE2b-256 853266f9bd0a6578bcf7f4afc5290d8367fd6ddb818e4ae92dabe873287c4ddb

See more details on using hashes here.

Provenance

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