[4.0.5] - 2026-11-12
Added
- Gemini 4 Hydrogen works through the Gemini provider, including streamed replies,
tool calls, saved conversation replay and token accounting. Select it as
gemini:gemini-4-hydrogen; existing default models are unchanged. - The chat widget shows Markdown tables in an agent's reply as tables. They
used to show as lines of pipes. Column alignment, inline Markdown in cells
and escaped pipes work. A streamed table appears once its header and divider
rows arrive and fills in cell by cell. A wide table scrolls sideways inside
the message, and your site's own table styles don't change it. Your project
keeps the copyparlant widget initmade. To pick this up, run
parlant widget init --force, which replaces that copy and any changes you
made to it. - Event streams (
sse=true) now carry anidon every frame and resume from
it. A client that reconnects withLast-Event-IDpicks up after the frame it
last saw, instead of replaying the session from the beginning. Streams ask a
reconnecting browser to wait three seconds (retry: 3000), and an idle
stream sends a keep-alive comment every 15 seconds, so a proxy no longer
closes a quiet connection beforewait_for_dataexpires. When a request
carries bothmin_offsetandLast-Event-ID, the later of the two wins: a
reconnecting client usually still has the originalmin_offsetin its URL,
and honoring it would replay the session. The delay and the keep-alive
interval can be set withPARLANT_SSE_RETRY_MSand
PARLANT_SSE_HEARTBEAT_SECONDS;0disables the keep-alive, and0for the
delay omits theretry:line. - Gemini serves Google's Gemini Decision 1 (
gemini-decision-1), which answers
many yes/no, choice and scale questions about one conversation in a single
request. A{"*": "gemini"}route now uses it for rule ranking at the
efforts that rank rules in one batch, as OpenAI and OpenRouter routes already
do with their decision models. Name it on a route with
"matching.rank[capability=decision]": "gemini:gemini-decision-1". It uses
your existingGEMINI_API_KEY. Gemini reports no cost for it, so add a
gemini-decision-1entry toserver.set_pricing(...)(Google lists $0.10 per
million input tokens and nothing for output) to have it priced.
Changed
- Gemini models count tokens on your server instead of asking the Gemini API,
which took about 300ms per count. A step after a tool call made two such
calls in a row while choosing canned responses, so replies after a tool call
now start about 0.4–0.6s sooner. Counts use the open Gemma 3 tokenizer and
are within a token or two of Google's. Thegeminiextra now installs
sentencepiece. The tokenizer downloads once from raw.githubusercontent.com,
in the background, on the first count. Until it's ready, or if your server
can't reach GitHub, Parlant counts with the API as before and logs one warning
saying so. - Agents no longer repeat what the customer just said back to them before
replying ("Lead generation for a logistics startup, so…"). A reaction now
responds to what the message means, and when the customer is answering the
agent's own question, the agent goes straight to its next step. The prompt no
longer bans stock acknowledgments such as "makes sense" by name. - Agents created by
parlant initno longer learn to repeat the visitor's words
back. The warm-host and upbeat personalities now react to what a message
means, and the warm host goes straight to its next step when the visitor is
answering its question. Existing projects keep their own text; copy the new
wording from a freshparlant initif your agent echoes.
Fixed
- On managed (Dashboard-hosted) servers,
session.metadata.get(),.set()
and.delete(),session.update()andserver.get_session()failed with
"Session not found" for live conversations, because they looked in the store
that holds startup declarations instead of the one that holds sessions. They
now use the same session store as the engine and the API, as
session.labelsalready did, so a retriever or tool that reads or writes
session metadata works the same hosted as it does locally. - Pricing checks no longer warn about unused provider-default models when a
more specific model route overrides them, such as Gemini embeddings on an
Anthropic server. Models still reachable through other routes, and models
actually observed in use, remain included in pricing coverage. - MCP tools that return structured results, such as a pydantic model, now give
the agent the result as plain JSON. Before, the call ran but the agent was
told "Tool call error", so it could retry a call that had already taken
effect or tell the customer it failed. - Gemini agents under concurrent load no longer queue behind each other while
a prompt cache is being created. Requests for other caches, and requests whose
cache already exists, go ahead at once; requests for the same cache still
share one creation, so it is created and its storage charged once. - Servers with MongoDB stores start faster as session and event history grows.
When a store's recorded version already matches the running one, startup no
longer reads every document back through its loader. When a migration is
needed, documents are loaded and migrated as before.