Actions

Chat

Open a persistent chat window and let every message the person sends run the flow behind it.

action.chat
ACTIONChat

At a glance

Does
Opens the window and stops — opening never runs the rest of the flow
Ports
Input opens it, Call fires per message, Response is where the answer comes back
Emits
message, history, historyText, chatID, timestamp, images

Set it up

Wire any trigger into Input — a Keyboard Shortcut is the classic — and firing it opens the window. From there every message is its own run, starting at this node's Call outlet. Wire the answer back into the node's own Response inlet: a drawn loop, allowed here and nowhere else.

The Chat inspector, with the window title and Response shows.
The Chat inspector, with the window title and Response shows.

One lap per message. Call goes out with what was typed, whatever you built behind it does the answering, and the payload that reaches Response is rendered through Response shows and appended as the reply. A Response wire that is never reached simply leaves the window with nothing to say.

The "Open Chat…" button in this node's inspector and the same item in the flow's menu on Home both open the window directly, with no trigger involved. Nothing opens it at app launch.

Configure

FieldDefaultWhat it does
Window Titlethe flow's nameShown in the window's title area and on the empty state.
Composer Placeholder—The grey words in the empty composer.
History turns sent to the flow20How many prior turns ride along on Call as {{history}} and {{historyText}}. 0 sends none.
ConversationKept across openingsKept survives closing the window and relaunching the app. Fresh each time it opens clears the transcript from the window and from disk whenever the window comes on screen — never mid-answer, and never on a window already up.
Response shows{{result}}What the window renders as the reply. The default needs no configuration behind an AI Prompt or an Agent.

Output

Every key below is in the seed a message run is entered with, on the Call outlet.

KeyTypeValue
messageStringWhat the person just typed
historyArrayThe recent turns as real objects — {{history.0.role}}, {{history.0.text}}, {{history.0.timestamp}}; user and assistant only, oldest first
historyTextStringThe same conversation as plain text, one line per turn — paste it into a prompt for context
chatIDStringWhich chat window this run came from
timestampStringISO 8601 time the message was sent
imagesArrayThe images pasted with this message, as real file references. Always present, empty when there are none

Tools

The chat window is the harness, so this node is where you choose what the conversation can reach. Its inspector has the Agent's own Tools list, and whatever is switched on is lent to the models behind Call for each message. A new Chat node is born with Web Search and Web Fetch on, so a freshly dragged chat can answer about this morning instead of saying it cannot browse. A Chat node built before this existed lends nothing until you switch something on.

Code tools — Edit File, Search Code, Repo Map, Git, Open PR — are greyed out here: they need a File Access Scope folder, which only the Agent has. For real code powers, put an Agent behind Call and enable them there. Turning on a writing tool marks the Chat node destructive on the canvas, and rightly so: a chat runs whenever somebody types.

Reading a reply

  • Three actions under every answer — Copy, Open run, Regenerate — at full ink on the newest reply and on whichever one you are hovering. Right-click adds Copy as Plain Text. Regenerate re-asks the message above the reply; it is greyed while a lap is in flight, because a second send would interrupt and re-ask instead.
  • A failed lap gets a card instead, red-edged, with the reason and a single Retry button.
  • Fenced code blocks are syntax highlighted and headed by the tag the model wrote (Code when it wrote none), with a fold chevron and a Copy button. Blocks arrive unfolded; folding collapses the body to a "60 lines" summary. Copy hands over the block exactly as it stands — no fence, no re-indentation, nothing trimmed — and confirms with a green checkmark for a moment.
  • Markdown tables render as a real grid inside a horizontal scroller capped at the reply's reading measure, so a wide table scrolls inside the reply rather than pushing the window out past it.

Example: a support-triage assistant

Every message runs an AI Prompt with the conversation folded in, and its result wires straight back into Response.

Chat, an AI Prompt off Call, the answer looping back into Response.
Chat, an AI Prompt off Call, the answer looping back into Response.

Give the prompt Conversation so far: {{historyText}} then User: {{message}}, and leave Response shows at {{result}}.

Paste this into the Flow Builder to get the same flow:

Build a chat window opened by a keyboard shortcut, where each message goes to an AI Prompt with the recent history for context and the answer comes back into the chat.

Good to know

A second message interrupts the lap in flight. The run is cancelled and a new one starts immediately, asking every message sent since the last answer joined into one {{message}}. Those messages are the question, not the context, so they are not repeated in {{history}}. Stop is different: it abandons the question and leaves a "Stopped before replying" line.

{{result}} renders an object as JSON. An AI step answering through an Output Schema hands back an object — point Response shows at the field you mean, {{result.reply}}, or leave the answering step without a schema.

Paste images straight into the composer — up to 8 per message. An AI Prompt with a blank Image field sends them to the model with nothing to wire. An Agent cannot see pictures and says so in the run log.

Each chat keeps its most recent 500 turns, pruned automatically. Each message is its own row in the flow's run history, tagged with a Chat chip.

The model pill in the header edits the flow. It lists the AI and Agent nodes behind Call, and picking a provider and model writes them onto that node exactly as the inspector would.