Skip to content

AI in Flows

A flow can already move data, branch on a value, and work through a list. Real work also brings steps no fixed rule can decide: what is this customer actually asking for, is this message a refund request, what should the reply say. In FlowRunner™, AI makes those judgment calls as a step of the flow. An AI step reads what earlier blocks hand it and produces a result the next block uses, like any other block. You choose how much of the job the model gets: a single value to reshape, a known task done by a ready-made action, one yes/no question, a routing decision, or the whole job handed to an agent.

Every AI step needs a model and your key

The AI blocks and operations on this page run on a model you choose, through your own provider account. An AI API key is the credential your provider account (OpenAI, Anthropic, Google, and others) gives you. Save it once: under Connections in the workspace sidebar, open API Keys and add the key to its provider. A saved key is called a setup. See API Keys for the walkthrough.

On the AI blocks and operations below the order is fixed: pick the model first. Until a model is chosen, the key field is disabled and reads "Select model first", as on this not-yet-configured step; once you pick the model, the field offers your saved setups.

The AI Model and AI API Key fields of a not-yet-configured AI step: the model is unset, and the AI API Key field below it is disabled with the placeholder "Select model first". Both fields carry the product's red required notes.

Ready-made extension actions are the exception: each carries its provider connection on the action itself, set up through its Configure button.

Reshape a value by describing the change

Sometimes the judgment call is small: pull one fact out of messy text, tag a message by tone, boil a long thread down to one line. Inside a Transform Data block, the AI Transform operation does this in place. You hand it a value in Data, describe the change in Instructions in plain language, and pick the model and key.

The flow below reads a customer email. An Extract Order Number block (Transform Data) runs the AI Transform operation with the instruction "Extract the order number. Return only the number itself.", and a Look Up Order block (HTTP Request) calls the order API with the number it produced: its URL is built in the Expression Editor and ends in the Extract Order Number Result pill. In the test run the block returned 10473.

The Order Intake flow: Start leads to an Extract Order Number block (Transform Data), which leads to a Look Up Order block (HTTP Request). The configuration panel shows the AI Transform operation with the customer email in Data, the extract instruction, Claude Haiku 4.5, and the Demo Key setup. The Test Monitor shows the run succeeded with the result 10473.

Fields and options live in the AI Transform section of the Transform Data reference.

When the change is exact, code is cheaper

If the change can be specified precisely, a Custom Cloud Code block does it deterministically - a few lines of your own code, no model call to pay for, and the same result every run.

Drop in a ready-made AI action

Not every AI job needs a prompt you write. When the job is a known task - transcribe a voicemail, generate an image, moderate an upload - the Extensions library ships a ready-made action for it, and you drop it in like any block. Search the block palette for the task; AI actions from providers such as OpenAI and ElevenLabs appear under Extensions.

Searching the palette for Speech to Text, for example, turns up ready-made transcription actions from two providers.

The block palette searched for Speech to Text: the Extensions group lists a Speech to Text action from ElevenLabs under Audio Processing, and another from OpenAI.

The AI & LLMs category of the Marketplace lists the full catalog, and Custom & Marketplace Actions covers the other ways to add a capability no built-in block provides.

Ask a yes/no question no rule can answer

Some yes/no tests are judgment calls: is this message asking for a refund? For those, the Operation list of every data type in a Condition ends with AI QUESTION. You write the question in plain language in Yes/No Question and pick a model and key. The answer drives the same Yes and No exits as any comparison; Yes/No Branching covers building on them.

In the flow below, a Refund Question block (Condition) checks the customer message the run received as Initial Data. The question is "Is the customer asking for a refund?" - Yes leads to a Flag For Refund Team block, No to a Mark As Routine block.

The Refund Check flow after a test run on a refund request: the Refund Question block (Condition) and the Flag For Refund Team block on its Yes exit carry success checkmarks, while Mark As Routine on the No exit is marked skipped. The configuration panel shows Value to Check bound to the Initial Data message, Value Data Type STRING, Operation AI QUESTION, the question "Is the customer asking for a refund?", Claude Haiku 4.5, and the Demo Key setup. The Test Monitor's Block Results tab shows the block's Success output, conditionResult true.

The Condition reference covers the operation's fields.

Send the run down the branch an AI picks

When a message can go more than two ways, the AI Router block branches on meaning. It lives in the palette's AI group, together with the AI Agent. You name a branch for each outcome in Expected Decisions, say what to judge in AI Decision Request, and pass the material to judge as named Decision Data inputs. Each named branch is its own connector on the block, and the model picks exactly one per run. A branch named Everything Else is always present and cannot be removed - wire it, so a run that fits no named branch has somewhere to go.

The Ticket Router flow below routes a support message by topic. The Route By Topic block (AI Router) names Billing, Shipping, and Technical branches; in the test run the model judged "I was charged twice for order 10473, please fix my invoice." and chose Billing.

The Ticket Router flow: a Route By Topic block (AI Router) with labeled connectors wired to Billing Queue, Shipping Queue, Technical Queue, and Human Review blocks. The configuration panel shows the decision request "Determine the topic of the customer message.", the message as Decision Data, and the Expected Decisions Billing, Shipping, and Technical above the fixed Everything Else. The Test Monitor shows the run chose Billing.

The router also stores the decision it made: a later block reads Route By Topic Result → decision in the Expression Editor to act on or record the chosen label.

Routing on a Value shows when a fixed-value router does the job instead; the AI Router reference covers the fields.

Hand the whole job to an agent

The steps above make one model call and hand back one answer. When the step has to decide what to do on its own - fetch knowledge, take an action, carry a conversation - reach for the AI Agent block.

You give the agent its instructions in System Prompt and User Prompt, and you grant it capabilities with Manage Capabilities:

  • built-in extension actions
  • your own flows
  • Knowledge Bases
  • the flow's Shared Memory
  • a small set of utilities

With an MCP server registered in the workspace, its tools join the list. The agent decides which of its capabilities to use, and when.

When the agent should remember earlier runs, FlowRunner keeps the conversation record for you: turn on the Messages History toggle on the block. See Agent Memory.

The Draft Reply flow below gives an agent the customer message from Initial Data and one flow tool: it can run the workspace's Order Check flow when it needs the order's status before answering. A Send Reply block (HTTP Request) posts the finished reply to the helpdesk.

The Draft Reply flow: Start leads to an AI Agent block named Draft Reply whose Tools strip shows the Call "Order Check" flow tool, and on to a Send Reply block (HTTP Request). The configuration panel shows Claude Haiku 4.5, the Demo Key setup, a System Prompt describing a support agent for a kitchen appliance store, and a User Prompt bound to the Initial Data message.

The reply arrives under the result's output property: the Send Reply block reads Draft Reply Result → output in its Body, picked in the Expression Editor from the properties the test run recorded.