> ## Documentation Index
> Fetch the complete documentation index at: https://docs.riggery.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Previous nodes

> What a node emits, and how the next node uses Result or a named field.

Every Graph node leaves values for later nodes. The next node can take the **default** payload, or one **named field**.

<h2 id="insert">
  Insert value
</h2>

On a field that supports it, **Insert value** (plus) opens **Previous nodes** and, when the field allows Secrets, the vault.

**Previous nodes** lists only nodes with an edge **into** this node. A sibling that is not connected does not appear. Hint when the list is empty: **Connect an incoming node to add its result here.**

Each row is `Node: Field`. The click inserts `{{…}}`. One Trigger on the Graph: the menu and the token both use `Trigger`. Example: **Trigger: Chat ID** inserts `{{Trigger.chatId}}`.

<Note>
  Two or more Triggers on the Graph: the menu uses the kind (**Message**, **Webhook**, `imap_poll trigger`, `cron trigger`, `manual trigger`). The token uses that node's id instead of `Trigger`.
</Note>

Rename a Tool or Agent in **Name** and the token follows the unique name: a node named `Files extract` becomes `{{Files extract.text}}`. Two nodes with the same name: the token uses the node's id.

If none of the incoming nodes is a Trigger, the list also has **Test input (Manual node)** → `{{Input}}` (the Manual **Test input**, or the Run's input text).

<h2 id="default">
  Empty field
</h2>

Leave a field blank and some nodes use the **Result** of every immediate previous node, joined with a blank line. Agent **User prompt** works this way. So do several Tools (each Tool page says whether empty is allowed).

That default is always **Result** (the node's main text). It is not **Chat ID**, **Files**, or another named field.

On **Telegram send**, empty **Text** uses previous Result (the message body). Empty **Chat id** is not **Trigger: Chat ID** and is not previous Result. Insert **Trigger: Chat ID** when the id must come from the Trigger. (A Telegram-originated Run can still fill Chat id from that incoming chat.)

A field that **requires** a value does not fall back. **File id** on [Files extract](/graph/tools/files-extract#file-id) is one of those: empty fails.

<h2 id="result">
  Result
</h2>

**Result** is the primary text of the node. You see it under **View results**.

Insert label: **Result** (Triggers use a kind-specific name instead: **Message text**, **Body**, **Input text**, **Summary**). Token field `text`. A bare `{{Files extract}}` also resolves to that text; **Insert value** always writes the field form (`{{Files extract.text}}`).

Agent, Condition, and every Tool currently expose **only Result** in **Previous nodes**. Named fields for a Trigger are on that Trigger's **Output**. Connect the Trigger into the node before those fields appear.

<h2 id="tools">
  Agents and Tools
</h2>

**Previous nodes** shows one row per incoming Agent, Condition, or Tool: **`Name`: Result**.

The text is that node's **View results** output. [Files extract](/graph/tools/files-extract#output) Result is a markdown summary, not the table rows. Put tables into State with [State import from file](/graph/tools/state-import-from-file) and the same **File id**.

<h2 id="attachments">
  Photos and Files
</h2>

**Photos** and **Files** expand to a JSON array of attachments, not a single **File id**.

```json theme={null}
[{"id":"cmtzo4vku002vaxpvc1p9irxo","name":"rates.csv","mimeType":"text/csv","kind":"file"}]
```

`id` is the opaque id [Files extract](/graph/tools/files-extract#file-id) needs. `name` is the filename — tools that take **File id** reject a filename. `kind` is `photo`, `file`, or `email_part`.

Do not insert **Trigger: Files** into **File id**. Copy one `id`, let **Agent decides** pick it, or parse the array in [Code](/graph/tools/code).
