Skip to main content
October 23, 2026
Session timezone. timezone on Create a session takes an IANA name, such as Europe/Paris, so the agent gets “today” and every time it writes in your zone. It defaults to UTC, and child sessions inherit it.Skills on a message. A user message takes skills, inline skill objects that apply to that message only. Use them to bring a skill into one turn without editing the agent. See Send messages.Pending tool calls on the session. Status and changes carry pending_tool_calls, the custom tool calls the agent is waiting on. You no longer scan events for the latest ActiveStateChangeEvent. A late or replayed state change no longer flips the status back.Streams answer custom tools. A handle’s stream() runs the agent’s tool calls as events arrive, with the handle’s tools or stream(tools=[...]). It shares them with wait_for_completion, so each call runs once. Without tools, the stream stays read-only. See Watch and steer.Idle sessions make room. At your concurrency limit, your next run ends your own sessions that have sat idle for 120 seconds or more, instead of queueing or failing with 429. See Concurrent sessions.Skill files. A skill takes supporting files, executable_files, and compatibility. The catalog stores them and returns them unchanged. Agents don’t install them in their environment yet.Clearer errors.
  • A session 429 names the limit in detail[].type (plan_limit, capacity, queue_full) and whose slots ran out in detail[].scope. See Quota errors.
  • A session with an environment kind that isn’t public yet gets a 403 with detail[].type set to environment_not_public.
Fixes.
  • A session running a browser and a workstation serves its files from the browser instead of failing with 400.
  • changes reports first_index, the index of its first event, and the SDK polling helpers follow it.
Local mode (Python). The local runtime moves to 0.1.22.
  • At the runtime’s session cap, a new session ends the longest-idle session instead of failing with 429.
  • A message sent while a session is still starting is held and delivered once it starts, instead of failing with 409.
  • max_time_s caps each run, not the whole session, so an interactive session no longer times out without an answer.
  • A session only loads the skills its agent gives it.
  • Sessions with a user_device environment from Client() connect to your machine again.
SDK 1.3.0. hai-agents 1.3.0 (Python and TypeScript) ships with this release.
  • TypeScript list filters that take several values (status, agent, sort) work. They returned 422.
  • In both SDKs, those filters also take a single value.
  • Python create_session takes timezone in its typed params.
October 21, 2026
Agent revisions. Every write to a catalog agent is saved as a numbered revision. See Revisions.
  • Pin one with name:N wherever you reference an agent: a session’s agent, a schedule’s session_request, or a manager’s subagents. A bare name runs the latest.
  • Read one with ?revision=N on Retrieve an agent, and browse the history with List revisions.
  • Roll back with Restore a revision: the old spec becomes the next revision. ?include=revision on List agents shows each agent’s current revision.
  • Update, patch, and delete take If-Match with the ETag you read. A stale tag gets 412. Writes take an optional message.
  • Sessions report agent_revision.
Clearer errors.
  • A message that would restart a finished session gets 429 when you’re at your concurrency limit or the platform is full. The message used to be accepted and lost. See Send messages.
  • A PATCH that sends null for a field that can’t be null gets 422 instead of 500.
  • A 422 on a field that takes a name or an inline object (agent, environments, subagents, skills, messages) names only what’s wrong with what you sent, for example agent.inline.name: Field required. In local mode too.
Hosted agents.
  • settle_s and screenshot_max_width take effect in H’s cloud.
  • A session without max_steps or max_time_s no longer tells the agent its budget is 0.
  • A manager sees its subagents’ environments without their secrets: proxy credentials, MCP headers, and environment variables stay out of its prompt.
Local mode (Python).
  • A session you start and only poll later no longer ends interrupted when its first poll comes more than 20 seconds after create.
  • A finished session’s events stay readable after you’ve read them to the end.
  • A client attached to a runtime that another process started picks up a replacement runtime at the same address once that process exits.
SDK 1.2.7. hai-agents 1.2.7 (Python and TypeScript) ships with this release. TypeScript goes straight from 1.2.4: there is no TypeScript 1.2.5 or 1.2.6.
  • Breaking (TypeScript): createAgent takes the agent under body, next to the optional message: client.agents.createAgent({ body: { name, description, environments } }).
October 15, 2026
Timing and screenshot controls in local mode. settle_s and screenshot_max_width apply to local sessions too. A local session without max_steps or max_time_s no longer tells the agent its budget is 0.
October 15, 2026
Timing and screenshot controls. Trade speed for stability per environment. See Configuration and Create an environment.
  • settle_s sets the seconds the agent waits after each action, from 0 to 10. Browsers default to 1.0, desktops to 0.5.
  • screenshot_max_width caps a desktop’s screenshot width, up to 1920 pixels. null keeps the host default. Screenshots are only shrunk, never enlarged.
  • Desktops wait 0.5 s after each action on every host (previously 0.1 s on your machine, 1.0 s in the cloud).
Retention follows your privacy settings. A new session that omits delete_after_min keeps its data for the retention period in your privacy settings. A value still deletes it sooner, and null adds no expiry beyond that period. Existing sessions keep their policy. See Create a session.
October 15, 2026
Schedules that stop on their own. repeats caps how many sessions a schedule creates. Each automatic fire that creates a session counts toward sessions_created, and the schedule pauses when it reaches repeats. Raise repeats or set it to null, then resume, to run more.
October 9, 2026
Self-hosted Holo4 in local mode. Inference.self_hosted(url, model="holo4-35b-a3b") or model="holo4-27b" runs the Holo4 harness against your own server. The harness follows the model you name. See Local mode.
October 8, 2026
Local mode on Linux and Windows ARM64. The local runtime now ships for Linux x64 and Windows ARM64, next to macOS on Apple silicon and Windows x64. See Local mode.Local desktop safety.
  • Double-Esc cancels the in-flight local desktop session on Windows and Linux, as on macOS.
  • One process drives a desktop at a time: a second one fails with DesktopBusyError.
October 7, 2026
Local mode (Python). Client.local() runs the agent on your own machine, with the cloud’s sessions API and H’s hosted models or your own model server. See Local mode.Filter H’s agents. List agents takes reserved: true returns only H’s h/ agents, false only your organization’s.
September 23, 2026
Holo4 for every agent.
  • holo4-27b and holo4-35b-a3b are available to all organizations as the model of any agent or subagent.
  • New agents that leave model unset run on holo4-27b.
  • Holo4 honors every reasoning_effort level and defaults to medium.
SDK 1.2.0. hai-agents 1.2.0 (Python and TypeScript) ships with this release.
September 22, 2026
Out-of-credit failures.
  • A session whose organization has no plan usage or credit left ends failed with error_code: insufficient_credit (previously reported as internal).
  • Message: “The organization has no credit left to pay for the session’s model calls.”
  • Top up credit or wait for the plan’s allowance to renew, then retry. See Error codes.
September 15, 2026
Session files. List, read, or write files on a cloud browser’s machine while a session runs.
  • Base64 bodies, capped at 8 MiB, confined to ~/Downloads.
  • Addressed by the browser session id, published on the events stream as RunnerSessionEvent.
  • Also exposed as list_files / read_file / write_file on the MCP server.
Lazy browsers. lazy: true on a Browser environment starts the cloud browser on the agent’s first browser action, not at session start. The first turn no longer waits for a boot, and an unused browser never starts. See Configuration.File transfer events. Every file the agent moves in or out of its browser is reported as a FileTransferEvent with direction (download or upload), path, and size_bytes. See Event types.Bounded tool results. Oversized tool output is cut to a 16 KiB head/tail preview before it reaches the model and the events stream. tool_result events carry truncated, plus output_artifact_path when a code sandbox holds the full text. See Agent activity.Session activity timestamp. List summaries carry last_activity_at, when the session’s latest event was ingested, to spot which live sessions are moving.
July 16, 2026
Session retention controls. delete_after_min deletes a finished session after a delay, and delete_screenshot_after_min expires its screenshots sooner. Both default to 30 days, and 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 control.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 ones get default max_steps / max_time_s budgets.
  • On macOS, missing Accessibility or Screen Recording permissions fail fast at startup.
July 9, 2026
Local control. Set an environment’s host to user_device and run a session from the Python SDK: the agent drives the browser or desktop on your own machine. It launches Chrome and connects your machine to H automatically. See Local control.Persistent browser profiles. See Persisting state back.
  • persist_browser_profile: true with browser_profile_id writes the session’s final browser state (cookies, storage) back into the profile, so each run refreshes it for the next.
  • An exclusive write lock allows one persisting session per profile. Concurrent read-only use is unaffected.
  • When the lock is held, a new persist session starts read-only instead of failing.
Default browser profiles. See Default profiles.
  • use_default_browser_profile: true loads your default profile (auto-created empty on first use) and saves the final state back when the session ends (best-effort: concurrent sessions run read-only).
  • Promote a curated profile with PUT /browser-profiles/{profile_id}/default.
  • Profiles report is_default. The get-default and unset-default endpoints complete the set.
July 6, 2026
Scheduled sessions. Cron schedules start a session on each fire: five-field expressions in an IANA timezone, with pause/resume, manual trigger, and a run history showing whether each fire created a session or was skipped. See Schedules.Managed proxies. See Proxy.
  • Browser environments can egress through an H-provisioned proxy: network.managed_proxy with a pool (residential or datacenter), an optional country, and sticky to keep one exit IP per session.
  • The platform resolves the provider and credentials server-side, so you never handle them.
  • Mutually exclusive with network.proxy_url.
Webhook delivery health. Webhooks report last_delivery_status, last_delivery_error, last_delivery_at, last_success_at, and consecutive_failures. Poll retrieve to monitor an endpoint before it gets disabled. See Webhooks.
July 3, 2026
Queue sessions instead of 429. Over-quota creates are accepted as queued and start automatically, oldest first, as slots free up. Queued sessions fire webhooks on every transition and can be cancelled. queue: false on create keeps the old 429. See Queued sessions.Granular webhook events, retries, ping, secret rotation. See Webhooks.
  • Subscribe to specific types like session.completed or session.awaiting_tool_results instead of the session.status_updated firehose (event catalog).
  • Failed deliveries retry with backoff, and the platform disables endpoints that keep failing.
  • Ping an endpoint or rotate its secret without downtime.
Machine-readable failures. Failed sessions 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 on codes, not strings. See Session failures.
July 1, 2026
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.
July 1, 2026
Browse the h/ catalog without an API key. Listing agents, skills, and environments no longer needs authentication for the reserved h/ catalog. Authenticated calls also return your organization’s entries.CLI agent picker. hai run without --agent lists the live agent catalog and prompts for a choice, instead of assuming a default agent.
June 29, 2026
Nested Browser mode. A Browser’s mode is an object keyed by type, so viewport and text settings live with their mode. The old flat shape ("mode": "visual" with sibling width, height, page_chars) still parses. See Modes.
  • visual (default): {"type": "visual", "width": 1200, "height": 1200, "markdown": false}. markdown: true adds the page’s text to each screenshot (replaces the old multimodal mode).
  • text: {"type": "text", "chunk_size": 20000}. chunk_size replaces the old top-level page_chars.