Skip to main content
Control browser automation for AI agents directly from the CLI. Launch Chrome, navigate pages, take screenshots, run browser agents, and more.
This command group ships in the praisonai-browser package. Running it inside praisonai triggers auto-install via the ensure_praisonai_browser() bootstrap helper. You can also invoke the standalone entry point directly with praisonai-browser ….

Standalone Entry Point

The praisonai-browser console script mirrors every praisonai browser subcommand.
Inside the full wrapper the same commands work unchanged:

Commands


Doctor

Check browser health and configuration:

Doctor Extension

Check whether the Chrome extension is working. This command reports two independent signals — the bridge connection is ground truth, the CDP check is optional.
Two signals:
  1. Bridge connection (ground truth) — queries http://localhost:<server-port>/health and reads the extension_connections count. ✅ Extension connected to bridge (N connection(s)) means the extension is working, regardless of which Chrome profile it runs in.
  2. CDP :9222 (optional) — a service-worker check on the debug port. Shown as ℹ️ Extension not in CDP Chrome on port 9222 (normal for daily 'Work' Chrome). — this is info only and is not a failure on its own.
Exit codes: doctor extension exits 0 when the bridge shows at least one extension connection (regardless of the CDP result), and exits 1 only when the bridge shows zero extension connections.
extension_connections counts only clients whose WebSocket Origin starts with chrome-extension://. Servers older than PraisonAI #3115 don’t return this field; the CLI falls back to the total connections count in that case (slightly noisier, but still works).
Run praisonai browser doctor server before a session to confirm the bridge is up — this avoids the bridge-unreachable message on run.

Launch

Launch Chrome with the PraisonAI extension:
With a goal to execute:

Manual Load Fallback

Auto-load can fail silently on Chrome 137+ / Windows, which now blocks automated --load-extension. When the extension doesn’t connect, launch prints a manual “Load unpacked” recovery flow. The instructions differ by flag:
  • Default — the bridge is running, so it points you to curl http://127.0.0.1:<server-port>/health (expect extension_connections >= 1).
  • --no-server — no bridge was started, so it tells you to run praisonai browser start first, then verify with praisonai browser doctor extension.
With --no-server there is no bridge listening on port 8765, so a /health check will fail until you start the server. Start it first, then load the extension into your daily “Work” Chrome.

Run

Run a browser agent with a specific goal:
run fails fast: it checks the bridge, honours typed exit codes, and aborts a stalled session in 30 seconds instead of hanging silently.

Pre-flight check

run hits GET http://127.0.0.1:8765/health with a 3-second timeout before opening the WebSocket, so a missing bridge or extension fails in seconds instead of hanging on the full --timeout. Three failures land here: The “no extension” message lists four recovery steps: open Chrome with the PraisonAI extension and side panel, verify with curl http://127.0.0.1:8765/health (expect extension_connections >= 1), use the side panel or the CLI (not both), and — as a tip — use --engine cdp for extension-free automation.

Exit codes

run returns a stable exit code you can script against in CI, cron, or make targets. These codes apply to both normal and --debug runs, so 2 always means “fix the environment” and 1 always means “the prompt or page didn’t work out.”

First-step watchdog

When the server can’t confirm the task reached an extension, run aborts after 30 seconds if no automation step has appeared:
This maps to exit code 2. The watchdog applies only when delivery is unconfirmed — a confirmed run honours --timeout fully, so a slow first step from a cold browser or slow initial model call is legitimate. Steps that arrive right at the deadline are shown before the watchdog fires.

Verbose delivery indicator

Add -v to see whether the task reached an extension once the session starts:
If the server reports delivery as False, run fails fast with Extension automation did not start. (exit 2) instead of polling an empty session until timeout.

Common failures

The bridge server is not running. Start it in a separate terminal, then verify:
The failing layer is the local bridge server on port 8765, not the site named in --url. This message replaces the raw WinError 1225 (Windows), errno 111 (Linux), and errno 61 (macOS) connection-refused errors, so those still land here when searched.
The bridge is up but no extension is attached. Open Chrome with the PraisonAI extension and side panel, then confirm the count:
For extension-free automation, use --engine cdp instead.
The side panel agent and the CLI can’t drive the same extension at once. run surfaces server errors with a friendly message and exits 2:
Stop the side panel run, then retry from the CLI. You can confirm the bridge is idle with:

Two ways to start a session

praisonai browser run isn’t the only entry point — you can also start automation from the side panel inside Chrome. Only one at a time can drive the extension. The side panel opens its own extension-origin WebSocket to the bridge and sends start_session on it. The bridge treats that connection as the extension itself (rather than self-excluding it as “no extension available”), so a side-panel task no longer fails with NO_EXTENSION on a single-extension setup. While a side-panel session is running, /health reports extension_busy: true and active_session_id: <session_id>. A concurrent praisonai browser run in that state is rejected at the pre-flight check with:
Exit code 2. The reverse also holds: starting a side-panel run while run is active is rejected the same way.
Navigate a browser tab to a URL:

Screenshot

Capture a screenshot of the current page:
With options:

Pages

List all open browser pages/tabs:

DOM

Get the DOM tree from a browser page:

Content

Read page content as text:

JS / Execute

Execute JavaScript in a browser page:

Sessions

List browser automation sessions:
Sessions end in one of completed, failed, stopped, or cancelled. cancelled covers mid-run disconnects (extension quit, CLI Ctrl-C, tab closed) — all four now stamp ended_at in the SQLite store, so sessions and history show accurate durations for interrupted runs.

History

Show step-by-step history for a session:

Examples

Web Scraping Workflow

Using Browser Agent

Browser Health Check


Chrome Management

Start Server

Chrome Subcommands

Extension Subcommands


Environment Variables


Bot CLI

Deploy messaging bots

Sandbox CLI

Sandbox container management