github emcie-co/parlant v4.0.5

44 minutes ago

[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 copy parlant widget init made. 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 an id on every frame and resume from
    it. A client that reconnects with Last-Event-ID picks 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 before wait_for_data expires. When a request
    carries both min_offset and Last-Event-ID, the later of the two wins: a
    reconnecting client usually still has the original min_offset in its URL,
    and honoring it would replay the session. The delay and the keep-alive
    interval can be set with PARLANT_SSE_RETRY_MS and
    PARLANT_SSE_HEARTBEAT_SECONDS; 0 disables the keep-alive, and 0 for the
    delay omits the retry: 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 existing GEMINI_API_KEY. Gemini reports no cost for it, so add a
    gemini-decision-1 entry to server.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. The gemini extra 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 init no 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 fresh parlant init if your agent echoes.

Fixed

  • On managed (Dashboard-hosted) servers, session.metadata.get(), .set()
    and .delete(), session.update() and server.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.labels already 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.

Don't miss a new parlant release

NewReleases is sending notifications on new releases.