Пять мелочей, из-за которых у меня ломались боты

Ни одной из них нет в инструкциях. Каждая стоила мне от получаса до вечера. Телеграм давится тем, что написала нейросеть

Бот молчит, сообщение не уходит, в логах ругань про какой-то неподдерживаемый тег.

Дело вот в чём. Когда вы отправляете текст с жирным шрифтом и курсивом, Телеграм разбирает специальные символы и превращает их в оформление. А нейросеть иногда насыпает в текст что-то похожее на разметку, но кривое. У меня однажды модель зачем-то вставила в начало поста служебный комментарий из вёрстки сайта. Телеграм попытался это прочитать как оформление и упал.

Ломается от чего угодно: одинокая звёздочка, незакрытая скобочка, подчёркивание в середине слова.

С тех пор текст от нейросети я никогда не отправляю с включённым оформлением напрямую. Либо чищу перед отправкой, либо шлю совсем без разметки. На длинных постах особенно, там модель креативит охотнее. Одна кавычка ломает весь запрос

Когда бот отправляет данные куда-то наружу, он собирает их в строгую структуру, где каждая скобка и кавычка на счету. Если собирать её вручную, склеивая куски текста, рано или поздно прилетит имя клиента с апострофом или текст с переносом строки. И всё разваливается.

Лечится привычкой: не склеивать руками. Есть встроенная функция, которая соберёт структуру сама и подставит все служебные символы правильно. Выглядит менее наглядно, зато не падает от одной кавычки.

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

Несуществующая модель молчит вместо ошибки Самое противное. Опечатка в названии модели, или взяли имя из чужой статьи, а его уже нет у провайдера.

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

Человек не понимает, что бот думает Если бот пишет пост в несколько заходов — черновик, правка, чистовик, — это занимает минуты три. Для пользователя выглядит как «завис». И он жмёт кнопку ещё раз. И ещё. Каждое нажатие запускает всё заново. В итоге человек получает три поста подряд, платит за три генерации вместо одной и идёт писать в поддержку.

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

Просишь семь тем на выбор — получаешь семь строчек подряд без единого просвета. Читать невозможно, выбирать неудобно, человек закрывает. Чинится одним символом в том месте, где строчки склеиваются: разделять не одним переносом, а двумя. Пять секунд работы. А ощущение от бота меняется заметно.

Что общего Четыре истории из пяти вообще не про нейросети. Они про стыки: между моделью и мессенджером, между текстом и тем, что его принимает, между тем, сколько бот думает, и тем, сколько человек готов ждать. И ещё одно. Обычная программа, когда ломается, обычно честно об этом сообщает. А цепочка с нейросетью чаще возвращает пустоту или правдоподобный мусор, который спокойно едет дальше. Поэтому проверять то, что пришло, приходится на каждом шаге.

Стек: n8n (self-hosted), PostgreSQL, Telegram Bot API, OpenRouter, GPT / Claude / Gemini.