- **Help Agent** — A new agent that answers questions about Talemate itself — settings, agents, clients, the world editor — grounded in the bundled documentation, and able to change agent and application settings on request. - **Timeline Rollback** — Scrub a slider across a scene's automatic version history, preview the message history at any revision, then roll the scene back in place or fork the revision into a new save. - **Pi Bridge Client** — A new client type that drives generations through the pi coding agent's headless RPC mode, making any model pi can reach usable in Talemate. - **Application Settings** — Settings move out of their modal into an always-available Settings tab, with a single topic-grouped sidebar, a settings search, all API keys on one page, and unsaved-change tracking. - **Scene Library** — The home screen is rebuilt as a full-page landing view with a file-tree scene library, cover thumbnails and per-save metadata, scene and save deletion, and a drag-and-drop import dropzone. - **Fast Character Creation** — Generate a character in a single request instead of one prompt per aspect, with a Consolidate multi-select, a token budget, and a Fill in misses pass. Off by default. - **Scene Backdrop** — Set any scene illustration as a backdrop filling the scene view behind the messages, saved with the scene, with configurable text legibility and an Immersive quick-toggle. - **Scene Visual Manager** — World Editor → Scene gains a Visuals tab to browse, upload, generate and delete the scene's backgrounds and illustrations, and set the cover image and backdrop. - **Visual Prompt Finalization** — Post-processing actions — match and replace, or a free-form AI instruction — rewrite image prompts right before they reach the image backend, with per-scene and per-character overrides and reusable template sets. - fixes #271 - fixes #275 Plus 25 improvements and 39 bug fixes — see [CHANGELOG.md](https://github.com/vegu-ai/talemate/blob/prep-0.39.0/CHANGELOG.md#0390) for the full list.
11 KiB
Dict And List Nodes
Build and manipulate dictionaries and lists. The Dict Collector and List Collector aggregate any number of inputs through dynamic sockets — see Collector Nodes for how key inference works with Make Key-Value Pair.
14 nodes.
| Node | Registry path |
|---|---|
| Combine Lists | data/CombineLists |
| Dict Collector | data/DictCollector |
| Dict Get | data/DictGet |
| Dict Get (Path) | data/DictGetPath |
| Dict To Key-Value Pairs | data/DictKeyValuePairs |
| Dict Pop | data/DictPop |
| Dict Set | data/DictSet |
| Dict Update | data/DictUpdate |
| List Append | data/ListAppend |
| List Collector | data/ListCollector |
| List Remove | data/ListRemove |
| Make Dict | data/MakeDict |
| Make Key-Value Pair | data/MakeKeyValuePair |
| Make List | data/MakeList |
Combine Lists
data/CombineLists
Combines multiple lists into a single list
Each connected dynamic input must be a list; their items are appended to the result in socket order.
Inputs
| Input | Type | Description |
|---|---|---|
list |
list |
(optional) Base list to extend (optional - a new list is created if not provided) |
This node supports dynamic inputs - additional input sockets can be added in the editor as needed, and connected values are collected with key inference (see Collector Nodes).
Outputs
| Output | Type | Description |
|---|---|---|
list |
list |
The combined list |
Properties
| Property | Type | Default | Description |
|---|---|---|---|
create_copy |
bool |
True |
Create a copy of the list |
Dict Collector
data/DictCollector
Collects key-value pairs into a dictionary with dynamic inputs. New item sockets appear as connections are made.
For each connected item the key is inferred: if the value is a
(key, value) tuple (e.g., from Make Key-Value Pair) that key is used;
otherwise the key is derived from the source socket - for sockets named
value, the source node's name, key or attribute input is used,
falling back to the source socket name.
Inputs
| Input | Type | Description |
|---|---|---|
dict |
dict |
(optional) Base dictionary to collect into (optional - a new dictionary is created if not provided) |
This node supports dynamic inputs - additional input sockets can be added in the editor as needed, and connected values are collected with key inference (see Collector Nodes).
Outputs
| Output | Type | Description |
|---|---|---|
dict |
dict |
The collected dictionary |
Dict Get
data/DictGet
Retrieves a value from a dictionary
Inputs
| Input | Type | Description |
|---|---|---|
dict |
dict |
Dictionary |
key |
str |
Key |
Outputs
| Output | Type | Description |
|---|---|---|
value |
any |
The value for the key, or None if the key is not present |
key |
str |
The key input, passed through |
Properties
| Property | Type | Default | Description |
|---|---|---|---|
key |
str |
unset |
Key |
Dict Get (Path)
data/DictGetPath
Retrieves a value from a nested dict (or list-of-dicts) using a dotted path.
Supports:
- Nested dict keys: "modes.generate_arc.close_arc"
- List indices: "items.0.name"
- Missing paths return the
defaultinput (or None if unset) - Any non-traversable segment short-circuits to
default
Downstream DynamicSocketNodeBase collectors (DictCollector, UpdateObject)
auto-infer the collector key from the last segment of path via the
key property set during run(). E.g. modes.generate_arc.close_arc
yields a collector key of close_arc.
Inputs
| Input | Type | Description |
|---|---|---|
dict |
dict |
Dictionary (or any traversable structure) |
path |
str |
(optional) Dotted path string |
default |
any |
Fallback value when the path does not fully resolve (optional) |
Outputs
| Output | Type | Description |
|---|---|---|
value |
any |
The resolved value, or default if the path does not resolve |
found |
bool |
True if the full path was resolved, False if default was used |
path |
str |
The path that was attempted (echoed for graph readability) |
Properties
| Property | Type | Default | Description |
|---|---|---|---|
path |
str |
"" |
Dotted path to the value (e.g. 'modes.generate_arc.close_arc') |
Dict To Key-Value Pairs
data/DictKeyValuePairs
Creates a list of key-value pairs from a dictionary
Inputs
| Input | Type | Description |
|---|---|---|
dict |
dict |
Dictionary to convert |
Outputs
| Output | Type | Description |
|---|---|---|
dict |
dict |
The dict input, passed through |
kvs |
list |
List of (key, value) tuples |
Dict Pop
data/DictPop
Pops a value from a dictionary
Inputs
| Input | Type | Description |
|---|---|---|
dict |
dict |
Dictionary |
key |
str |
Key |
Outputs
| Output | Type | Description |
|---|---|---|
dict |
dict |
The dictionary with the key removed |
value |
any |
The popped value, or None if the key was not present |
key |
str |
The key input, passed through |
Properties
| Property | Type | Default | Description |
|---|---|---|---|
key |
str |
unset |
Key |
Dict Set
data/DictSet
Set a value in a dictionary
Inputs
| Input | Type | Description |
|---|---|---|
dict |
dict |
(optional) Dictionary - if not provided, a new dictionary will be created |
key |
str |
(optional) Key |
value |
any |
Value |
Outputs
| Output | Type | Description |
|---|---|---|
dict |
dict |
Dictionary |
key |
str |
Key |
value |
any |
Value |
Properties
| Property | Type | Default | Description |
|---|---|---|---|
key |
str |
unset |
Key |
Dict Update
data/DictUpdate
Updates a dictionary from a list of other dictionaries
Each dictionary in the list is applied in order. By default this is a shallow dict.update(); enable merge to deep-merge nested dictionaries instead of replacing them. By default the target dictionary is modified in place; enable create_copy to leave the input untouched.
Inputs
| Input | Type | Description |
|---|---|---|
state |
any |
The graph state |
dict |
dict |
The target dictionary to update |
dicts |
list |
List of dictionaries to apply to the target |
Outputs
| Output | Type | Description |
|---|---|---|
state |
any |
The state input, passed through |
dict |
dict |
The updated dictionary |
dicts |
list |
The dicts input, passed through |
Properties
| Property | Type | Default | Description |
|---|---|---|---|
create_copy |
bool |
False |
Create a copy of the dictionary |
merge |
bool |
False |
Perform a deep merge |
List Append
data/ListAppend
Appends an item to a list
Inputs
| Input | Type | Description |
|---|---|---|
list |
list |
(optional) List to append to (optional - a new list is created if not provided) |
item |
any |
Item to append |
Outputs
| Output | Type | Description |
|---|---|---|
list |
list |
The list with the item appended |
item |
any |
The item input, passed through |
List Collector
data/ListCollector
Collects items into a list with dynamic inputs. New item sockets appear as connections are made, and each connected value is appended to the list in socket order.
Inputs
| Input | Type | Description |
|---|---|---|
list |
list |
(optional) Base list to append to (optional - a new list is created if not provided) |
This node supports dynamic inputs - additional input sockets can be added in the editor as needed, and connected values are collected with key inference (see Collector Nodes).
Outputs
| Output | Type | Description |
|---|---|---|
list |
list |
The collected list |
List Remove
data/ListRemove
Removes an item from a list
Inputs
| Input | Type | Description |
|---|---|---|
list |
list |
List |
item |
any |
Item |
Outputs
| Output | Type | Description |
|---|---|---|
list |
list |
List |
item |
any |
Item |
removed |
bool |
True if item was removed, False if not |
Make Dict
data/MakeDict
Creates a new dictionary, optionally initialized from the data property
The data property is deep-copied on every execution, so downstream mutation of the dictionary does not alter the property.
Inputs
| Input | Type | Description |
|---|---|---|
state |
any |
(optional) Graph state |
Outputs
| Output | Type | Description |
|---|---|---|
state |
any |
The state input, passed through |
dict |
dict |
The new dictionary |
Properties
| Property | Type | Default | Description |
|---|---|---|---|
data |
dict |
{} |
Data |
Make Key-Value Pair
data/MakeKeyValuePair
Creates a key-value pair tuple from separate key and value inputs. Outputs a tuple (key, value) that can be connected to DictCollector.
Inputs
| Input | Type | Description |
|---|---|---|
key |
str |
The key (optional) |
value |
any |
The value (optional) |
Outputs
| Output | Type | Description |
|---|---|---|
kv |
key/value |
The (key, value) tuple |
key |
str |
The key input, passed through |
value |
any |
The value input, passed through |
Properties
| Property | Type | Default | Description |
|---|---|---|---|
key |
str |
"" |
Key |
value |
any |
"" |
Value |
Make List
data/MakeList
Creates a new list, optionally initialized from the items property
The items property is deep-copied on every execution, so downstream mutation of the list does not alter the property.
Inputs
| Input | Type | Description |
|---|---|---|
state |
any |
(optional) Graph state |
item_type |
str |
Declared type of the items in the list (optional) |
Outputs
| Output | Type | Description |
|---|---|---|
state |
any |
The state input, passed through |
list |
list |
The new list |
Properties
| Property | Type | Default | Description |
|---|---|---|---|
item_type |
str |
"any" |
Type of items in the list. Choices are generated at runtime. |
items |
list |
[] |
Initial items in the list |