Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.maadify.com/llms.txt

Use this file to discover all available pages before exploring further.

Add a tool execution

1

Add the tool action

In the parent agent flow, select Execute tool and choose a tool.
Action picker showing the Execute tool option with a tool selected
2

Configure inputs

Use schema fields or a custom JSON payload to build inputs.
Execute tool payload editor showing the schema fields and custom JSON toggle
3

Test execution

Run a test execution to confirm inputs and outputs. Run this in chat to verify inputs and outputs.

Execute tool configuration

When you add an execute tool action, you can control how inputs are built and how the tool runs.
  • Payload type: schema-driven fields or a custom JSON payload.
  • Access level: full access or restricted access based on tool defaults. Use will always default with the default tool configurations set on the tool.
  • Async execution: run the tool in the background, it will use a fire and forget approach.
  • Context memory: store outputs into memory for agents to access, later or for context management.
  • Schema validation: surface errors when filling out the payload.
Use schema payloads when you want guardrails. Use custom JSON for advanced mappings.
Variable picker grouped by Tools, Runtime inputs, Structured outputs, and Memory context
Context variable memory configuration
Execute tool configuration panel showing payload type, access level, async execution, context memory, and schema validation settings

Variable templating for tool inputs

Custom payloads and schema values support Jinja-style templating. This lets you map outputs from earlier steps into tool inputs.

What context variables are available

You can reference:
  • Tool outputs by tool name and field path.
  • Sub-agent outputs surfaced through structured outputs or raw message content.
  • Runtime inputs captured earlier in the workflow, these can be files, trigger inputs, questions, chat history, or current group chat messages.
  • Context variables carried across all steps these include all tool outputs for all tool execution instances and sub-agent structured outputs.
If you have multiple instances of the same tool, append __{instance_id} to the tool name.

How variables appear in the UI

Use the variable picker to browse and insert values. Variables are grouped by:
  • Tools: each configured tool output is listed under the tool name.
  • Runtime inputs: values captured from triggers or previous steps.
  • Structured outputs: fields saved from sub-agent responses.
If a variable is missing, make sure the tool ran, the step completed, and the output was saved to context.
Variable picker grouped by Tools, Runtime inputs, Structured outputs, and Memory context

Common variable paths

Use these patterns when inserting variables:
  • Tool output: {{ tool_key.data.field }} where tool_key is the {tool_name}_{tool_id}
  • Tool output with instance: {{ tool_key__instance_id.data.field }} where tool_key is the {tool_name}_{tool_id} and instance_id is the instance id of the tool execution.
  • Nested objects: {{ tool_key.data.object.child }}
  • Arrays: {{ tool_key.data.items.0.sku }} gets the first item in the array.
  • Structured output: {{ sub_agent_name_id.key }} where sub_agent_name_id is the {sub_agent_name}_{sub_agent_id}
  • Runtime input: {{ input.question }} gets the question from the runtime input.
  • Inside Loops: {{ _loop.property }} gets the property from each item when the tool is executed in a loop.
Exact variable labels match what you see in the picker. Use the picker to avoid typos.

Variable syntax

Custom JSON payload editor showing Jinja-style variables, filters, and conditionals inline with the payload
{
  "order_id": "{{ get_order_99__1.data.id }}",
  "customer": "{{ get_order_99__1.data.customer_name }}"
}
{
  "order_id": "{{ get_order__1.data.id }}",
  "backup_id": "{{ get_order__2.data.id }}"
}

Nested properties

{
  "email": "{{ get_customer_99.data.customer.email }}",
  "city": "{{ get_customer_99.data.customer.address.city }}"
}

Filters

Use filters to transform values:
  • default for fallbacks
  • tojson to serialize objects or lists
  • upper, lower, trim
  • length for counts
  • join for list formatting
{
  "note": "{{ order.data.note | default('No notes') }}",
  "tags": {{ order.data.tags | default([]) | tojson }},
  "email": "{{ user.data.email | lower | trim }}"
}

Conditionals

{
  "priority": "{% if order.data.total > 100 %}high{% else %}normal{% endif %}"
}

Loops

{
  "items": [
    {% for item in products.data.items %}
    { "sku": "{{ item.sku }}", "qty": {{ item.quantity }} }{% if not loop.last %},{% endif %}
    {% endfor %}
  ]
}
Use tojson for arrays or objects to keep valid JSON in custom payloads.

Loops and skip conditions

Execute-tool actions can iterate over arrays and conditionally skip items.
  • Loop on: select an array path in the tool input.
  • Max iterations: prevent runaway loops.
  • Fail on error: stop immediately or continue on errors.
  • Skip conditions: use all/any groups with nested condition sets. These can be used to skip items in a loop or to skip the tool execution if a condition is met.
Execute tool loop configuration with skip conditions