Skip to content

Character Card V2/V3 and Troupe

This guide is informative. It maps Character Card V2 and V3 cards to Troupe and back, for importers and exporters. Troupe Format is normative.

Each card becomes a bundle with one character and a scenario main that holds its openings.

Source Troupe
name, nickname name (the nickname if set), the other in aliases
description, personality description, with personality under ## Personality
first_mes, alternate_greetings The scenario’s openings greeting_1, greeting_2, …
scenario The scenario’s premise
group_only_greetings Openings of a scenario whose cast includes the group
mes_example examples, split at <START> and parsed by speaker
system_prompt An entry with position: "system" and knownBy: ["<id>"]; {{original}} is dropped
post_history_instructions An entry with position: 0 and knownBy: ["<id>"]
extensions.depth_prompt An entry at its depth with knownBy: ["<id>"]; the role is dropped
extensions.talkativeness ext
creator_notes, tags, creator, character_version The scenario’s briefing; the bundle’s tags, authors, version
source Links in credits
assets icon / background avatar / a location image; other assets in ext
Lorebook entries Character entries, or a world named after the book
keys, constant, enabled keys, no keys, disabled
SillyTavern regex keys /p/flags /(?flags)p/, keeping only the flags i, m and s, and with (?-i) when i is absent
case_sensitive, match_whole_words: false Regex keys /(?-i)…/, /…/
secondary_keys AND ANY / NOT ANY / AND ALL / NOT ALL, @@additional_keys, @@exclude_keys when with hit(): hit('a') || hit('b'), !hit('a') && !hit('b'), hit('a') && hit('b'), !(hit('a') && hit('b'))
insertion_order the entry’s place in entries
priority (V2), importance priority, rescaled to 0–100
Position before/after character, @D depth, @@depth "context", a number
scan_depth, @@scan_depth scanDepth
probability chance = probability ÷ 100
group, groupWeight, groupOverride group, weight, a higher priority
vectorized pull, with title from the entry’s comment or first key
sticky, cooldown, delay (in messages) sticky, cooldown in rounds (about half), when: "turn >= N"
@@activate_only_after N, @@activate_only_every N when: "turn >= N", when: "turn % N == 0"
@@is_greeting N (0 is first_mes) when: "opening == 'greeting_<N+1>'"
@@ignore_on_max_context priority: 0
{{char}}, {{user}}, {{// …}} the same
<bot>, <user> {{char}}, {{user}}
{{pick::…}}, {{random::…}} {{pick::…}}
Recursion, other macros, decorators, regex scripts Not mapped; the source is kept in ext. To replace recursion, add to an entry the keys of the entries whose text mentions it.
SillyTavern chat JSONL A session: is_user lines become player messages, the character whose name matches name becomes speaker, swipes become siblings

A bundle’s first character exports with a lossy mapping: name, description, the openings with content of the first scenario whose cast includes it as first_mes and alternate_greetings, its premise as scenario, authors as creator, examples as mes_example, entries without when as a character_book (keys, constant, position and depth), and the original bundle, exactly as it was, under extensions.troupe.

License