All nodes/AI/LLM

Message

Builds a canonical message (role + text + attachments) from the text and files inputs. Use it when you need to pass a message with files to an LLM node, sub-workflow, or memory.

Message▶
TextMessage
Files

Type in the graph: message

Exec

An error output can be enabled to handle failures on their own path.

Ports can be split into separate execution and data handles.

Try it

Minimal working scenario

Entry
Message▶
Exit▶
  • Execute + Data
Press “Copy nodes”, open the editor and hit Ctrl+V on the canvas.

Runs as pasted

When to use it

This node exists for the two things a plain string cannot carry: attachments and a role. If the model only needs text, you do not need a separate node — the Message port of the LLM nodes accepts a plain string and treats it as a user turn, and the text itself is easiest to build with a Template. Reach for message when the text has to come with a file — an image, audio, a document — or when the turn should come from the system or from the assistant. To assemble several turns into a conversation, use Messages.

How it works

The node fires when execution arrives at the Text input. The Files port is pure data: it does not trigger the node, it only reads a value that is already there, so the branch that produces the file has to finish earlier along the execution path.

The “Text” field is a fallback, not the main source: it is used only when the Text port delivered nothing — either it is not connected, or it delivered an empty string. A connected non-empty text always wins over the field.

The output carries the whole message: text, role and attachments. In templates {{ nodes.<id>.output }} shows the text only — the attachments travel along the edge and reach the node that edge points to.

Files takes file references: the output of File Read, a list from file_glob, images from Generate Image, a file from telegram_get_file. The message from Entry works here too — its own attachments are taken from it.

Common mistakes

  • Two edges into Files. The port takes a single edge; a second one makes the input ambiguous and the graph fails validation. Pass several files as one list — for example the output of file_glob or of image generation.
  • Sending a string into Files. The port expects a file reference; a path or a name as text silently produces no attachments at all, and the message leaves without files.
  • Role system or assistant instead of a question. LLM nodes take the last turn with role user as the prompt. A single message with another role travels as context, and the model is left without a question.
  • The model does not see the attached file. An attachment reaches the request only if the model accepts that type: images when it supports images, audio when it supports audio, PDFs when it supports documents, text files are inlined into the prompt as text. A PDF attached on this step to a model without document input stops the run with an error naming that model — so there is never an answer about a file the model did not read. Archives and office documents are left out of the request entirely, without an error.

Inputs

PortWirePayloadNotes
TexttextExecute + Dataexecute_datastring

Message text

FilesfilesDatadatafile

File attachments

Outputs

PortWirePayloadNotes
MessagemessageExecute + Dataexecute_datamessage

Configuration

FieldTypeDefaultDescription
Rolerolestringuser

Author role of the composed message

Options: user — From the person, assistant — From the bot, system — System instruction

Texttext_templatestring""

Optional text template; used when the Text port delivers nothing (not connected, or an empty string).

supports templates

Shared fields

Every node has these three — the platform adds them, not the node author.

  • expose_error_output — When enabled, show an execution output to connect nodes that run if this step fails.
  • split_ports_in — Show separate execution and data input handles instead of one combined port.
  • split_ports_out — Show separate execution and data output handles instead of one combined port.