mirror of
https://github.com/vegu-ai/talemate.git
synced 2025-12-18 20:49:31 +01:00
172 lines
5.0 KiB
Markdown
172 lines
5.0 KiB
Markdown
|
|
# 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 include
|
||
|
|
- `scene` - 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 for
|
||
|
|
- `memory_goal` - Optional specific goal for memory retrieval
|
||
|
|
- `agent_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 scene
|
||
|
|
- `max_tokens` - Available token budget (from agent client)
|
||
|
|
- `character.sheet` - Full character attributes
|
||
|
|
- `character.filtered_sheet()` - Subset of character attributes
|
||
|
|
- `query_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 history
|
||
|
|
- `memory-context.jinja2` - Memory retrieval
|
||
|
|
- `character-context.jinja2` - Character listings
|
||
|
|
- `extra-context.jinja2` - Additional context like pins and reinforcements
|
||
|
|
- `scene-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.
|
||
|
|
|
||
|
|
!!! note "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":""}]}) }}
|
||
|
|
```
|