Service eligibility and regional restrictions
PuppyIP serves only compliant overseas businesses and their authorized personnel. Proxy services are not available in mainland China. The service may only be used for lawful business activities outside mainland China. Use of this service within mainland China is prohibited.
Hosting a proxy IP or server overseas does not change these restrictions. The service must not be provided to end users in mainland China through relaying, forwarding, sharing or resale. Before use, read the Terms of Service.
Key Takeaways
- Requires Agents SDK 0.28.0 or later. The persistent browser currently uses Browser Run’s Chromium engine and CDP.
- Pi gives each conversation an active tab by default, while cookies and logins remain shared within one Browser. Separate tabs do not isolate accounts.
- A Durable Object can reconnect after hibernation while the browser remains alive. restarted: true means the old tabs and login state were lost.
- Hand off to a person between turns. Live View links control the browser and belong only with trusted, authenticated users.
- The Free plan’s 10 browser minutes per day differ from the 10-minute idle timeout. CDP sessions also incur concurrency charges.
What persists, and when is it lost?
Cloudflare announced Agents SDK browserTool on October 13. The model writes code using Chrome DevTools Protocol (CDP), the browser control interface, to open websites, read pages or work with tabs. Later turns can return to the same Browser Run browser.
The browser runs outside the Durable Object. The object saves its session identifier and reconnects after hibernation while the browser remains alive, retaining tabs, cookies and logins. The default idle timeout is 10 minutes; keepAliveMs is configurable through browserRun(binding, options). This does not permanently store a login.
Expiry, closure or a crash causes the next call to create a fresh browser. restarted: true means the previous state is gone. Recheck the page and login before continuing. The announcement provides no country-by-country availability list or exact launch time, and does not establish successful integration for an individual account.
For Pi, configure bindings and lifecycle first
First, check that your development project uses agents 0.28.0 or later. Follow the Pi Durable example for @cloudflare/codemode, @earendil-works/pi-durable and @earendil-works/pi-ai. The persistent browser currently uses Browser Run’s Chromium engine; this example does not establish support for Firefox, WebKit or another CDP service.
Next, configure BROWSER for Browser Run, LOADER for Worker Loader, the Durable Object and model bindings. The Pi example uses the Workers AI binding AI, a SQLite class migration and nodejs_compat, with today’s compatibility_date. Export CodemodeRuntime from agents/browser. LOADER runs model-written browser code in a sandbox.
Then create Browser and browserRun from agents/browser, and import browserTool from agents/browser/pi. Register the tool in the Pi extension’s tools array before Harness.open(). Manage both components with Lifecycle.install(this).use(this.browser).use(this.harness). The official source contains the full configuration; no SDK installation, Worker deployment or browser task was performed for this article.
A tab per conversation is not a login per user
Pi remembers an active tab for each conversation by default. Conversations, forks and subagents sharing a Browser still share its cookies and logins. A scope distinguishes active tabs, rather than separate browser profiles. Use separate Browsers when users need separate login sessions; changing conversationId alone does not isolate accounts.
For AI SDK, import browserTool from agents/browser/ai-sdk and add it to the tools object for generateText or streamText. For TanStack AI, import from agents/browser/tanstack-ai and add it to chat’s tools array. Both share one active tab when scope is omitted. Supply a conversation identifier where needed; cookies still remain shared across scopes.
Suppose two employees use different work accounts. This is an unexecuted design example. Giving each employee a tab would still leave both logins in one browser. Choose object names from authenticated users or workspaces, and separate Browsers according to account-isolation requirements. Do not copy the demo’s single shared object name into a multi-user application.
Hand login and verification steps to a person between turns
Your application calls browser.liveView() to obtain links into the same browser for login, multi-factor authentication, CAPTCHAs or sensitive input. It lists tabs across every scope in that Browser. It returns undefined when no browser is active, or after closure or expiry; it does not start a replacement.
browserTool does not pause a running call for human action. Let the model reach the step requiring help and finish that turn. Your application shows Live View to the user; after the user completes the step, continue on the next turn. Signing in does not authorize subsequent purchases, deletions or other business actions.
Live View links are bearer credentials that control the browser. Show them only to trusted, authenticated users; do not give them to the model or store them in logs. They remain valid for starting a connection for about five minutes. Generate fresh links when needed. This is separate from the browser’s 10-minute idle timeout.
After interruption, inspect the result before replaying a click
Pi does not automatically replay a browser call interrupted by object eviction: repeating it could submit a form or click a button twice. The model receives an interrupted result and decides how to continue. Inspect the target page and necessary business result before sending the original call again.
Stopping a conversation does not cancel a browser call already running. The call finishes or reaches timeoutMs, which defaults to 60 seconds. Stopping the wait, completion of the call and successful execution are separate states; a stopped chat does not establish that no website action occurred.
When finished, the application calls browser.close(); it returns false if no browser was open. The next use creates a new browser, and scopes that used the old one receive restarted: true. Configure keepAliveMs and hostname guardrails through browserRun. These controls do not replace website or account authorization.
Ten free minutes per day are not ten minutes per session
The current Browser Run pricing page covers Workers Free and Paid. Free includes 10 browser minutes per day and three concurrent browsers. These plan allowances differ from the persistent session’s default 10-minute idle timeout. Retaining a session between turns does not restart the daily allowance.
Paid includes 10 browser hours per month, then charges $0.09 per additional hour. CDP uses Browser Sessions, which also charge for concurrency. The monthly average of daily peaks includes 10 concurrent browsers, then $2 per additional browser. This billing allowance does not establish every applicable runtime limit.
Cloudflare’s hypothetical example uses 50 hours per month, with daily peaks of 10 browsers for 15 days and 20 for the next 15. Additional hours cost $3.60; average concurrency of 15 adds $10, totaling $13.60. That covers Browser Run charges, rather than a complete bill including models, Workers and storage. The page was updated April 21; this is not an October 13 price increase.
Start with two read-only turns that return to the same page
Following the official example, an unexecuted check would ask the same assistant to open public example.com and read its title, then capture the already-open page within the idle timeout without navigating again. Inspect the actual session, active tab and returned result, rather than relying on the model saying it remembers.
Next, check continuation after human login, the restarted branch after expiry, and result verification after an interrupted call. A screenshot helps inspect a page but does not establish a payment or system write. For a known public document, the existing web_fetch guide offers a simpler route; choose a browser when you need interaction, JavaScript rendering or a continuing login.
Sources
Frequently Asked Questions
Can web_fetch reuse this browser’s login?
No. web_fetch sends a GET for a URL without browser cookies or credentials. Continue an authenticated page through the corresponding Browser. Public-document retrieval and browser sessions are separate paths.
Do all adapters show screenshots to the model?
They differ. Pi stores screenshots as images in tool results for an image-capable model and the UI. The AI SDK adapter exposes screenshots to the UI and sends the model a text summary. TanStack AI omits screenshots and directs the model to read page content.
How can a custom harness disconnect while keeping the browser?
Browser.connect({ scope }) returns the CDP connection, active tab identifier and restarted flag. Use setActiveTarget() to remember a tab, then cdp.disconnect() to release the connection without closing the Browser. Idle expiry, closure and crashes still apply.
Does the pricing FAQ make every timed-out browserTool call free?
No. Its no-charge statement concerns Quick Actions requests failing with waitForTimeout. browserTool uses Browser Sessions through CDP. The billing methods differ; do not extend that Quick Actions statement to every interrupted or failed call.