October 29, 2026
Files the agent sends you. Hosted agents send each file once it is final, such as a download from the cloud browser, as an
AttachmentEvent with origin: "agent". Download it by its file_id with GET /api/v2/files/{file_id}. See Get the files the agent sends.Agents. In H’s cloud and in local mode:- Loaded skills stay loaded after context compaction.
- Text the agent passes to tools keeps its whitespace.
- Tools from the agent’s MCP servers keep their descriptions and enum values, and tools with hyphens in their names work.
hai-agents 1.4.1 (Python) ships with this release. The CLI’s live feed shows when the agent sends you a file.October 27, 2026
New
- CLI:
pip install "hai-agents[cli]"installs theholocommand.haistays as an alias, and your stored key and settings carry over. - CLI:
holo -a h/holo-desktop "task"drives your desktop. Press Esc twice or runholo local stopto stop it. - CLI:
--localruns any agent’s loop on this machine with hosted models, or with your own model server. - CLI:
holo mcpgives coding agentsrun_agentandlist_agents.holo mcp installwires it into 13 hosts, or wires in the hosted MCP server with--remote. - CLI:
~/.holo/agents.mdand~/.holo/skills/add your instructions and skills to every session. - CLI:
holoalone opens an interactive session: send follow-ups, press Esc to pause and correct the agent, type/for commands and?for keys. History is saved.
- CLI:
holo "task"runs onh/web-surfer-flashunless you pass--agent, andholo agents use <name>changes the default. - CLI: The live feed shows each step with the page it landed on, its duration, and the running cost.
October 23, 2026
New
timezoneon a session takes an IANA name, such asEurope/Paris, for the dates and times the agent reads and writes. It defaults to UTC, and child sessions inherit it.- A user message takes
skills, inline skill objects that apply to that message only. - Status and changes carry
pending_tool_calls, the custom tool calls the agent is waiting on. - A handle’s
stream()runs custom tool calls as events arrive, and shares its tools withwait_for_completionso each call runs once. - A skill takes supporting
files,executable_files, andcompatibility. The catalog stores them unchanged, and agents don’t install them yet. - A session
429names the limit indetail[].type(plan_limit,capacity,queue_full) and whose slots ran out indetail[].scope. - A session with an environment kind that isn’t public yet gets a
403withdetail[].typeset toenvironment_not_public. changesreportsfirst_index, the index of its first event, and the SDK polling helpers follow it.- SDKs: List filters (
status,agent,sort) also take a single value. - Python SDK:
create_sessiontakestimezonein its typed params.
- At your concurrency limit, a new session ends your own idle sessions of 120 seconds or more, instead of queueing or failing with
429. - Local runtime: At the runtime’s session cap, a new session ends the longest-idle session instead of failing with
429. - Local runtime: A message sent while a session is still starting is held and delivered once it starts, instead of failing with
409. - Local runtime:
max_time_scaps each turn, not the whole session, so an interactive session doesn’t time out without an answer.
- A session running a browser and a workstation serves its files from the browser instead of failing with
400. - A late or replayed state change doesn’t flip the status back.
- Local runtime: A session only loads the skills its agent gives it.
- Python SDK: Sessions with a
user_deviceenvironment fromClient()connect to your machine again. - TypeScript SDK: List filters with several values (
status,agent,sort) don’t return422.
October 21, 2026
New
- Every write to a catalog agent is saved as a numbered revision. Pin one with
name:Nwherever you reference an agent, and a bare name runs the latest. - Retrieve an agent takes
?revision=N, and List agent revisions browses the history. - Restore an agent revision saves an old spec as the next revision, and
?include=revisionon List agents shows each agent’s current one. - Update, patch, and delete take
If-Matchwith theETagyou read, and a stale tag gets412. Writes take an optionalmessage. - Sessions report
agent_revision.
settle_sandscreenshot_max_widthtake effect in H’s cloud.- A manager sees its subagents’ environments without their secrets: proxy credentials, MCP headers, and environment variables stay out of its prompt.
- A
422on a field that takes a name or an inline object (agent,environments,subagents,skills,messages) names only what’s wrong, for exampleagent.inline.name: Field required. The local runtime reports them the same way. - TypeScript SDK (breaking):
createAgenttakes the agent underbody, next to the optionalmessage:client.agents.createAgent({ body: { name, description, environments } }).
- A message that would restart a finished session gets
429at your concurrency limit or when the platform is full, instead of being accepted and lost. - A PATCH that sends
nullfor a field that can’t benullgets422instead of500. - A session without
max_stepsormax_time_sdoesn’t tell the agent its budget is 0. - Local runtime: A session you start and only poll later doesn’t end
interruptedwhen its first poll comes more than 20 seconds after create. - Local runtime: A finished session’s events stay readable after you’ve read them to the end.
- Local runtime: A client attached to a runtime that another process started picks up a replacement runtime at the same address once that process exits.
October 15, 2026
Changed
- Local runtime:
settle_sandscreenshot_max_widthapply to local sessions too.
- Local runtime: A session without
max_stepsormax_time_sdoesn’t tell the agent its budget is 0.
October 15, 2026
New
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, and only ever shrinks.nullkeeps the host default.
- Desktops wait 0.5 s after each action on every host, up from 0.1 s on your machine and down from 1.0 s in the cloud.
- A new session that omits
delete_after_minkeeps its data for the retention period in your privacy settings. A value deletes it sooner,nulladds no expiry beyond that period, and existing sessions keep their policy.
October 15, 2026
October 9, 2026
New
- Local runtime:
Inference.self_hosted(url, model="holo4-35b-a3b")ormodel="holo4-27b"runs the Holo4 harness against your own model server.
October 8, 2026
New
- Local runtime: The local runtime ships for Linux x64 and Windows ARM64, next to macOS on Apple silicon and Windows x64.
- Esc twice cancels the session driving your desktop on Windows and Linux, as on macOS.
- One process drives a desktop at a time, and a second one fails with
DesktopBusyError.
October 7, 2026
New
- Python SDK:
Client.local()runs the agent loop on your machine, with the cloud’s sessions API and H’s hosted models or your own model server. - List agents takes
reserved:truereturns only pre-builth/agents,falseonly your organization’s.
September 23, 2026
New
holo4-27bandholo4-35b-a3bare available to all organizations as themodelof any agent or subagent.- Holo4 agents default to
reasoning_effort: medium. Onlyholo4-27bhas effort levels.
- New agents that leave
modelunset run onholo4-27b.
September 22, 2026
Changed
- A session whose organization has no plan usage or credit left ends
failedwitherror_code: insufficient_creditinstead ofinternal. Top up credit or wait for the allowance to renew, then retry.
September 15, 2026
New
- List, read, or write files in a cloud browser’s
~/Downloadswhile a session runs. Bodies are base64, capped at 8 MiB. - Address session files by the browser session ID, which the events stream publishes as
RunnerSessionEvent. - The MCP server exposes session files as
list_files,read_file, andwrite_file. lazy: truestarts a cloud browser on the agent’s first browser action, so an unused browser never starts.- Every file the agent moves in or out of its browser is reported as a
FileTransferEventwithdirection(downloadorupload),path, andsize_bytes. - List sessions summaries carry
last_activity_at, when the session’s latest event was ingested.
- Oversized tool output is cut to a 16 KiB head/tail preview before it reaches the model and the events stream.
tool_resultevents carrytruncated, plusoutput_artifact_pathwhen a code sandbox holds the full text.
July 16, 2026
New
delete_after_mindeletes a finished session after a delay, anddelete_screenshot_after_minexpires its screenshots sooner. Both default to 30 days, andnullkeeps data indefinitely.- CLI:
hai doctorchecks login, platform access, and the prerequisites for driving your machine, and suggests a fix for each failure. - CLI:
hai local stop(or Esc twice during a desktop turn) cancels the in-flight session driving your machine.
- CLI:
hai local desktopdownscales and recompresses your desktop’s screenshots before upload, which cuts per-step latency on high-resolution displays. Tune with--max-width,--image-format, and--quality. - SDK and CLI: Sessions driving your machine cancel when your process exits, and auto-started ones get default
max_stepsandmax_time_sbudgets. - On macOS, missing Accessibility or Screen Recording permissions fail fast at startup.
July 9, 2026
New
- Python SDK: Set an environment’s
hosttouser_deviceand the agent drives your browser or your desktop. The SDK launches Chrome and connects your machine to H. persist_browser_profile: truewithbrowser_profile_idwrites the session’s final browser state back into the profile.- One persisting session holds a profile’s write lock. Later persist sessions start read-only instead of failing, and read-only sessions load the profile in parallel.
use_default_browser_profile: trueloads your default profile, created empty on first use, and saves the final state back when the session ends.PUT /browser-profiles/{profile_id}/defaultpromotes a profile you curated, and get-default and unset-default read and clear it. Profiles reportis_default.
July 6, 2026
New
- Schedules start a session on each fire of a five-field cron in an IANA timezone, with pause, resume, manual trigger, and a run history.
- Browsers can egress through an H-provisioned managed proxy with a
pool, an optionalcountry, andsticky. Credentials resolve server-side, and it can’t be combined withnetwork.proxy_url. - Webhooks report
last_delivery_status,last_delivery_error,last_delivery_at,last_success_at, andconsecutive_failures.
July 3, 2026
New
- Webhooks subscribe to specific event types, like
session.completedorsession.awaiting_tool_results. - Failed webhook deliveries retry with backoff, and endpoints that keep failing are disabled.
- Ping an endpoint or rotate its secret without downtime.
- Failed sessions carry an
error_code(environment_error,no_answer,answer_validation,timeout,internal) next toerror. - Every answer reports the agent’s self-assessed
outcome(success,partial,infeasible,blocked).
- Over-quota creates are queued and start oldest first as slots free up. Queued sessions fire webhooks and can be cancelled, and
queue: falsekeeps the429.
July 1, 2026
New
- Browsers accept
headless: trueto run without a visible window.
July 1, 2026
Changed
- Listing agents, skills, and environments in the
h/catalog needs no API key. Authenticated calls also return your organization’s entries. - CLI:
hai runwithout--agentlists the agent catalog and prompts for a choice.
June 29, 2026
Changed
- A browser’s
modeis an object keyed bytype, so viewport and text settings live with their mode. The flat shape ("mode": "visual"with siblingwidth,height,page_chars) still parses. visual(default) is{"type": "visual", "width": 1200, "height": 1200, "markdown": false}, andmarkdown: truereplaces themultimodalmode.textis{"type": "text", "chunk_size": 20000}, andchunk_sizereplaces the top-levelpage_chars.