n8n AI Agent берёт session key первой заявки: как изолировать items
Две заявки приходят одним пакетом. У каждой свой идентификатор диалога, в поле памяти стоит привычное выражение {{ $json.conversationKey }}. Вторая заявка внезапно получает историю первой: агент отвечает про доставку, хотя клиент спрашивал о возврате. Отдельно обе заявки проходят тест. Ошибка появляется только при совместной обработке.
Начните с параметров подузлов AI-цепочки. В n8n обычный узел и sub-node вычисляют выражения по-разному при нескольких входных items. В sub-node выражение разрешается по первому item. Поэтому правильное поле и правильное имя переменной ещё не означают, что значение будет выбрано отдельно для каждой заявки.
Проверьте проблему без настоящих клиентов
Создайте тестовый workflow с Manual Trigger и Code. Режим Code — Run Once for All Items. Верните две синтетические заявки:
return [
{json: {ticketId: "T-101", conversationKey: "demo:alice", text: "Когда доставят заказ?"}},
{json: {ticketId: "T-202", conversationKey: "demo:bob", text: "Как оформить возврат?"}}
];
Подключите AI Agent с моделью и используемой памятью. Поле сообщения агента должно получать {{ $json.text }}, а ключ памяти — {{ $json.conversationKey }}. Для локального эксперимента допустима Simple Memory; для активного workflow в queue mode она не подходит, потому что обращения могут попасть к разным workers. В рабочей системе используйте подходящее внешнее хранилище, например Redis Chat Memory, и проверяйте выражения именно в установленном узле.
На тестовых данных изучите вход AI Agent: там должны находиться оба item. Затем откройте выражение ключа памяти и посмотрите, какой вход используется для его вычисления. Не судите только по тексту ответа модели. Два похожих ответа могут быть совпадением, а отсутствие видимой утечки в одной попытке не объясняет, в какую запись памяти попал запрос.
Сделайте каждый вызов агента одноэлементным
Добавьте Loop Over Items между Code и AI Agent. Укажите Batch Size: 1, оставьте Reset выключенным. Выход loop соедините с AI Agent. После обработки верните поток в Loop Over Items. Узлы, которым нужен итог всего пакета, подключайте к выходу done.
Теперь AI Agent в каждой итерации получает один item. Для первого вызова первым является T-101, для второго — T-202. Существующее выражение в sub-node вычисляется на единственном доступном элементе, поэтому его поведение соответствует нужному разделению. После настройки проверьте входы агента в обеих итерациях: размер входа должен быть один, ключи — различаться.
Если workflow разрастается, вынесите обработку одной заявки в дочерний сценарий с явными входами ticketId, conversationKey и text. Вызывайте его для каждого элемента отдельно и проверяйте фактическую настройку вызова: передача всего массива одним запуском ребёнка вернёт исходную проблему. Название sub-workflow само по себе не обеспечивает изоляцию.
Сохраните идентичность заявки до самого результата
Память хранится между обращениями, поэтому ключ должен быть стабильным для одного диалога. Новый случайный ключ на каждый запуск уберёт историю вместе с возможностью продолжить разговор. Один общий ключ вроде support, напротив, объединит клиентов даже после исправления цикла. В многопользовательской системе собирайте ключ на стороне доверенной интеграции из организации и диалога; не позволяйте тексту клиента задавать чужую область памяти.
Сохраните ticketId рядом с результатом агента перед обратным входом в цикл. Если используемый узел возвращает только ответ, добавьте Edit Fields и возьмите ticketId из связанного входного item. Проверьте сопоставление на двух разных идентификаторах, затем поменяйте порядок заявок. Результат T-202 должен оставаться результатом T-202 независимо от его позиции в массиве.
Отдельно проверьте повторный разговор: первая заявка каждого клиента сообщает разный синтетический код, следующая просит назвать свой код. Смотрите и ответ, и фактический ключ записи в тестовом хранилище. Такой эксперимент проверяет реальное разделение истории; наличие двух строк в итоговом output проверяет только количество обработанных элементов.
Где ещё искать параметры первой строки
После исправления памяти просмотрите остальные AI sub-nodes с выражениями из $json: ограничения поиска, выбранную коллекцию, параметры инструментов. У каждого параметра задайте вопрос: он общий для всего запуска или должен меняться вместе с заявкой? Общую настройку удобно держать постоянной. Зависимую от item нужно проверять в одноэлементном вызове.
Цикл делает обработку последовательной. Если throughput недостаточен, организуйте независимые выполнения по одной заявке и ограничьте параллельность с учётом модели и хранилища. Сначала докажите корректное разделение на двух диалогах, затем измеряйте скорость. Иначе увеличение числа workers ускорит смешивание данных.
В платном курсе «Продвинутый n8n: production-автоматизации и AI-агенты» вы разберёте модель items, границы sub-workflows, AI Agent с Redis Chat Memory и воспроизводимые проверки workflow. Эти навыки нужны, чтобы переносить сценарий с одиночной заявки на поток. Откройте программу курса. Основные узлы и expressions можно предварительно освоить в бесплатном курсе n8n с нуля.
