ai_call is a logic-block step with full access to entity data and workspace isolation, deliberately kept flexible rather than split into several narrower AI steps.

ai_call

A single provider call for classification, extraction, summarization, generation, scoring, decisions, or translation. You give it context fields, an intent, and an output format; you get a typed result.

json
{
  "type": "ai_call",
  "intent": "classify",
  "contextFields": [{ "label": "review", "value": "{{input.reviewText}}" }],
  "outputFormat": "category",
  "categories": ["positive", "negative", "neutral"]
}

The output shape follows outputFormat:

  • textresponse (string).
  • json → a flat object with your declared outputFields.
  • scorescore (0–100).
  • categorycategory matched against your categories.
  • booleandecision (true/false).
  • list → an array of items.
  • image → a generated-image URL.
  • audio → a generated-audio (TTS) URL.

Comparing options doesn't need a separate step

There's no dedicated "compare" step. Feed the candidates into contextFields and use intent: "decide" or "classify" to pick between them in one call — or run ai_call once per candidate (e.g. once per provider or per option) and combine the results in a downstream condition/formula step. ai_call is deliberately the one flexible AI step rather than several narrow ones.

Every result also reports tokensUsed. For json, list the fields you want extracted:

json
{
  "intent": "extract",
  "contextFields": [{ "label": "email_body", "value": "{{input.emailText}}" }],
  "outputFormat": "json",
  "outputFields": [
    { "name": "sender_name",    "description": "full name of the sender" },
    { "name": "requested_date", "description": "meeting date in ISO format" },
    { "name": "topic",          "description": "one-line meeting topic" }
  ]
}

RAG — grounding an ai_call in entity data

There's no separate retrieval step either — use list_entities in search mode to pull matching records, then feed them into an ai_call as context and instruct it to answer only from what was retrieved.

text
s1: list_entities  entity=policy  mode=search  search={{input.question}}  limit=3
s2: ai_call         intent=generate
                    contextFields=[{ label: documents, value: {{s1.items}} },
                                   { label: question,  value: {{input.question}} }]
                    instructions="Answer only using the provided documents."
                    outputFormat=text

ai_call in depth — the 4 builder tabs

Each tab in the ai_call step editor has its own dedicated article, since there's real depth in each one: