order | route |
---|---|
character-10 |
/usage/core-concepts/characterdesign |
Used to add the character description and the rest that the AI should know. This will always be present in the prompt, so all the important facts should be included here.
For example, you can add information about the world in which the action takes place and describe the characteristics of the character you are playing for.
It could be of any length (be it 200 or 2000 tokens) and formatted in any style (free text, W++, conversation style, etc).
Methods of character formatting is a complicated topic beyond the scope of this documentation page.
Recommended guides that were tested with or rely on SillyTavern's features:
- Trappu's PLists + Ali:Chat guide: https://wikia.schneedc.com/bot-creation/trappu/creation
- AliCat's Ali:Chat guide: https://rentry.co/alichat
- kingbri's minimalistic guide: https://rentry.co/kingbri-chara-guide
TL;DR: If you're working with an AI model with a 2048 context token limit, your 1000 token character definition is cutting the AI's 'memory' in half.
To put this in perspective, a decent response from a good AI can easily be around 200-300 tokens. In this case, the AI would only be able to 'remember' about 3 exchanges worth of chat history.
When we see your character has over half of the model-defined context length of tokens in its definitions, we highlight it for you because this can lower the AI's capabilities to provide an enjoyable conversation.
Don't worry - it won't break anything. At worst, if the Character's permanent tokens are too large, it simply means there will be less room left in the context for other things (see below).
The only negative side effect this can have is the AI will have less 'memory', as it will have less chat history available to process.
This is because every AI model has a limit to the amount of context it can process at one time.
This is the information that gets sent to the AI each time you ask it to generate a response:
- Character definitions
- Chat history
- Author's Notes
- Special Format strings
- [bracket commands]
SillyTavern automatically calculates the best way to allocate the available context tokens before sending the information to the AI model.
These will always be sent to the AI with every generation request:
- Character Name (keep the name short! Sent at the start of EVERY Character message)
- Character Description Box
- Character Personality Box
- Scenario Box
- The first message box - only sent once at the start of the chat.
- Example messages box - only kept until chat history fills up the context (optionally these can be forced to be kept in context)
- LLaMA 3 and its finetunes - 8192
- OpenAI GPT-4 - up to 128k
- Anthropic's Claude - 200k (Claude 3) or 100k (Claude 2)
- NovelAI - 8192 (Erato and Kayra, Opus tier; Clio, all tiers), 6144 (Kayra, Scroll tier), or 3072 (Kayra, Tablet tier)
A brief description of the personality.
Examples:
Cheerful, cunning, provocative
Aqua likes to do nothing and also likes to get drunk
The First Message is an important thing that sets exactly how and in what style the character will communicate.
The character's first message should be long so that later it would be less likely that the character would respond with very short messages.
You can also use asterisks ** to describe the character's actions.
For example:
*I noticed you came inside, I walked up and stood right in front of you* Welcome. I'm glad to see you here. *I said with a toothy smug sunny smile looking you straight in the eye* What brings you...
Describes how the character speaks. Before each example, you need to add the <START> tag. The blocks of examples dialogue are only inserted if there's a free space in the context for them and pushed out of context block by block. <START> will not be present in the prompt as it is just a marker - it will be instead replaced with "Example Separator" from Advanced Formatting for Text Completion APIs and contents of the "New Example Chat" utility prompt for Chat Completion APIs.
- Use {{char}} instead of the character name.
- Use {{user}} instead of the user name.
Example:
<START>
{{user}}: Hi Aqua, I heard you like to spend time in the pub.
{{char}}: *excitedly* Oh my goodness, yes! I just love spending time at the pub! It's so much fun to talk to all the adventurers and hear about their exciting adventures! And you are?
{{user}}: I'm new here and I wanted to ask for your advice.
{{char}}: *giggles* Oh, advice! I love giving advice! And in gratitude for that, treat me to a drink! gives signals to the bartender
<START>
{{user}}: Hello
{{char}}: *excitedly* Hello there, dear! Are you new to Axel? Don't worry, I, Aqua the goddess of water, am here to help you! Do you need any assistance? And may I say, I look simply radiant today! *strikes a pose and looks at you with puppy eyes*
Circumstances and context of the dialogue.
Mark the character as a favorite to quickly filter on the side menu bar by selecting the "Favorites" sort option. Favorite characters have a golden highlight in the list. This will also make the character portrait appear in the hotswaps area (if enabled in User Settings).
This list may be incomplete or outdated. Use the /help macros
slash command in any SillyTavern chat to get the list of macros that work in your instance.
Note: some extensions may also add special context-specific macros that only work in certain places. These will not be documented here.
A list of macros that are replaced when sending a prompt to generate:
- {{pipe}} => only for slash command batching. Replaced with the returned result of the previous command.
- {{newline}} => just inserts a newline.
- {{trim}} => trims newlines surrounding this macro.
- {{noop}} => no operation, just an empty string.
- {{user}} and <USER> => User's Name.
- {{charPrompt}} => Character's Main Prompt override
- {{charJailbreak}} => Character's Post-History Instructions Prompt override
- {{char}} and <BOT> => Character's Name.
- {{description}} => Character's Description.
- {{scenario}} => Character's Scenario or chat scenario override (if set).
- {{personality}} => Character's Personality.
- {{persona}} => User's Persona description.
- {{mesExamples}} => Character's Examples of Dialogue (unaltered and unsplit).
- {{char_version}} => the Character's version number.
- {{model}} => a text generation model name for the currently selected API. Can be inaccurate!
- {{lastMessageId}} => last chat message ID.
- {{lastMessage}} => last chat message text.
- {{firstIncludedMessageId}} => the ID of the first message included in the context. Requires generation to be run at least once in the current session.
- {{lastCharMessage}} => last chat message sent by character.
- {{lastUserMessage}} => last chat message sent by user.
- {{currentSwipeId}} => 1-based ID of the currently displayed last message swipe.
- {{lastSwipeId}} => number of swipes in the last chat message.
- {{original}} can be used in Prompt Overrides fields (Main Prompt and Post-History Instructions) to include the respective default prompt from the system settings. Applied to Chat Completion APIs and Instruct mode only.
- {{time}} => current system time.
- {{time_UTC±X}} => current time in the specified UTC offset (timezone), e.g. for UTC+02:00 use {{time_UTC+2}}.
- {{timeDiff::(time1)::(time2)}} => the time difference between time1 and time2. Accepts time and date macros.
- {{date}} => current system date.
- {{input}} => contents of the user input bar.
- {{weekday}} => the current weekday
- {{isotime}} => the current ISO time (24-hour clock)
- {{isodate}} => the current ISO date (YYYY-MM-DD)
- {{idle_duration}} inserts a humanized string of the time range since the last user message was sent (examples: 4 hours, 1 day).
- {{random:(args)}} returns a random item from the list. (e.g. {{random:1,2,3,4}} will return 1 of the 4 numbers at random). Works with text lists too.
- {{random::arg1::arg2}} => alternate syntax for random that supports commas in its arguments.
- {{pick::(args)}} => alternative to random, but the selected argument is stable on subsequent evaluations in the current chat if the source string remains unchanged.
- {{roll:(formula)}} generates a random value and returns it using the provided dice formula using D&D dice syntax: XdY+Z. For example, {{roll:d6}} will generate a random value in the 1-6 range (standard six-sided dice).
- {{bias "text here"}} sets a behavioral bias for the AI until the next user input. Quotes around the text are important.
- {{// (note)}} allows to leave a note that will be replaced with blank content. Not visible for the AI.
- {{banned "text here"}} dynamically add text in the quotes to banned word sequences, if Text Generation WebUI backend is used. Does nothing for other backends. Can be used anywhere (Character description, WI, AN, etc.) Quotes around the text are important.
(enabled in the Advanced Formatting settings)
- {{exampleSeparator}} – context template example dialogues separator
- {{chatStart}} – context template chat start line
- {{instructSystemPrompt}} – instruct system prompt
- {{instructSystemPromptPrefix}} – system prompt prefix sequence
- {{instructSystemPromptSuffix}} – system prompt suffix sequence
- {{instructUserPrefix}} – user message prefix sequence
- {{instructAssistantPrefix}} – assistant message prefix sequence
- {{instructSystemPrefix}} – system message prefix sequence
- {{instructUserSuffix}} – user message suffix sequence
- {{instructAssistantSuffix}} – assistant message suffix sequence
- {{instructSystemSuffix}} – system message suffix sequence
- {{instructFirstAssistantPrefix}} – assistant first output sequence
- {{instructLastAssistantPrefix}} – assistant last output sequence
- {{instructSystemInstructionPrefix}} – system instruction prefix sequence
- {{instructUserFiller}} – user filler message text
- {{instructStop}} – instruct stop sequence
- {{maxPrompt}} - max size of the prompt in tokens (context length reduced by response length)
- Local variables = unique to the current chat
- Global variables = works in any chat for any character
- {{getvar::name}} – replaced with the value of the local variable "name"
- {{setvar::name::value}} – replaced with empty string, sets the local variable "name" to "value"
- {{addvar::name::increment}} – replaced with empty strings, adds a numeric value of "increment" to the local variable "name"
- {{incvar::name}} – replaced with the result of the increment of value of the variable "name" by 1
- {{decvar::name}} – replaced with the result of the decrement of value of the variable "name" by 1
- {{getglobalvar::name}} – replaced with the value of the global variable "name"
- {{setglobalvar::name::value}} – replaced with empty string, sets the global variable "name" to "value"
- {{addglobalvar::name::value}} – replaced with empty string, adds a numeric value of "increment" to the global variable "name"
- {{incglobalvar::name}} – replaced with the result of the increment of value of the global variable "name" by 1
- {{decglobalvar::name}} – replaced with the result of the decrement of value of the global variable "name" by 1