Template Pattern Cheat Sheet
Scene Context Inclusion
Include scene history with budget control:
{% set history = scene.context_history(budget=budget, min_dialogue=20, sections=False) %}
<|SECTION:SCENE|>
{% for scene_context in history -%}
{{ scene_context }}
{% endfor %}
<|CLOSE_SECTION|>
Variables explained:
budget
- Maximum token allocation for context (max_tokens
will be available and hold the total token budget)min_dialogue
- Minimum number of dialogue lines to includescene
- The current scene object (automatically available)
Reusable template: Include scene-context.jinja2
instead of writing this manually.
Memory Context Inclusion
Retrieve relevant memories based on context:
{% set memory_stack = agent_action("narrator", "rag_build", prompt=memory_prompt, sub_instruction=memory_goal) %}
{% if memory_stack %}
<|SECTION:POTENTIALLY RELEVANT INFORMATION|>
{%- for memory in memory_stack -%}
{{ memory|condensed }}
{% endfor -%}
<|CLOSE_SECTION|>
{% endif %}
Variables explained:
memory_prompt
- The text to search memories formemory_goal
- Optional specific goal for memory retrievalagent_action()
- Built-in function to call agent actions
Reusable template: Include memory-context.jinja2
for standard memory inclusion.
Character Context Inclusion
Include character information with conditional detail:
<|SECTION:CHARACTERS|>
{% for character in scene.characters %}
### {{ character.name }}
{% if max_tokens > 6000 -%}
{# we have lots of space so print the whole character sheet #}
{{ character.sheet }}
{% else -%}
{# we have limited space so print the bare minimum and then query memory for personality #}
{# bare minimum attributes that are guaranteed to be available #}
{{ character.filtered_sheet(['name', 'gender', 'age']) }}
{# query memory for personality #}
{{ query_memory("what is "+character.name+"'s personality?", as_question_answer=False) }}
{% endif %}
{{ character.description }}
{% endfor %}
<|CLOSE_SECTION|>
Variables explained:
scene.characters
- List of all characters in the scenemax_tokens
- Available token budget (from agent client)character.sheet
- Full character attributescharacter.filtered_sheet()
- Subset of character attributesquery_memory()
- Built-in function to query memory
Reusable template: Include character-context.jinja2
for standard character listing.
Including other templates
{% include "memory-context.jinja2" %}
{% with budget=budget %}{% include "scene-context.jinja2" %}{% endwith %}
The {% include %}
directive allows you to reuse existing templates. Common includes:
scene-context.jinja2
- Standard scene historymemory-context.jinja2
- Memory retrievalcharacter-context.jinja2
- Character listingsextra-context.jinja2
- Additional context like pins and reinforcementsscene-intent.jinja2
- Scene intention
Conditional sections based on token budget
{% if max_tokens > 6000 -%}
{{ detailed_content }}
{% else -%}
{{ condensed_content }}
{% endif %}
Response scaffolding
You can use the {{ bot_token }}
variable to separate the prompt and any response scaffolding you want to do.
Scaffolding?
Scaffolding is a technique where you provide the beginning of the response, and then let the agent continue.
This can be useful when you want to coerce the agent down a specific path or formatting.
<|SECTION:TASK|>
Analyze the current moment in the scene and then make a prediction about what will happen next.
Do your analysis first!
Provide your response in the following format:
ANALYSIS: .. your analysis ..
PREDICTION: .. your prediction ..
<|CLOSE_SECTION|>
{{ bot_token }}ANALYSIS:
Its important to note that with this approach, anything you put after the {{ bot_token }}
will be missing from the response. So in this example the ANALYSIS:
string will not be part of the response.
If you need it, you can instead use the set_prepared_response
function.
<|SECTION:TASK|>
Analyze the current moment in the scene and then make a prediction about what will happen next.
Do your analysis first!
Provide your response in the following format:
ANALYSIS: .. your analysis ..
PREDICTION: .. your prediction ..
<|CLOSE_SECTION|>
{{ set_prepared_response("ANALYSIS: ") }}
Response scaffolding for data structures
Scaffolding can be exceptionally helpful if you are prompting the agent to generate a data structure and nothing else, because you can simply coerce it to start with the data structure you want.
<|SECTION:TASK|>
Generate a list of objects in the scene, provide a name and description for each object.
```json
{
"objects": [
{
"name": "an old shelf",
"description": "a shelf that is old and has a few scratches on it"
},
{
"name": "a dirty carpet",
"description": "a carpet that is dirty and has a few stains on it"
}
]
}
```
<|CLOSE_SECTION|>
{{ set_data_response({"objects": [{"name":""}]}) }}