ИИ-агент на self-hosted n8n работал в проде заказчика: по ночам принимал заявки в Instagram Direct, вёл диалог, собирал анкету и создавал или обновлял сделку в amoCRM. Стек — n8n + Redis + LangChain, основная LLM — DeepSeek V4 Pro через OpenRouter, резервная — Qwen3.8 Flash. С конца июня отказы делились на два периода. Первый — инфраструктурный: ограничения Meta, потерянные вебхуки, окно ответов, двойные доставки. Это закрыли до продакшена: мгновенный 200 OK, буфер на Redis, дебаунс. Второй период — последние два месяца — оказался связан с промптом.
Правки от заказчика шли в системный промпт под живую бизнес-логику: инструкция по пересылке оплаты, отдельные сценарии для VIP-клиентов, уточнения формулировок после спорных диалогов. Каждая правка по отдельности была правильной, но суммарно промпт разросся примерно до 6,4 тыс. токенов, а плотность запретов («КАТЕГОРИЧЕСКИ ЗАПРЕЩЕНО», «Отправь СТРОГО этот текст») стала максимальной за всю жизнь системы. На этом фоне и всплыл отказ нового класса.
| Параметр | Значение |
|---|---|
| Платформа | self-hosted n8n |
| Стек | n8n + Redis + LangChain |
| Основная LLM | DeepSeek V4 Pro через OpenRouter |
| Резервная LLM | Qwen3.8 Flash |
| Канал | Instagram Direct |
| CRM | amoCRM |
| Размер системного промпта | около 6,4 тыс. токенов |
Симптом выглядел так: агент не отвечал плохо — он молчал вообще. Менеджеры через заказчика передавали «приветы»: агент перестал отвечать клиентам. Собрали четыре случая, все в смену ИИ, все по одному сценарию. В amoCRM картина повторялась: клиенту задали вопросы, он ответил анкетой, агент подтвердил — и на следующее или через одно-два человеческих сообщения ноль. Диалог обрывался на полуслове, сделка висела, клиент писал ещё раз — и снова тишина. Показательный случай: после подтверждения анкеты клиентка написала не «спасибо», а живое сообщение — «я не веду особо видеоблог и тд, для меня это целая вылазка, нужно вдохновение». Под такую реплику в промпте не было ни скрипта, ни триггера тула. Агент замолчал. За двое суток это случилось дважды, оба диалога заскринили и отправили разработчику.
Первая гипотеза — инфраструктура. Проверка через Termius по SSH: CPU, память, диск, сеть чистые. n8n жив, Redis жив, воркер не падал, OOM нет. Перезапускать было нечего. Гипотеза отпала быстро. Дальше — execution-логи n8n с фильтром по ошибкам. Там нашлась запись: NodeApiError: Invalid or missing message text parameter at item index 0. Message text must be a non-empty string. Упала нода Send direct message2 (@mookielianhd/n8n-nodes-instagram, v1), операция messaging / sendMessage, itemIndex 0, время 20:45:18 — через секунду после закрытия генерации. Нода отправки в Instagram рубит выполнение на валидации «non-empty string», потому что параметр text пришёл пустой строкой.
Следующая остановка — выход самого агента. В execution видно: на входе сообщение {{ $json.userText }} и chatId клиента, на выходе — "text": "", finish_reason: "stop", completionTokens: 95, promptTokens: 6677. То есть модель формально завершила генерацию успешно, потратила 95 токенов на completion и 6677 на промпт, но вернула пустую строку. Это и есть Reasoning Lock: генерация закрывается со статусом «stop», а текст ответа пуст. Нода отправки падает на валидации, клиент не получает ничего, сделка остаётся висеть.
Почему это важно для тех, кто строит агентов в проде. Во-первых, статус «stop» не означает, что ответ непустой. Валидацию на стороне LLM-ноды или перед отправкой нужно ставить отдельно. Во-первых, разросшийся системный промпт с плотными запретами меняет поведение модели: она может «согласиться» завершить генерацию, не сформировав текст. Во-вторых, community-нода отправки в Instagram честно рубит пустую строку — но это уже поздняя точка отказа, клиент к этому моменту ничего не получил. Ловить пустой ответ надо раньше, на выходе агента.
После правок воркфлоу счётчик пустых ответов держится на нуле семь дней. Что именно поменяли — в источнике не детализируется, но логика лечения следует из разбора: контроль пустого text на выходе LLM, а не только на входе ноды отправки, и работа с плотностью промпта. Для команд, которые держат ИИ-агентов на n8n + Redis + LangChain, это готовый чек-лист: проверять finish_reason вместе с длиной ответа, не полагаться на «stop» как на признак успеха и следить за размером системного промпта.

