Skip to content

v0.4.0

This release builds on v0.3.0 with new session setup — a mandatory CreateSession call that replaces ConfigureSessionmid-turn control (cancel a running turn, or pause and resume it between nodes), more reliable tool calling driven by each model's own chat template, and a broader voice output stack with per-agent synthesis language and zero-shot voice cloning.

Some client APIs were renamed, a couple of node parameters changed, auto model downloading was removed, and the wire protocol changed — so existing integrations must be updated and rebuilt. See Breaking changes and behavior changes before upgrading.

Highlights

  • CreateSession replaces ConfigureSession — session setup is now a single mandatory call made right after connecting. See Agents and Sessions and Connect and Manage a Session.
  • Pause and resume a turn — suspend a turn between nodes, react to a tool call or mutate parameters, then continue the same turn. See Pause and resume a turn.
  • Cancel a turn — stop an in-flight turn cleanly, keeping or discarding the partial reply. See Cancelling a turn.
  • Simpler, more reliable tool calling — tool support now comes from the model's own chat template, so there is no tool_call_format to pick. See Tool Calling.
  • Voice cloning & multilingual TTS — clone a voice from a short reference clip (Pocket TTS) and pick a synthesis language per agent (Supertonic 3, 31 languages). See Clone a voice from an audio sample.
  • Editor model guard — the Unity/Unreal editors verify every registered model is downloaded before Play/PIE, instead of failing cryptically at agent creation. See Verify required models before Play.

Session setup: CreateSession replaces ConfigureSession

Setting up a session is now a single, explicit step:

  • ConfigureSession is renamed CreateSession and is now mandatory and one-shot — call it exactly once, right after connecting, before any agent, model, storage, or voice request. It returns the server-allocated session_id.
  • Engines are fixed for the session's lifetime. To run with a different inference engine, open a new connection and create a new session.
  • Requests are ordered. A request before CreateSession is rejected with 2002 SessionNotReady; a second CreateSession with 2003 SessionAlreadyExists. Model-management calls (ListModels / LoadModel / UnloadModel / DownloadModel) now require CreateSession first too.

Client APIs were renamed to match across every platform (CreateSession / create_session / OnCreateSessionComplete; Unreal's auto-configure setting is now bAutoCreateSession). This is a breaking wire-protocol change, so update your integration and rebuild against the new schema. See Agents and Sessions and Connect and Manage a Session.

Turn control: cancel, pause, and resume

  • Cooperative turn cancellation. Send CancelRequest to stop an in-flight turn at a safe boundary — between graph nodes, at a token boundary, or after the current TTS audio chunk. StopAndKeep keeps the partial reply in history (what a chat "Stop" button uses); StopAndDiscard drops the whole interaction as if it never happened. The turn ends with TurnStatus = Cancelled. Exposed on every client (Unity / Unreal / C++ / Python). See Cancelling a turn.
  • Pause and resume between nodes. A new Pause node (a no-op checkpoint) and the ToolCall pause_after_tool_call param (superseded by disposition in v0.5.0) suspend a turn between nodes. While parked, ChangeAgentParam — normally rejected mid-turn — is allowed, so you can inspect a tool call and mutate a downstream node before continuing the same turn (no new SendMessage). Resume plainly via the wired exit, or pass a resume_node to jump. See Pause and resume a turn.

Simpler, more reliable tool calling

  • No more format dialects. Tool definitions are now rendered — and calls parsed — using each model's own chat template, the exact syntax it was trained on, so tool calls are more reliable out of the box. You no longer pick a dialect: the tool_call_format param is deprecated and ignored. See Tool Calling.
  • New mode param replaces generate_on_no_tool. A single three-way choice: call_or_answer (default — emit the residual text as a normal answer when no tool is called), detect_only (route no_tool_called with no text), and require_call (force a tool call every turn). mode is mutable, so a node can flip between forcing a call and free chat without a rebuild. See Forcing a tool call.
  • Parallel tool calls. The new parallel_tool_calls param allows more than one call per turn where the model supports it (verified on Qwen and Granite) — so "open all the doors" can produce one call per door.
  • Prior tool calls stay in context. A turn's tool calls now carry forward into the next turn's prompt as a complete call/result pair (or are omitted together) — fixing small models that used to re-issue the same command or drift off task. See Tool-call history: complete pairs, never dangling.
  • Clear error on unsupported models. Agent creation now fails up front when a model can't do tool calling, naming the model and how to fix it — instead of silently detecting no tool every turn. See Not every model can call tools.

Voice output: languages, voices, and cloning

  • Voice cloning (Pocket TTS). Point a GenerateAndSpeak / Speak node's new tts_voice param at a short reference WAV (a path relative to the session storage root) and the agent speaks in that voice — no training or preprocessing step, and one loaded model serves many distinct voices concurrently. See Clone a voice from an audio sample.
  • Per-agent synthesis language. The new tts_lang param selects the language on multilingual models (Supertonic 3 covers 31). Both tts_lang and tts_voice are runtime-mutable, so a settings-menu language or voice switch is just a parameter change.
  • eSpeak-free Sherpa-ONNX. Tryll now builds against an eSpeak-free Sherpa-ONNX; Kokoro and VITS were removed. The supported TTS families are Supertonic and Pocket TTS — eSpeak-dependent families (Piper/VITS, Kokoro, KittenTTS, ZipVoice) fail to load with an error explaining this.
  • speaker_id is validated. An out-of-range voice index now fails agent creation with a message stating the model's valid range (Supertonic 3: 09; Pocket TTS is single-speaker and must stay 0 — pick its voice with tts_voice).
  • Prompt-for-voice guidance. Add voice output to an agent now covers writing speakable prompts (no markdown, stage directions, or lists), which especially matters for models like Pocket TTS.

Agents, models & inference

  • Stateless agents. A new maintain_dialogue_history flag on CreateAgent (default true). Set it false and the agent's history is cleared after each turn — useful for classification, routing, or tool-picking agents that gain nothing from prior turns and should not pay to store or project them. See Agent Parameters.
  • Per-node context size. A new context_size param on Generate, GenerateAndSpeak, ToolCall, and ClassifyIntentLLM overrides the KV-cache / context window per node (validated against the model's trained maximum), instead of every node using the model default. See Generate.
  • chat_template_file model override. A models.json variant can now point at a Jinja chat-template file that replaces the GGUF's embedded template — the fix for a model that supports tool calling but whose GGUF conversion doesn't render it. See Model Management.
  • Editor model guard. Both editors verify every registered (Production / Experimental) model is downloaded before Play/PIE or the Chat window creates an agent, blocking behind a cancelable progress dialog if not; the Model Manager offers a Yes/No prompt instead of auto-downloading. Silero VAD is now manageable from the Model Manager. See Verify required models before Play.

Breaking changes and behavior changes

  • Session setup changed (breaking wire-protocol change). ConfigureSession is renamed CreateSession and is now mandatory and one-shot, with engines fixed per session — see Session setup above. Update your integration and rebuild against the new schema.
  • Auto model downloading removed. The allow_auto_model_downloading session flag, its SessionConfig / TryllRuntimeSettings fields on every client, and the server-side download-then-build fallback in CreateAgent, CreateEmbeddedStringStorage, and CreateVoiceInput are gone. All three now fail fast (GraphCompilationFailed, ModelResolutionFailed, or SttModelLoadFailed) when a referenced model is not already on disk — acquire models explicitly beforehand via the editor Model Manager or DownloadModelRequest.
  • tool_call_format deprecated and ignored. Tool prompting and parsing are driven by the model's chat template; the param is kept for wire/config compatibility but has no effect. Use a model whose template supports tool calling, or a chat_template_file override.
  • generate_on_no_tool replaced by mode. Rewrite generate_on_no_tool=false as mode=detect_only and generate_on_no_tool=true as mode=call_or_answer. See Define and handle tool calls.
  • speaker_id range is now enforced. A value the TTS model can't satisfy fails agent creation instead of being silently accepted.
  • Unreal bAutoConfigureSession renamed bAutoCreateSession, and ConfigureSessionFromSettings()CreateSessionFromSettings().

New error codes

  • 2003 SessionAlreadyExists — a second CreateSessionRequest on a connection that already has a session (CreateSession is one-shot).
  • 3012 AgentNotPausedResume was called but the agent is idle or actively running, not paused.

Retired: 6006 ModelAutoDownloadFailed is retired along with auto model downloading and will not be reused; a missing model referenced by CreateAgent / CreateEmbeddedStringStorage / CreateVoiceInput now surfaces as GraphCompilationFailed (3003), ModelResolutionFailed (6005), or SttModelLoadFailed (4100) instead.

See Error Codes for the full list.