aether-browser
Client and CLI for Agent Browser by Aether AI — self-hosted Chrome for AI agents. Drive one browser session through a closed HTTP API, and watch or take over that exact same session through noVNC.
pip install aether-browser
Zero runtime dependencies. Ships type hints (py.typed). Python 3.10+.
This is the Python sibling of the aether-browser npm package:
same name, same commands, same closed v1 contract, released version for version.
Drive a session
The session context manager always attempts to end the session, including when the body raises,
so a crash cannot leave the single session slot occupied.
import os
from aether_browser import AgentBrowser, session
browser = AgentBrowser(
base_url="http://127.0.0.1:8092",
controller_token=os.environ["AGENT_BROWSER_CONTROLLER_TOKEN"],
)
with session(browser) as live:
print("watch it live at", live.view_url)
page = live.navigate("https://example.com")
print(page["title"], page["readable_text"][:200])
live.click(selector="#login")
live.type("ada", selector="#user")
live.press("Enter")
shot = live.snapshot()
print(f"{shot['vision_steps_remaining']} vision steps left")
Connection settings fall back to AGENT_BROWSER_URL, AGENT_BROWSER_CONTROLLER_TOKEN, and
AGENT_BROWSER_OBSERVER_TOKEN, so AgentBrowser() works with no arguments in a configured
environment.
Two roles, kept separate
The server splits authority, and this client keeps that split visible in your code. The observer token covers health and snapshot; the controller token is required to create, navigate, interact, and end. Give a read-only caller only the observer token:
read_only = AgentBrowser(observer_token=os.environ["AGENT_BROWSER_OBSERVER_TOKEN"])
read_only.health()
Errors
Failures raise AgentBrowserError carrying the server's stable code:
from aether_browser import AgentBrowserError
try:
browser.create_session()
except AgentBrowserError as error:
if error.is_capacity_reached:
print(f"busy; retry in {error.retry_after_seconds}s")
Codes are AUTH_REQUIRED, AUTH_FORBIDDEN, SESSION_CAPACITY_REACHED, SESSION_NOT_FOUND,
SESSION_EXPIRED, VISION_BUDGET_EXHAUSTED, INVALID_URL, DESTINATION_BLOCKED,
INVALID_INTERACTION, BROWSER_NOT_READY, and INTERNAL_ERROR. A transport failure raises the
same class with code left None, so a refused connection is never mistaken for a refusal by the
server.
CLI
aether-browser doctor # check Docker, platform, and server health; say what is wrong
aether-browser up # build and start the runtime
aether-browser status # print the health document
aether-browser open # open the live noVNC view
aether-browser down # stop and clean up
Run doctor first. It checks the things that actually break a first run and tells you which one
failed, instead of leaving you to read a build log.
What up really does, and its limits
Agent Browser publishes no Chrome-containing image — distribution is source-only. So up builds
the image locally from source, and the first build takes several minutes because it installs a
hash-locked Python environment and the current Google Chrome Stable package. It uses the checkout
you are standing in if there is one, and otherwise downloads the matching tagged source tarball from
the official repository over HTTPS into your cache directory.
up requires Linux with Docker Compose v2. The documented quickstart uses Docker host
networking so both the API and the noVNC listeners stay bound to numeric loopback; Docker Desktop on
macOS and Windows is outside that contract, and doctor will tell you so rather than half-working.
The library has no such limit. It is plain HTTP over urllib and runs anywhere Python does —
point it at a server on a Linux host and drive it from macOS, Windows, or CI.
Security
The v0.x noVNC surface is unauthenticated and intended for numeric loopback on a machine you control. Treat every process and user that can reach that loopback interface as trusted with the live browser view. Do not expose it through a tunnel, reverse proxy, or container bridge. See the security model.
The API is deliberately closed: click, type, scroll, and press are the only interactions,
and there is no arbitrary JavaScript, CDP, upload, clipboard, download, extension, shell,
filesystem, credential, or cookie field. This client cannot widen that surface, because the server
rejects unknown fields.
Status
0.2.0 tracks Agent Browser v0.2.0 and its api_version: "v1" contract, and is released
version for version with the npm client. Issues and design discussion are welcome on
the repository.
Apache-2.0 · Aether AI
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file aether_browser-0.2.0.tar.gz.
File metadata
- Download URL: aether_browser-0.2.0.tar.gz
- Upload date:
- Size: 25.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
71653f2e6408cb1f112b12c1f40baa112d73d023feebb136d90fdfd399dbb8fa
|
|
| MD5 |
d3634bbfa87d6f4bf049d365f43b3c66
|
|
| BLAKE2b-256 |
24ce27e4e8d1242af2a78da5502c64fafe3253a00b45178ec7fbdb8f0f80fc4e
|
Provenance
The following attestation bundles were made for aether_browser-0.2.0.tar.gz:
Publisher:
pypi-publish.yml on AetherAI3/agent-browser
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
aether_browser-0.2.0.tar.gz -
Subject digest:
71653f2e6408cb1f112b12c1f40baa112d73d023feebb136d90fdfd399dbb8fa - Sigstore transparency entry: 2704008514
- Sigstore integration time:
-
Permalink:
AetherAI3/agent-browser@05737027e0f7bbe2d352c8b3e93dbd0fa369235e -
Branch / Tag:
refs/heads/main - Owner: https://github.com/AetherAI3
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi-publish.yml@05737027e0f7bbe2d352c8b3e93dbd0fa369235e -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file aether_browser-0.2.0-py3-none-any.whl.
File metadata
- Download URL: aether_browser-0.2.0-py3-none-any.whl
- Upload date:
- Size: 22.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7c15f222b32fe5e28504462ae3e05edceabe682a916f0f0a8b095d4e0f074530
|
|
| MD5 |
39b961ea724e782a5a221fd0dddd175b
|
|
| BLAKE2b-256 |
22f021fdd031faaa7a2054586ce4cd5a2c450581f1e7abbc018c9af29a32c984
|
Provenance
The following attestation bundles were made for aether_browser-0.2.0-py3-none-any.whl:
Publisher:
pypi-publish.yml on AetherAI3/agent-browser
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
aether_browser-0.2.0-py3-none-any.whl -
Subject digest:
7c15f222b32fe5e28504462ae3e05edceabe682a916f0f0a8b095d4e0f074530 - Sigstore transparency entry: 2704008531
- Sigstore integration time:
-
Permalink:
AetherAI3/agent-browser@05737027e0f7bbe2d352c8b3e93dbd0fa369235e -
Branch / Tag:
refs/heads/main - Owner: https://github.com/AetherAI3
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi-publish.yml@05737027e0f7bbe2d352c8b3e93dbd0fa369235e -
Trigger Event:
workflow_dispatch
-
Statement type: