Skip to main content
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.
Local mode (Python). The local runtime moves to 0.1.23, with the agent changes above.SDK 1.4.1. 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 the holo command. hai stays 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 run holo local stop to stop it.
  • CLI: --local runs any agent’s loop on this machine with hosted models, or with your own model server.
  • CLI: holo mcp gives coding agents run_agent and list_agents. holo mcp install wires it into 13 hosts, or wires in the hosted MCP server with --remote.
  • CLI: ~/.holo/agents.md and ~/.holo/skills/ add your instructions and skills to every session.
  • CLI: holo alone opens an interactive session: send follow-ups, press Esc to pause and correct the agent, type / for commands and ? for keys. History is saved.
Changed
  • CLI: holo "task" runs on h/web-surfer-flash unless you pass --agent, and holo 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
  • timezone on a session takes an IANA name, such as Europe/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 with wait_for_completion so each call runs once.
  • A skill takes supporting files, executable_files, and compatibility. The catalog stores them unchanged, and agents don’t install them yet.
  • A session 429 names the limit in detail[].type (plan_limit, capacity, queue_full) and whose slots ran out in detail[].scope.
  • A session with an environment kind that isn’t public yet gets a 403 with detail[].type set to environment_not_public.
  • changes reports first_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_session takes timezone in its typed params.
Changed
  • 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_s caps each turn, not the whole session, so an interactive session doesn’t time out without an answer.
Fixed
  • 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_device environment from Client() connect to your machine again.
  • TypeScript SDK: List filters with several values (status, agent, sort) don’t return 422.
October 21, 2026
New
  • Every write to a catalog agent is saved as a numbered revision. Pin one with name:N wherever 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=revision on List agents shows each agent’s current one.
  • Update, patch, and delete take If-Match with the ETag you read, and a stale tag gets 412. Writes take an optional message.
  • Sessions report agent_revision.
Changed
  • settle_s and screenshot_max_width take 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 422 on a field that takes a name or an inline object (agent, environments, subagents, skills, messages) names only what’s wrong, for example agent.inline.name: Field required. The local runtime reports them the same way.
  • TypeScript SDK (breaking): createAgent takes the agent under body, next to the optional message: client.agents.createAgent({ body: { name, description, environments } }).
Fixed
  • A message that would restart a finished session gets 429 at your concurrency limit or when the platform is full, instead of being accepted and lost.
  • A PATCH that sends null for a field that can’t be null gets 422 instead of 500.
  • A session without max_steps or max_time_s doesn’t tell the agent its budget is 0.
  • Local runtime: A session you start and only poll later doesn’t end interrupted when 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_s and screenshot_max_width apply to local sessions too.
Fixed
  • Local runtime: A session without max_steps or max_time_s doesn’t tell the agent its budget is 0.
October 15, 2026
New
  • 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, and only ever shrinks. null keeps the host default.
Changed
  • 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_min keeps its data for the retention period in your privacy settings. A value deletes it sooner, null adds no expiry beyond that period, and existing sessions keep their policy.
October 15, 2026
New
  • repeats caps how many sessions a schedule creates. The schedule pauses when sessions_created reaches it. Raise it or set it to null, then resume, to run more.
October 9, 2026
New
  • Local runtime: Inference.self_hosted(url, model="holo4-35b-a3b") or model="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.
Changed
  • 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: true returns only pre-built h/ agents, false only your organization’s.
September 23, 2026
New
  • holo4-27b and holo4-35b-a3b are available to all organizations as the model of any agent or subagent.
  • Holo4 agents default to reasoning_effort: medium. Only holo4-27b has effort levels.
Changed
  • New agents that leave model unset run on holo4-27b.
September 22, 2026
Changed
  • A session whose organization has no plan usage or credit left ends failed with error_code: insufficient_credit instead of internal. 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 ~/Downloads while 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, and write_file.
  • lazy: true starts 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 FileTransferEvent with direction (download or upload), path, and size_bytes.
  • List sessions summaries carry last_activity_at, when the session’s latest event was ingested.
Changed
  • 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.
July 16, 2026
New
  • 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.
  • CLI: hai doctor checks 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.
Changed
  • CLI: hai local desktop downscales 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_steps and max_time_s budgets.
  • On macOS, missing Accessibility or Screen Recording permissions fail fast at startup.
July 9, 2026
New
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 optional country, and sticky. Credentials resolve server-side, and it can’t be combined with network.proxy_url.
  • Webhooks report last_delivery_status, last_delivery_error, last_delivery_at, last_success_at, and consecutive_failures.
July 3, 2026
New
  • Webhooks subscribe to specific event types, like session.completed or session.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 to error.
  • Every answer reports the agent’s self-assessed outcome (success, partial, infeasible, blocked).
Changed
  • Over-quota creates are queued and start oldest first as slots free up. Queued sessions fire webhooks and can be cancelled, and queue: false keeps the 429.
July 1, 2026
New
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 run without --agent lists the agent catalog and prompts for a choice.
June 29, 2026
Changed
  • A browser’s mode is an object keyed by type, so viewport and text settings live with their mode. The flat shape ("mode": "visual" with sibling width, height, page_chars) still parses.
  • visual (default) is {"type": "visual", "width": 1200, "height": 1200, "markdown": false}, and markdown: true replaces the multimodal mode.
  • text is {"type": "text", "chunk_size": 20000}, and chunk_size replaces the top-level page_chars.