Session retention controls. Set
delete_after_min to delete a finished session after a delay, and delete_screenshot_after_min to expire its screenshots sooner. Both default to 30 days; null keeps data indefinitely. See Create a session.Faster local desktop. Screenshots are downscaled and recompressed on your machine before upload, cutting per-step latency on high-resolution displays. Tune with --max-width, --image-format, and --quality on hai local desktop. See Local desktop.Sturdier local control (Python SDK and CLI). hai doctor diagnoses login, platform access, and local-control prerequisites with fix-it hints. hai local stop (or double-Esc during a desktop turn) cancels the in-flight local session, sessions auto-cancel when your process exits, and auto-started sessions get default max_steps / max_time_s budgets. On macOS, missing Accessibility or Screen Recording permissions fail fast at startup instead of silently doing nothing.Local control. Let an agent drive the browser or desktop on your own machine, not just one H runs in the cloud. Set an environment’s
host to user_device and run a session from the Python SDK; it launches Chrome and connects your machine to H automatically. See Local browser and Local desktop.Persistent browser profiles. Browser environments can now write the session’s final browser state (cookies, storage) back into the loaded profile: set persist_browser_profile: true alongside browser_profile_id, and each run refreshes the profile for the next one instead of starting from an aging snapshot. An exclusive write lock means only one active session at a time may persist a given profile (concurrent read-only use is unaffected); when the lock is held, a new persist session starts read-only instead of failing. See Persisting state back.Default browser profiles. Every user now has a zero-setup browser that remembers them: set use_default_browser_profile: true on a Browser environment and the session loads your default profile — auto-creating an empty one on first use — then saves its final state back automatically when it ends (best-effort: concurrent sessions run read-only instead of failing). Log in once, and later sessions start already signed in. Prefer a curated profile? Promote it with PUT /browser-profiles/{profile_id}/default; profile objects now report is_default, and get-default and unset-default endpoints round out the surface. See Default profiles.Scheduled sessions. Create cron schedules that start a session on each fire: five-field cron expressions evaluated in an IANA timezone, with pause/resume, manual trigger, and a per-schedule run history showing whether each fire created a session or was skipped. See Schedules.Managed proxies. Browser environments can now egress through an H-provisioned proxy: set
network.managed_proxy with a pool (residential or datacenter), an optional country, and sticky to keep one exit IP for the session. The platform resolves the provider and credentials server-side, so you never handle them. Mutually exclusive with the existing network.proxy_url. See Proxy.Webhook delivery health. The webhook object now reports its delivery state: last_delivery_status, last_delivery_error, last_delivery_at, last_success_at, and consecutive_failures. Poll retrieve to monitor an endpoint without waiting for it to be disabled. See Webhooks.Queue sessions instead of 429. Over-quota session creates are now accepted with the new
queued status instead of rejected. They start automatically, oldest first, as slots free up, fire webhooks on every transition, and can be cancelled while queued. Set queue: false on create to keep the old 429 behavior. See Queued sessions.Granular webhook events, retries, ping, secret rotation. Subscribe to specific event types like session.completed or session.awaiting_tool_results instead of the session.status_updated firehose (event catalog). Failed deliveries now retry with backoff, endpoints that keep failing are disabled automatically, and you can ping an endpoint or rotate its secret without downtime. See Webhooks.Machine-readable failures. Failed sessions now carry an error_code (environment_error, no_answer, answer_validation, timeout, internal) next to the human-readable error, and every answer reports the agent’s self-assessed outcome (success, partial, infeasible, blocked). Build retry logic against codes, not strings. See Read how the run ended.Browser
headless option. Browser environments accept headless: true to run without a visible window (default false). See Configuration.Registry packages skipped this version; its changes shipped in the 1.0.4 packages.Browse the
h/ catalog without an API key. Listing agents, skills, and environments no longer requires authentication for the reserved h/ catalog; authenticated calls additionally return your organization’s own entries.CLI agent picker. hai run without --agent now lists the live agent catalog and prompts for a choice instead of assuming a default agent.Nested Browser
mode. A Browser’s mode is now an object keyed by type, so viewport and text settings live with the mode they belong to instead of as flat siblings:visual(default):{"type": "visual", "width": 1200, "height": 1200, "markdown": false}. Setmarkdown: trueto include the page’s text alongside each screenshot (this replaces the oldmultimodalmode).text:{"type": "text", "chunk_size": 20000}, wherechunk_sizereplaces the old top-levelpage_chars.
"mode": "visual" with sibling width, height, page_chars) still parses, so existing integrations keep working. See Modes.