Переменные и память

Граф исполняется один раз на сообщение и сам по себе ничего не помнит. Состояние живёт в двух разных механизмах: переменные, которыми управляете вы, и память, которую наполняет диалог с моделью.

Переменные

Переменную объявляет нода var: имя, тип (string, integer, float, boolean, json, csv, dataframe), область видимости и значение по умолчанию. Сама нода только читает; запись делает var_set — на порт Input приходит значение, на порт Var — ссылка на объявляющую ноду.

Вход
ПеременнаяS
Установить переменную
Выход
  • Исполнение + данные
  • Данные
var объявляет, var_set пишет: значение приходит на Input, ссылка на переменную — на Var.

При записи значение приводится к объявленному типу: строка "1" в переменной типа integer станет числом, и следующее сравнение не сломается. Неприводимое значение записывается как есть.

Три области видимости

Область Сколько живёт Когда выбирать
session Один запуск воркфлоу Счётчики циклов, промежуточные значения между ветками одного хода.
thread Между сообщениями, хранится в базе Состояние диалога: язык клиента, номер заявки, стадия сценария.
call Не хранится вовсе Значение по умолчанию при каждом чтении — когда нужна константа, а не память.

Ключ для thread — чат-тред: сессия веб-чата, чат Telegram. У запуска без чата (ручной запуск, вебхук без сессии) тредом становится сам запуск, поэтому thread в нём ведёт себя как session.

Чтение в шаблонах

{{ variables.<имя> }} видит переменные области session и служебный loop_index внутри while_loop. Переменная области thread в это пространство имён не попадает — читайте её через выход объявляющей ноды: {{ nodes.<id var-ноды>.output }}.

Память диалога

Память хранит историю сообщений и подключается к ai_agent ребром link_memory. Три ноды отличаются тем, что происходит с историей по мере роста:

  • buffer_memory — вся история целиком;
  • window_memory — только последние N сообщений (window_size, по умолчанию 10);
  • summary_memory — старые сообщения сжимаются в резюме через модель: по умолчанию сжатие включается после 20 сообщений, последние 6 остаются дословно. Модель берётся у родительского агента либо задаётся своим ребром link_llm.

Область видимости у всех трёх та же тройка thread / session / call, по умолчанию thread — то есть история переживает сообщения одного чата. Ключ — пара «нода + тред», поэтому две ноды памяти в одном графе хранят разные истории.

У llm_response памяти нет: ему нужна либо собственная опция истории чата, либо нода chat_history.

Память агента

agent_memory — это не история, а долгоживущий словарь «ключ — значение», который агент ведёт сам. Нода подключается ребром link_extension, и модель получает инструменты записи, удаления и очистки (expose_tools, набор задаётся полем enabled_tools). Начальное состояние задаётся в конфигурации.

Отличие от переменных — в том, кто пишет:

ПеременныеПамять агента
Кто записываетНоды графа — вы решаете, когдаМодель, вызовом инструмента
Кто читаетШаблоны и нодыМодель, в своём контексте
ФормаОдно типизированное значение на имяСловарь ключ — значение

Если значение нужно вам в графе (условие, фильтр, поле запроса) — берите переменную. Если его должна помнить модель между ходами — память агента.

Где посмотреть и очистить

Откройте запуск, нажмите на ноду и перейдите на вкладку «Состояние». Для нод памяти там видна история сообщений, для памяти агента — словарь; рядом указана область видимости и есть действие «Очистить состояние». Вкладка появляется только у нод, которые состояние отдают; значение thread-переменной так посмотреть нельзя — выведите его нодой в граф.

app.iterna.ai

Инспектор ноды

agent_memory_1

Область: thread

Очистить состояние
КлючЗначение
client_nameМария
order_idA-1043
stagewaiting_payment
Вкладка «Состояние» у ноды памяти.