Skip to main content

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.