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 branch can be enabled (expose_error_output) to handle failures on their own path.

Ports can be split into separate execution and data handles.

Try it

Minimal working workflow

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, text files are inlined into the prompt as text. Anything else — PDFs, archives, office documents — is left out of the request, 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, assistant, system

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.