200 OK, но клиент молчит: три бага n8n-агента из production

Ровно через 20 дней после закрытия первого бага появился второй. На этот раз виновата не LLM, а слои вокруг: невидимые символы, проверки валидации и отключённые чекбоксы в конфигурации. Три разные природы багов: • **Служебные теги вместо ответа**: модель GLM отвечает только `[VERDICT:…] [TASK:NONE]`, валидатор пропускает как валидный контент, Format Response вырезает теги, клиенту остаётся `\n\n \n` • **Лимит Meta 1000 байт**: анкета на русском (имя, дата, сфера, телефон) занимает 1030 байт — одна буква 2 байта, эмодзи 3–4, API падает с Bad request • **Каталог вместо выборки**: Schema Type не задан, n8n вывел схему из схемы вместо примера, поле category оказалось на дне, инструмент возвращает весь ассортимент

AI-обработка оригинала Habr AI; редакция Hamidun News
200 OK, но клиент молчит: три бага n8n-агента из production
Источник: Habr AI. Коллаж: Hamidun News.
Слушать статью
Паспорт материала и цифры
ПараметрДанные
ПервоисточникHabr AI ↗
Главный редактор
Лимит Meta 1000 байтанкета на русском (имя, дата, сфера, телефон) занимает 1030 байт — одна буква 2 байта, эмодзи 3–4, API падает с Bad request
Каталог вместо выборкиSchema Type не задан, n8n вывел схему из схемы вместо примера, поле category оказалось на дне, инструмент возвращает весь ассортимент

Это вторая история про ИИ-агента в production. 20 дней назад я закрыл баг Reasoning Lock: модель тратила токены на скрытые мысли, отправляла пустую строку клиенту, хотя статус был успех. Добавил валидатор пустого ответа и телеметрию. Написал: «лог пуст — слои работают». Лог молчал 20 дней. Потом менеджеры прислали новые жалобы через заказчика: клиент пишет в Директ, агент молчит. Но на этот раз виновата не LLM.

Архитектура проекта: n8n-агент работает в production для ателье украшений. По ночам принимает заявки в НЕЛЬЗЯgram Direct, ведёт диалог, собирает анкету (имя, дата рождения, сфера, телефон), создаёт сделку в amoCRM. Стек: n8n (self-hosted) + Redis (память диалогов, TTL 30 дней) + LangChain. LLM сменилась: вместо DeepSeek V4 Pro теперь z-ai/glm-5.3-flash через OpenRouter, резервная qwen/qwen3.8-flash. Workflow вырос с 64 до 88 нод, реализована обработка комментариев и логика ретраев.

Баг 1: Служебные теги протокола вместо человеческого ответа

Открыл executions — чистота. Ни одного упавшего прогона. Гипотеза «Reasoning Lock повторился» отпадает: модель отвечает и шустро. Единственный след в amoCRM: клиентка ответила «Да» в 20:06 на подтверждение заказа (20:02), потом только запись в MESSENGER-ID, в директе тишина.

Открыл карточку OpenRouter: 871 token completion, из них 766 reasoning — остаток 105 видимых токенов. По объёму это служебные теги протокола: `[VERDICT:ORDER:DATA|HOT] [NEED_MANAGER_CALL] [STAGE:PERSONAL]`

Модель GLM ответила. По протоколу. Ни одного человеческого слова. DeepSeek 4.0 PRO замыкался в себе, GLM оказался примерным отличником: человеческий текст не положен — сдаёт форму.

Валидатор не поймал, потому что проверяет на пустоту (output непустой — pass). Инвариант «пустой content + потраченные токены + finish_reason stop ≠ успех» тоже отказал: токены потрачены (да), finish_reason stop (да), content непустой (да). Проверял отсутствие пустоты, а не наличие человеческого текста.

Дальше нода Format Response вырезает теги по дизайну — остаётся `\n\n \n` (непустая строка для n8n, символы для Meta, ничего для клиента). Guard перед отправкой проверяет isExecuted ноды, а не её содержимое.

Баг 2: Лимит Meta 1000 байт разбивает русский текст

После диагноза всплыла красная нода на финальной отправке:

``` NodeApiError: Bad request - please check your parameters Send direct message1 ```

Падение на анкете: имя, дата, сфера, телефон, абзацы через `\n\n`. Самое длинное сообщение в жизни агента. Документация Meta API: Message text must be UTF-8 and be 1000 bytes or less. Не символов, а байт.

В UTF-8 русская буква — 2 байта, эмодзи 3–4 байта (✨ = 3, 💎 = 4). 1000 байт это примерно 500–550 символов русского текста. Я прогнал 570-символьный русский текст: он занял 1030 байт. Анкета с именем, датой, сферой, тремя абзацами и «Все верно?» легко переезжает планку. Самое обидное: `\n\n` это не баг, это человеческие абзацы, как в Word — пайплайн, заточенный под reasoning, споткнулся о простой перенос строки.

Баг 3: Каталог вместо выборки — неправильный Schema Type

Пока разбирался с отправкой, пришла ещё жалоба менеджеров: «агент показывает не то». Просят серьги — вваливает полкаталога, просят часы — снова полкаталог.

За каталог отвечает tool-нода get_product_catalog1. Specify Input Schema включён, Schema Type не задан. n8n берёт дефолт — «Generate From JSON Example»: дай пример, я выведу схему. В jsonSchemaExample лежала не пример данных, а сама JSON Schema с полями type, properties, required, category (с enum: bracelets, earrings, necklaces, luch, candles) и description.

n8n содержимое не проверяет — честно принял схему за пример и вывел схему из схемы. Верхние ключи type, properties, required стали примером объекта, category уехала на дно. Инструмент читает inputData.json.category, получает undefined, идёт в дефолт all. Любой запрос возвращает весь ассортимент вместо выборки. Один клик фикса (Schema Type → «Define using JSON Schema»), полтора часа поиска.

Итог

Три разные природы одной проблемы: модель отвечает служебными тегами вместо текста, API имеет жёсткий лимит на байты вместо символов, конфиг инструмента скрывается за неправильным дефолтом. Зелёная нода худший вид красной — с падением хотя бы понятно где искать.

Сюжет

Вопросы и ответы по материалу

Что известно по теме: баг 1: Служебные теги протокола вместо человеческого ответа?

Открыл executions — чистота. Ни одного упавшего прогона. Гипотеза «Reasoning Lock повторился» отпадает: модель отвечает и шустро. Единственный след в amoCRM: клиентка ответила «Да» в 20:06 на подтверждение заказа (20:02), потом только запись в MESSENGER-ID, в директе тишина. Открыл карточку OpenRouter: 871 token completion, из них 766 reasoning — остаток 105 видимых токенов. По объёму это служебные теги протокола: `[VERDICT:ORDER:DATA|HOT] [NEED_MANAGER_CALL] [STAGE:PERSONAL]` Модель GLM ответила. По протоколу. Ни одного человеческого слова. DeepSeek 4.0 PRO замыкался в себ

Что известно по теме: баг 2: Лимит Meta 1000 байт разбивает русский текст?

После диагноза всплыла красная нода на финальной отправке: ``` NodeApiError: Bad request - please check your parameters Send direct message1 ``` Падение на анкете: имя, дата, сфера, телефон, абзацы через `\n\n`. Самое длинное сообщение в жизни агента. Документация Meta API: Message text must be UTF-8 and be 1000 bytes or less. Не символов, а байт. В UTF-8 русская буква — 2 байта, эмодзи 3–4 байта (✨ = 3, 💎 = 4). 1000 байт это примерно 500–550 символов русского текста. Я прогнал 570-символьный русский текст: он занял 1030 байт. Анкета с именем, датой, сферой, тремя абзацами

Что известно по теме: баг 3: Каталог вместо выборки — неправильный Schema Type?

Пока разбирался с отправкой, пришла ещё жалоба менеджеров: «агент показывает не то». Просят серьги — вваливает полкаталога, просят часы — снова полкаталог. За каталог отвечает tool-нода get_product_catalog1. Specify Input Schema включён, Schema Type не задан. n8n берёт дефолт — «Generate From JSON Example»: дай пример, я выведу схему. В jsonSchemaExample лежала не пример данных, а сама JSON Schema с полями type, properties, required, category (с enum: bracelets, earrings, necklaces, luch, candles) и description. n8n содержимое не проверяет — честно принял схему за пример и

ЖХ
Жемал Хамидун — CPO Alpina Digital, продакт-менеджер AlpinaGPT. Делает AI-продукты с 2019 года. Hamidun News — pet project, который вырос в production-агрегатор с 6000+ читателей.
✦ Автономные AI-агенты

Делегируйте ресёрч, код и рутину автономному AI-агенту

Интеллектуальная агентная среда NomadNet Agent (agent.nomadnet.ai) выполняет многошаговые задачи: глубокий веб-ресёрч, анализ данных, написание кода и автоматизацию браузера.

Запустить NomadNet Agent →Платформа NomadNet AI
Что вы думаете?
Загружаем комментарии…