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
429names the limit indetail[].type(plan_limit,capacity,queue_full) and whose slots ran out indetail[].scope. See Quota errors. - A session with an environment kind that isn’t public yet gets a
403withdetail[].typeset toenvironment_not_public.
- A session running a browser and a workstation serves its files from the browser instead of failing with
400. changesreportsfirst_index, the index of its first event, and the SDK polling helpers follow it.
- 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_scaps 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_deviceenvironment fromClient()connect to your machine again.
hai-agents 1.3.0 (Python and TypeScript) ships with this release.- TypeScript list filters that take several values (
status,agent,sort) work. They returned422. - In both SDKs, those filters also take a single value.
- Python
create_sessiontakestimezonein 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:Nwherever you reference an agent: a session’sagent, a schedule’ssession_request, or a manager’ssubagents. A bare name runs the latest. - Read one with
?revision=Non Retrieve an agent, and browse the history with List revisions. - Roll back with Restore a revision: the old spec becomes the next revision.
?include=revisionon List agents shows each agent’s current revision. - Update, patch, and delete take
If-Matchwith theETagyou read. A stale tag gets412. Writes take an optionalmessage. - Sessions report
agent_revision.
- A message that would restart a finished session gets
429when 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
nullfor a field that can’t benullgets422instead of500. - A
422on 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 exampleagent.inline.name: Field required. In local mode too.
settle_sandscreenshot_max_widthtake effect in H’s cloud.- A session without
max_stepsormax_time_sno 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.
- A session you start and only poll later no longer ends
interruptedwhen 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.
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):
createAgenttakes the agent underbody, next to the optionalmessage: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_ssets the seconds the agent waits after each action, from0to10. Browsers default to1.0, desktops to0.5.screenshot_max_widthcaps a desktop’s screenshot width, up to1920pixels.nullkeeps 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).
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
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-27bandholo4-35b-a3bare available to all organizations as themodelof any agent or subagent.- New agents that leave
modelunset run onholo4-27b. - Holo4 honors every
reasoning_effortlevel and defaults tomedium.
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
failedwitherror_code: insufficient_credit(previously reported asinternal). - 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_fileon the MCP server.
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 doctordiagnoses 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 defaultmax_steps/max_time_sbudgets.- 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: truewithbrowser_profile_idwrites 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.
use_default_browser_profile: trueloads 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_proxywith apool(residentialordatacenter), an optionalcountry, andstickyto 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.
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.completedorsession.awaiting_tool_resultsinstead of thesession.status_updatedfirehose (event catalog). - Failed deliveries retry with backoff, and the platform disables endpoints that keep failing.
- Ping an endpoint or rotate its secret without downtime.
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: trueadds the page’s text to each screenshot (replaces the oldmultimodalmode).text:{"type": "text", "chunk_size": 20000}.chunk_sizereplaces the old top-levelpage_chars.