Hermes agent streaming is the most carefully guarded streaming stack I've read in an open-source agent, and my verdict is 8.3 out of 10.
It loses points for how many overlapping timers you have to understand, not for missing protection.
The new agent.stream_max_lifetime cap, merged to main on 1 November 2026, closes the one hole I'd have flagged: a stream that never goes quiet and never ends.
Want my team to tell you whether an agent like this fits your business? Book a free SEO strategy session.
The Verdict In One Paragraph
Use it if you run an agent in a terminal or in chat apps and you want stalls caught, retried and explained without you watching.
Hermes streams tokens live, edits chat messages as they grow, kills silent connections, reconnects on network blips, continues partial replies, and stops re-waiting on a dead provider.
Skip the new cap if your agent mostly does long reasoning, because the docs themselves tell you to leave it off for that.
Every rating below is my editorial judgement from the official Hermes configuration docs and the commits, not from a benchmark.
The Scorecard
| Criterion | Rating | Why, from the docs |
|---|---|---|
| Live terminal output | 9/10 | Token-by-token box, optional reasoning tokens, automatic fallback when a provider can't stream |
| Chat-app streaming | 8/10 | Progressive edits with tunable interval and buffer, but off by default and Discord needs its own toggle |
| Stall detection | 9/10 | 180s stale window with context-size tiers and a 900s local ceiling |
| Recovery | 9/10 | Three mid-stream reconnects by default, then retry or partial-response continuation |
| Circuit breaker | 9/10 | Gives up after five straight stale kills with no completed reply, and resets on recovery |
| New lifetime cap | 8/10 | Fixes trickling streams, floored at the stale timeout, but opt-in and on main only |
| Transport coverage | 7/10 | Cap skips Codex/Responses and Bedrock streams |
| Error messages and logs | 9/10 | Cuts name the setting; armed limits logged at debug level |
| Ease of setup | 7/10 | Three similar-sounding switches and several timers to learn |
Average the nine rows and you land on 8.3, which is my overall score.
The safe defaults keep it high: most people only ever touch two keys.
Strength: Three Switches That Do Different Jobs
The streaming section splits rendering from transport.
display.streaming paints tokens in the terminal.
streaming.enabled turns on live message edits in Telegram, Discord and Slack, with edit_interval at 0.8 seconds and buffer_threshold at 24 characters by default.
model.streaming decides whether the request itself streams.
Keeping these apart means you can hide tokens in the terminal and still keep every liveness check on the wire.
๐ฅ Skip the timer homework: get Hermes pre-configured 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 swapping the agent settings that work. โ Join the AI Profit Boardroom
Strength: Stall Handling That Adapts To The Model
The stale detector kills a connection that gets keep-alive pings and no content.
Its 180-second default stretches to 240 seconds above 50k tokens of context and 300 above 100k, and reasoning models get floors on top.
Local servers get a finite 900-second ceiling instead, because they send no pings during prefill.
That's a thoughtful design: a slow-but-healthy model is left alone, and a wedged one is still caught eventually.
If you set providers.<id>.stale_timeout_seconds yourself, Hermes uses it exactly, so you stay in control.
Strength: A Breaker That Turns Hangs Into Errors
HERMES_STREAM_STALE_GIVEUP, documented in the environment variable reference, is the feature I'd rate highest.
Five stale kills in a row without a single finished reply, and Hermes stops waiting: every later call fails fast with an error you can act on.
The count clears when a reply completes, when you switch with /model, when a fallback kicks in, or when the primary comes back at the start of a turn.
Most agents I read about just keep waiting; this one tells you to change something.
Setting it to 0 switches the breaker off, which I wouldn't do outside of debugging.
Strength: Plugins Can Watch The Stream Without Slowing It
The plugin hooks docs add four observer hooks: on_stream_start, on_stream_delta, on_stream_end and on_interim_message.
Each callback runs on its own bounded queue and worker thread.
A stalled callback drops only its own oldest events, so a slow logging plugin can't hold up your reply.
Return values are ignored and exceptions are logged without stopping the stream.
Reasoning deltas are private by default and need plugins.stream_reasoning_deltas: true, which is the right default for anyone handling client data.
I rate this design highly because observability usually costs speed, and here it doesn't.
Strength: Long Replies Don't Break Chat Apps
Messaging apps have hard length limits, and Hermes plans for them.
When streamed text passes roughly 4,096 characters, the current message is finalised and a new one starts on its own.
Platforms that can't edit messages, such as Signal, Email and Home Assistant, are spotted on the first attempt, and streaming is switched off for that session rather than flooding the chat.
Telegram gets an extra option, fresh_final_after_seconds, because its edits keep the first-token timestamp; above 0, old previews arrive as fresh final messages.
These are small touches, but they're the difference between a demo and something you'd leave running for customers.
The Gap The New Cap Closes
Before 1 November, one failure slipped through every check.
The stale detector resets on each chunk, so a gateway trickling chunks or a runaway generation was never cut.
Commit ac8037c05b adds a wall-clock limit for one streaming attempt that ignores chunk arrival.
agent:
stream_max_lifetime: 900
The value is in seconds and the default is 0, which keeps the cap off.
It restarts for each retry attempt and never fires before the effective stale timeout.
A cut kills the connection like a stale kill, then the retry or partial-response continuation takes over.
Rating The Follow-Up Fixes
The first version had a flaw the commit log is honest about.
Cap kills counted toward the stale breaker, so two capped long replies could latch it and refuse the next healthy request; eee418e089 stopped that.
b484be5610 removed the environment variable, so the cap now lives in config.yaml only.
c552db90bc abandons a worker that repeated cap kills can't unwind, so a turn can't be re-cut forever.
18d6041890 stops kills that land during retry backoff from counting, and restarts the cap clock after a stale kill.
Four fixes inside a day is a good sign for how the maintainers treat edge cases.
Another follow-up names the cap in the exhausted-retries headline, so a cut no longer claims the provider didn't respond or nudges you towards a backup provider.
That matters more than it sounds: a misleading error sends people off switching providers when the real fix is one number in their config.
Limit: The Cap Covers Two Transports Only
This is the biggest deduction on the scorecard.
The cap applies to Chat Completions and Anthropic Messages streams.
Codex/Responses streams, including custom providers declared with the Responses transport, are not capped, and neither is Bedrock.
Responses users still get a 120-second first-event watchdog and a 2-second post-terminal drain, but not a total-time limit.
The commit explains the Bedrock gap plainly: its poll loop sits in a separate helper file that wasn't extended.
So this reads as a scoping decision, not an oversight.
Until it does, check which wire protocol your provider uses before you count on the cap.
๐ Unsure which transport your agent even uses? Book a free SEO strategy session and my team will look at your setup and where an agent saves real time. โ Get your free strategy session
Limit: Defaults You Have To Know About
Gateway streaming is off until you set streaming.enabled: true.
Even then, Discord stays on whole-message replies because display.platforms.discord.streaming ships as false.
The cap only exists on main for now: v0.22.5, the newest tag, predates it, so run main or wait for the next release.
None of that is broken, but each one costs a confused first test if you don't read the docs.
There's also no single page that walks you through all of it in order; the timers live in one section, gateway streaming in another and the breaker in the environment variable reference.
That spread is the main reason ease of setup scores a 7.
Limit: The Escape Hatch Removes The Safety Net
model.streaming: false forces non-streaming requests for a whole session, parent and subagents alike.
It exists for self-hosted servers whose streaming tool-call path is broken.
The trade is clear in the docs: non-streaming calls lose the liveness properties that make the stall handling work.
Hermes will also switch a session to non-streaming by itself after a contentless SSE frame, which is sensible but worth knowing when you debug.
Who Should Use It, And Who Shouldn't
| Use the cap | Leave the cap at 0 |
|---|---|
| Customer chat bots with short replies | Long reasoning or research agents |
| Agents behind a proxy that trickles chunks | Models on the Responses transport |
| Teams who want a hard stop on runaway answers | Bedrock setups |
Streaming itself I'd switch on for everyone who talks to an agent in real time.
The cap is narrower: it suits teams who know their normal reply length and want a ceiling above it.
If you can't say how long your longest healthy reply takes, measure that first and decide second.
Scheduled work benefits too, since the docs say cron jobs still stream on the wire; my Hermes agent cron job verdict rates that side.
Want the setup done with you? Join the AI Profit Boardroom.
Final Verdict: 8.3/10
Hermes treats a stuck stream as a problem to solve, not a wait to sit through.
The new cap is the right fix for the last failure the stale detector couldn't see, and the follow-ups show it was tested against real edge cases.
Dock it for transport coverage and a learning curve, then turn it on where your replies should always end.
If you only change one thing today, switch on gateway streaming and flip the Discord toggle.
If you change two, add a cap to your customer-facing bot once you run a build from main, set comfortably above its longest normal reply.
Then leave the breaker at its default of five and let Hermes tell you when a provider is really gone.
Also On Our Network
- ๐ The five-step config for live replies and a hard stop on endless streams
- ๐ What live replies and the new safety cap mean for a small business bot
- ๐ Five copy-paste prompts that set up live replies and a stream cap
- ๐ Which benchmarked AI models can live under the new stream cap
- ๐ The complete Hermes Agent Streaming guide on the AI Profit Boardroom blog
FAQ: Hermes Agent Streaming Verdict
What is the overall rating?
8.3 out of 10, an editorial rating from the docs and commits. Recovery and the breaker score highest; transport coverage and setup effort score lowest.
What is the biggest weakness?
The new lifetime cap only covers Chat Completions and Anthropic Messages streams. Codex/Responses and Bedrock streams are not capped.
Were there bugs in the first version of the cap?
Yes. Cap kills initially fed the stale breaker; follow-up commits on 1 November stopped that, removed the env var and fixed retry-backoff counting.
Is gateway streaming on by default?
No. streaming.enabled defaults to false, and Discord stays on whole messages until its per-platform toggle is switched on.
Should research agents use the cap?
No. The docs say to leave stream_max_lifetime at 0 for long reasoning turns that legitimately stream for a long time.
๐บ Video notes + links to the tools ๐
๐ฅ Learn how I make these videos ๐
๐ Get a FREE AI Course + Community + 1,000 AI Agents ๐
About Julian
I'm Julian Goldie, an SEO entrepreneur, author and founder of the AI Profit Boardroom, which has 3,400+ members.
I help business owners scale with AI agents, automation and SEO.
- I've built a 7-figure SEO and link building agency, Goldie Agency, with a team of 70+ SEO experts.
- I've grown a YouTube channel to 400,000+ subscribers.
- I wrote "Link Building Mastery".
- My Udemy courses have taught over 29,000 students.
โ Get my best AI training inside the AI Profit Boardroom
Read the scorecard, switch on the cap only where replies should end, and if you want my team to judge it against your setup, book a free strategy session about Hermes agent streaming.











