agentos.guide › blog
Hermes agent streaming inside your Agent OS is something you configure by talking to your agent: it reads your config, sets the keys and tells you which timers are guarding each reply.
This guide gives you a quick start, five prompts to paste, and a weekly routine for keeping streams healthy.
It covers the newest setting too, agent.stream_max_lifetime, which landed on main on 1 November 2026.
If you'd like my team to plan your agent setup with you, book a free SEO strategy session.
All of these live in ~/.hermes/config.yaml and come from the official Hermes configuration docs.
display:
streaming: true # Stream tokens to terminal in real-time
show_reasoning: true # Also stream reasoning/thinking tokens (optional)
streaming:
enabled: true # Enable progressive message editing (default: false)
agent:
stream_max_lifetime: 0 # seconds; 0 = off (the default)
The first block paints tokens in the terminal.
The second turns on live message edits in Telegram, Discord and Slack.
The third is the new wall-clock cap, left off until you've measured your replies.
You rarely edit this file by hand: ask the agent and it makes the change.
The gateway block has more options than the one line shown here, including the edit interval, the buffer size and the cursor, and Prompt 2 sets those to their documented defaults.
Hermes uses three keys with nearly the same name, and each does a different job.
display.streaming is cosmetic: it only decides whether tokens are painted in your terminal.
streaming.enabled is for messaging platforms: it turns on progressive message edits.
model.streaming is the wire itself: set it to false and every request becomes non-streaming, parent and subagents alike.
Only the last one changes how stalls are caught, because the stale detector and the new cap both watch a streaming request.
So if your agent ever suggests turning off model.streaming to tidy up the terminal, stop it and point it at display.streaming instead.
| Guard | What it catches | Out of the box |
|---|---|---|
| Socket read | No next chunk from the provider | 120 s, raised to 1,800 s on local endpoints |
| Stale stream | Pings arriving, but no content | 180 s, with a 900 s local ceiling |
| Stream max lifetime | Chunks arriving, but no finish | Off |
| Stale give-up | Repeated stale kills with no completed reply | 5 in a row |
The stale detector resets on every chunk.
That's why a proxy trickling chunks, or a runaway answer, used to slip past it.
The cap, added in commit ac8037c05b, never resets, so it catches exactly that case.
For short network blips there's a fifth layer you rarely see: up to three mid-stream reconnects by default.
And at the 180-second default the stale window grows with context, to 240 seconds above 50k tokens and 300 above 100k.
Start by finding out what you're running, before changing anything.
Read ~/.hermes/config.yaml and list every streaming-related key:
display.streaming, display.show_reasoning, streaming.enabled,
each display.platforms.*.streaming toggle, model.streaming,
agent.stream_max_lifetime and agent.local_stream_stale_timeout.
For each one, say whether it's set or on its default.
Then tell me which Hermes commit or tag I'm running.
The last line matters.
The cap is on main but not in a tagged release yet; the newest tag is v0.22.5.
If your agent reports v0.22.5, the cap key will do nothing until you update from main or the next release ships.
Turn on gateway streaming: set streaming.enabled to true.
Leave transport on auto, edit_interval at 0.8 and buffer_threshold at 24.
Then check display.platforms.discord.streaming. If it's false,
set it to true with:
hermes config set display.platforms.discord.streaming true
Restart the gateway and send a test message on Telegram and Discord.
Telegram streams as soon as the master switch is on.
Discord doesn't, because its per-platform toggle ships as false, and that catches most people out on the first test.
Signal, Email and Home Assistant are spotted automatically and get whole messages.
Very long answers are split for you: past roughly 4,096 characters the message is finalised and a new one begins.
On Telegram, edits keep the first-token timestamp, so if that bothers your team, ask the agent about fresh_final_after_seconds, which is 0 by default.
🔥 Want the Agent OS with these prompts already loaded?
Inside the AI Profit Boardroom you get step-by-step video trainings, the installable Agent OS with Hermes wired in, four coaching calls a week and 3,400+ members.
Never guess a cap value; get your agent to measure one.
Look through agent.log for the last 7 days of streamed replies.
Find the longest stream that finished normally and tell me how long it took.
Also list any stale-stream kills, which model they hit,
and whether HERMES_STREAM_STALE_GIVEUP ever tripped.
A follow-up commit logs the armed stale and cap values at debug level, so newer builds show which limits every call ran under.
The breaker itself is documented in the environment variable reference: five consecutive stale kills with no completed response, then each call aborts at once with a clear error.
Set agent.stream_max_lifetime in config.yaml to a value comfortably
above the longest normal reply you just measured. Use seconds.
Don't use an environment variable for this.
Then confirm which transport my main model uses. If it's
codex_responses or Bedrock, warn me that the cap won't apply.
The "no environment variable" line is deliberate: commit b484be5610 removed HERMES_STREAM_MAX_LIFETIME, so config.yaml is the only place the cap lives.
The transport check matters because the cap covers Chat Completions and Anthropic Messages streams only.
And don't worry about setting it too low by accident: it never fires before the effective stale-stream timeout.
A reply was just cut off. Check agent.log and tell me in plain English:
was it a stale kill, a stream_max_lifetime cut, or a network error?
Did Hermes retry or continue the partial reply?
Should I raise the cap, lower it, or leave it?
Since follow-up commit eee418e089, a capped reply surfaces as "Response still streaming after Ns, cut by agent.stream_max_lifetime", so your agent can tell the two kinds of cut apart.
A cap cut also never counts toward the stale breaker, because the provider was still answering.
After a cut, the retry or the partial-response continuation takes over, with a fresh cap clock for the new attempt.
📞 Want a human to check your agent plan?
Book a free SEO strategy session and my team will look at what you're automating and where an agent saves real time.
Leave it at 0 for long reasoning work.
The docs say so directly: a legitimately long stream shouldn't be cut just because it's long.
Research agents, long code generations and big document reviews all fall in that bucket.
If you're unsure, leave it off for a week, run Prompt 3, and decide with real numbers rather than a hunch.
Local models are a separate case: they get a 900-second stale ceiling because they send no pings during prefill, so tune agent.local_stream_stale_timeout first.
Cron runs and delegated subagents stream on their own thread, so the stale budget guards them while you sleep.
Every token counts as proof of life, which means a slow reasoning model isn't mistaken for a hung provider.
Pair this guide with my Hermes agent cron job guide if you schedule work overnight.
If you want a record of every streamed reply, the Hermes hooks docs list observer hooks for exactly that: on_stream_start, on_stream_delta and on_stream_end.
Each callback gets its own bounded queue, so a slow plugin drops its own oldest events and never delays the reply.
Reasoning deltas stay private unless you set plugins.stream_reasoning_deltas: true.
Ask your agent to write a small plugin that saves each on_stream_end result with its finished flag and error, and you have a log of every cut without reading raw output.
model.streaming: false, and accept that it removes the liveness checks.Four steps, about once a week, and your streams stay predictable.
Keep the answers from Prompt 3 in a note in your Agent OS, so next week's check has something to compare against.
Want the trainings that go with it? Join the AI Profit Boardroom.
Yes. Every key here lives in ~/.hermes/config.yaml, so a plain-English request in your Agent OS chat is enough for the agent to set it.
It merged to main on 1 November 2026 and is not in v0.22.5, the latest tag. Update from main or wait for the next release.
Any model reached over Chat Completions or Anthropic Messages streams. Codex/Responses and Bedrock streams are not capped.
No. A cap cut never counts toward HERMES_STREAM_STALE_GIVEUP, so the breaker stays clear for the next request.
Paste Prompt 1 into your agent now, and if you want the full system ready to go, join the AI Profit Boardroom and run Hermes agent streaming from your Agent OS.
About Julian
I'm Julian Goldie, an AI entrepreneur, SEO expert and the founder of the AI Profit Boardroom, which has 3,400+ members.
I help business owners scale with AI agents, automation and SEO.
My YouTube channel has 400,000+ subscribers, and I run Goldie Agency, a seven-figure SEO agency.
→ Hermes Agent Hooks: Set Guardrails In Your Agent OS
→ The Best Hermes Agent Model, And The Five Model Lanes I Route Inside My Agent OS
→ Grok Bot Android: Approve And Steer It In Your Agent OS
→ Grok Bot Windows: Install And Run It In Your Agent OS
The installable system behind every guide on this site — dashboard, agents, memory and pipelines — updated as new tools land, with 3,400+ members and four coaching calls a week.
Join the AI Profit Boardroom →📺 Video notes + links to the tools 👉
🎥 Learn how I make these videos 👉