Text becomes a message under three closed rules
The adapter every text producer needs to reach a message-shaped node. Its defaults are chosen so a malformed turn never reaches a provider.
The rule
- A text-to-message node turns a text value and a role into one message, emitted both as a one-element message-typed list and as the same row on a plain object-typed output.
- Content is coerced exactly as conversation normalization coerces it: a scalar is cast, a non-scalar is serialized to text rather than blanked, and unserializable content falls back to the empty string.
- Three rules are closed.
- The role is one of
user,assistant,systemortool; any other value, an absent one included, resolves touser, so a role a provider would reject never leaves the node. - A tool call id is attached only on role
tool, trimmed, and omitted when blank; on any other role it names no pairing and is discarded. - Empty content emits an empty list and an empty object rather than an empty turn, so an unwired producer cannot become a silent request on a blank prompt, a
toolrow with no content included, because synthesizing an answer for an unanswered call belongs to tool-pairing repair.
What it means
The node closes three questions an author is not asked to answer for every
piece of text a workflow turns into a message. A role a provider would
reject — an unrecognised value, or none at all — never reaches the message;
it becomes user instead of a validation error, so a producer that forgets
to set a role, or sets one from a value the author never anticipated, still
emits something a provider will accept. A pairing id only means something on
a tool row: on any other role it is discarded rather than carried through,
because attaching it there would claim a pairing that is not real. And a
blank pairing id on a tool row is treated as no id at all, not as an empty
one.
Example
The same text and role pair, differing only in the role's provider validity.
{"text": "hello", "role": "operator"}{"role": "user", "content": "hello"}A pairing id attached where only a tool row can carry one:
{"text": "hello", "role": "user", "tool_call_id": "call_1"}{"role": "user", "content": "hello"}