v0.6.0¶
This release makes a turn observable and its cost negotiable. A shared
turn inspector now sits inside the editor Chat window, the Agent Log
records what your game actually put on the wire, and Dialog Lab runs one
scripted dialog across parameter variants so you can read the spread instead of
guessing from a single reply. Alongside that, your game gets direct control over
GPU pressure — a manual inference throttle you can drive from a frame loop
and a Background workload class for agents nobody is waiting on. Retrieval
gains hybrid BM25 + RRF search, and the model-free Branch node can
route a turn on a value the model produced moments earlier.
RetrieveParams gained fields mid-table and telemetry now defaults to off, so
existing integrations must be rebuilt and re-checked — see
Breaking changes and behavior changes
before upgrading.
Highlights¶
- Turn inspector in the Chat window. Select an assistant answer in the editor Chat and inspect the turn that produced it — route, per-node timing, parameters, prompt and output, retrieval hits, tool calls, raw JSON — instead of dumping
debug_infoto the console. The same panel is shared by Chat, Agent Log, and Dialog Lab. See Turn Inspector. - Agent Log. A per-agent narrative of what the client sent and what came back, in an editor window, with turn collapse, stream coalescing, pause/resume, capture-gap markers, and a raw view. Opening it turns diagnostics on for you. See Use the Agent Log.
- Dialog Lab. Run one scripted dialog across parameter variants and seeds against a fresh agent per variant, apply deterministic regex checks, read the spread in a summary or grid, and export the run as JSONL. See Compare dialog variants in the Lab.
- Hybrid retrieval (BM25 + RRF).
Retrievegainsretrieval_mode(Densedefault |Lexical|Hybrid) andrrf_k. Dense behavior is unchanged at the default, so an existing graph retrieves exactly as before until you opt in. See Embedded String Storage. - New
Branchnode. Model-free conditional routing — no inference, no wire emission — on a turn-local slot or an agent variable, withthen_exit/else_exit. The first node that can route on a value the model produced this turn. See Branch. - Manual inference throttle. Tell the server how hard to yield the GPU back to your game:
0= full speed,1= maximum yielding. Fire-and-forget, safe to call every frame, and it never changes what is generated — only how fast. See Wire Protocol. - Background agents. Mark world-logic and evaluator agents
Backgroundso their inference is the first to give way under pressure. See Agent Parameters. - Output artifact filtering. Opt in and stray speaker prefixes and roleplay markup spans are stripped out of streamed output before your UI, history, or TTS ever see them. See Filter LLM output artifacts.
Seeing inside a turn¶
- A shared, node-attributed inspector. One panel — hosted by the editor Chat window, the Agent Log, and Dialog Lab in both Unity and Unreal — presents every block of a turn attributed to the node that produced it: route taken, per-node timing and turn-relative timestamps, resolved parameters, prompt and output, retrieval hits, tool calls, and raw JSON. The reference page documents each block, when it appears, and what a missing block means. See Turn Inspector.
- Chat hosts it in a right-hand pane, visible by default and independently sized from the Lab and Agent Log. Click an assistant bubble to inspect that turn; selection follows the newest completed answer until you pick an older one. Turns with no visible text still get a selectable Cancelled / Error / No visible output row, so a failed turn is inspectable rather than gone. See Test an agent in the editor.
- Agent Log shows the client side of the conversation: sent, received, and system rows per agent, with the inspector changing shape to match the row you select. Stream chunks coalesce, turns collapse, and the log can be paused; when older events age out of the log a capture-gap marker says so rather than leaving a silent hole. Open it before creating agents to capture their whole life. See Use the Agent Log.
- Dialog Lab takes a scripted dialog, a set of parameter variants, and a seed list, and runs each combination against a fresh agent — then shows you the spread. Script-level regex checks turn "did it stay in character" into a deterministic pass/fail, runs export and re-import as JSONL, and an existing chat session can be sent straight into the Lab. See Compare dialog variants in the Lab.
- Diagnostics turn themselves on. Chat and Agent Log enable diagnostics for the agents they observe through a transient per-create override and a shared demand lease — without dirtying your scene or asset. The old per-component diagnostics authoring checkbox is retired; see Breaking changes.
Retrieval¶
- Lexical and hybrid search.
retrieval_modeselectsDense(default, unchanged),Lexical(BM25 only, no embedding call), orHybrid(both legs fused with Reciprocal Rank Fusion, tuned byrrf_k). Lexical matching earns its place on proper nouns, item codes, and exact phrases that embeddings blur. See Retrieve. - BM25 sidecars and tokenizer choice. A file-backed knowledge base persists its lexical index beside the vector index and reuses it until the records change. The KB config gains
bm25_fileandbm25_tokenizer(basicdefault, orenhanced, which drops a small English stopword set and applies a light suffix strip). Tokenization is Unicode-aware, and an older sidecar is rebuilt automatically on first load. See Embedded String Storage.
Routing and control flow¶
Branch— routing on what just happened. Seven tests:NonEmpty,IsTrue,Equals,EqualsIgnoreCase,Contains,Regex, andExpression(the filter grammar, for numeric and compound predicates). Itsvalueslist is the first mutable vector parameter on the wire, so match cases can be remapped at runtime with no agent recreation. The flagship use is a refusal fallback: a hidden classification pass, thenBranchon its verdict to a scripted reply. See Branch on a slot.- A
{"slot": …}operand in the filter grammar. The predicate grammar shared by retrieval andBranchnow reads turn-local slots as well as agent variables. Slot operands are string-typed and available wherever a slot view exists — today,Branch.condition; aRetrievefilter rejects them explicitly rather than failing quietly. See Filter grammar.
GPU pressure: throttle and workload¶
- One number, from your frame loop.
SetInferenceThrottle(level)(C++ / Unity / Unreal) andset_inference_throttle(level)(Python) report how hard the server should yield:0= full speed,1= maximum yielding. It carries no request id and gets no response, so there is nothing to await and no error path to handle. Opt-in and backward compatible: a session that never calls it is never throttled. - Where the budget is spent. Throttling never changes what is generated, only how fast, and the server spends the slack where it costs least — speech and buffered work slow down before visible streaming text does. Everything except
workloadis classified from the graph itself, per turn; you do not annotate it. workloadonCreateAgent.Interactive(default) orBackground. Mark world simulation, off-screen chatter, and evaluatorsBackgroundand they give way first. See Agent Parameters.- Per-class scheduler tuning.
server-config.jsongains anengines.llama_cpp.inference.schedulerblock withinteractive_visible,interactive_buffered, andbackgroundsub-blocks (prefill_quantum_tokens,contention_scaling,max_pause_ms). Defaults reproduce the previous behavior. See Server configuration.
Output shaping¶
output_filteronGenerateandGenerateAndSpeak. An opt-in, bounded cleanup pass over streamed model output — speaker prefixes (Guard:) and paired*…*/(…)/[…]roleplay spans — applied before variable substitution, the slot and history write, wire delivery, and TTS. All flags default off, so nothing changes until you enable one. Removals are reported in diagnostics. See Filter LLM output artifacts.
Diagnostics and telemetry¶
- Telemetry is now off by default. It must be enabled explicitly. See Telemetry.
- Richer, still content-free events.
agent.creatednow carries a content hash of the graph, the default model name,workload, and the KV-cache initialization mode. Turns record per-node timing, exit route, and turn-relative timestamps, plus an in-turn control-plane timeline (pause / resume, parameter changes, and variable updates during pause gaps — names only, never values). Slot text and tool-call argument blobs stay excluded unless you opt in. ToolCallreports the tools it offered. Turn diagnostics now include a flattened echo of the tool signatures the model actually saw, one line per tool plus a line per described parameter — so "why didn't it call my tool" is answerable from the inspector. See Tool Call.
Storage and packaging¶
- Project-relative storage folders in Unity.
StorageDataFolderaccepts a path relative to the project root (e.g.Assets/StreamingAssets/StorageData), which the client absolute-ifies in the editor and rewrites ontoApplication.streamingAssetsPathin a player build. One value works in both, with no runtime code of your own. Note the prefix match includes the trailing slash — keep a subfolder in the path, or it resolves next to the executable and breaks only in a shipped build. See Ship storage folders for builds.
New and expanded documentation¶
- Design an NPC prompt — measurement-backed recipes for a role-play
system_prompt: give the character one line of their own dialogue, never label your example lines, keep the rule list short, name what you are banning, control length with a length rule — plus what we tested and found no effect from, and how model choice changes the answer. - Build an immersion guard — a three-stage guard (pattern, general, world) that keeps out-of-character and out-of-world player lines away from the NPC, drops the rejected turn from history, and hides its own latency.
- TTS Models — the two shipped voices and the full family support matrix, including which families cannot be loaded and why. Check this before adding any voice.
- Docs for AI coding agents. Both plugins ship an
AGENTS.mdat their root carrying the graph/slot mental model and the ways Tryll differs from a cloud LLM SDK — attach it to Claude Code, Cursor, Copilot, or Codex before asking for Tryll code. Agents that fetch docs themselves can start fromllms.txton the docs site. - The site was restructured. The how-to guides are grouped into ten task areas with a collapsible sidebar to match, the reference splits into Client API (what your code calls) and Workflows and data (what you declare), concepts are ordered as a reading path, and release notes are now one page per version. The home page and Getting Started also state the real hardware requirements up front.
Breaking changes and behavior changes¶
RetrieveParamsgained fields mid-table — rebuild every client.retrieval_modeandrrf_kwere inserted before the existingsource/filter/ exit fields. FlatBuffers vtable slots are positional, so a client built against the v0.5.0 schema talking to a newer server (or the reverse) would decode subsequent fields into the wrong slots. Rebuild your integration against the new schema and upgrade both ends together; mismatched peers are rejected at connection time with5004 ProtocolVersionMismatch. See Wire Protocol and Retrieve.- Telemetry now defaults to off, not on. If you relied on the previous default being enabled, enable it explicitly. See Telemetry.
- The per-component diagnostics authoring checkbox is retired. Chat and the Agent Log now request diagnostics per-create through a transient override and a shared lease, so observing an agent no longer means editing — and dirtying — the component or asset. The runtime and wire fields are unchanged; remove any workflow that toggled the authored checkbox to get diagnostics.
- Inline graphs are deprecated.
TryllAgentComponent.InlineGraphDescriptionandInlineVariablesare temporary and will be removed in a future release. Author the graph as a Workflow Asset, declare its variables there, and assign it toWorkflowAsset; the Inspector now warns when no asset is assigned. Building aTryllGraphDescriptionin code and creating an agent from it directly — with no component — remains fully supported. See TryllAgentComponent. - Unity voice input now waits for the session.
TryllVoiceInputComponentpreviously created its handle on the raw TCP connect edge, before session creation completed, so the microphone silently failed to come up on first play. It now gates on session readiness and re-drives creation when the session completes, matching the agent component and Unreal. No API change; the failure just stops happening. - Unity Chat snapshots variable overrides at Start. Editing a component's variable overrides while a Chat agent is running does not reach that agent — press Stop then Start to pick up new values. Unreal differs deliberately: it keeps a transient preview link that applies edits live. See Test an agent in the editor.