Template System
The template system uses Jinja 2 for dynamic parameter resolution using variables from step outputs and context.
Variable Syntax
Variables use double curly braces: {{variable_name}}
Example with use of payload, step ouput and loop builtin function:
{
"parameters": {
"message": "Hello {{payload.content.user.name}}!",
"data": "{{previous-step.output.result}}",
"count": "{{loop_index}}"
}
}
Pure Variable References vs String Interpolation
Important distinction:
- Pure variable reference:
"{{variable}}"- Returns the actual object (list, dict, etc.) - String interpolation:
"Text {{variable}}"- Returns a string representation
{
"parameters": {
"items": "{{step.output.files}}", // Returns actual list/array
"message": "Found {{step.output.count}} files" // Returns string
}
}
This is essential for actions like logic::loop that require actual arrays, not string representations.
Variable Sources
1. Step Outputs
Access outputs from previous steps, 'step-id' being the id of the step you want to retrieve output from :
{
"parameters": {
"context": "{{step-id.output.data}}",
"summary": "{{another-step-id.output.results.summary}}",
"score": "{{ai-agent-step-id.output.confidence_score}}"
}
}
2. Context Variables
Access workflow context and special variables, for example if you set a context:
{
{
"action": "builtin::context_set",
"parameters": {
"name": "task_objective",
"value": "Create a personalized email campaign for premium customers",
"session_id": "session_123",
"metadata": {
"category": "user_intent",
"priority": "high"
}
}
},
{
"action": "addon-id::action-name",
"parameters": {
"task_objective": "{{context.task_objective}}", // here you retrieve the context you set before.
}
},
}
Loop Variables
Available when executing within logic::loop actions:
{{loop_item}}- Current item being processed in the loop{{loop_index}}- Current iteration index (0-based)
{
"parameters": {
"current_data": "{{loop_item}}",
"position": "Processing item at index {{loop_index}}",
"item_info": "Item {{loop_index}}: {{loop_item}}"
}
}
4. Nested Object Access
Use dot notation to access nested properties:
{
"parameters": {
"user_name": "{{user.name}}",
"nested_payload": "{{payload.content.request.data.items[0].name}}"
}
}
Template Examples
Basic Variable Substitution
{
"id": "personalized-message",
"action": "builtin::log",
"parameters": {
"message": "Welcome {{user.name}}"
}
}
Data Transformation with builtin::transform
The builtin::transform action restructures data from previous steps, combining dynamic template variables with static values. It's perfect for creating summary objects, extracting specific fields, or preparing data for subsequent steps.
Basic Data Restructuring
{
"id": "transform-search-results",
"action": "builtin::transform",
"parameters": {
"rules": {
"total_results": "{{search-step.output.total}}",
"query_used": "{{search-step.output.query}}",
"status": "{{search-step.output.status}}",
"summary": "Found {{search-step.output.total}} results for query",
"metadata": {
"processed_at": "2024-01-01T00:00:00Z",
"workflow_id": "search-processor",
"success": true
}
}
}
}
Output: {"transformed": {...}} containing all the rules processed.