Как бот формирует сообщения на основе полученной информации
Что проверяют
Понимаете ли вы путь сообщения в боте целиком: откуда пришло обновление, где живёт логика, как собирается текст и что ограничивает отправку. Следом обычно спрашивают, как бот помнит контекст диалога и что делать с длинными ответами.
Как отвечать
Возьмите конкретную площадку, чаще всего это Telegram и aiogram 3 или python-telegram-bot, обе асинхронные. Каркас такой:
- приём: обновления приходят через long polling (
getUpdates) или вебхук. В проде обычно вебхук за веб-сервером, для разработки polling; - маршрутизация: роутер и фильтры выбирают обработчик по команде, тексту,
callback_dataкнопки или текущему состоянию диалога; - состояние: многошаговые сценарии держат в FSM.
MemoryStorageгодится для разработки, в проде нуженRedisStorage, иначе рестарт обнуляет все диалоги; - данные: запрос в базу или внешний API асинхронным клиентом,
httpxилиaiohttp. Синхронныйrequestsвнутри обработчика блокирует весь event loop; - формирование: отдельная функция принимает данные и возвращает текст и клавиатуру. Шаблоны на f-строках или Jinja2, разметка через
parse_modeHTML, всё пользовательское экранируется. Кнопки собираются вInlineKeyboardMarkup; - отправка:
message.answer()илиbot.send_message().
Ограничения Telegram стоит назвать: текст сообщения до 4096 символов, подпись к медиа до 1024, callback_data до 64 байт. В один чат разумно слать не чаще сообщения в секунду, на массовую рассылку около 30 сообщений в секунду. На превышение API отвечает кодом 429 с retry_after, который надо выдержать.
Если ответ генерирует LLM, это просто ещё один источник данных: промпт собирается из фактов, ответ проверяется и обрезается под лимит перед отправкой.
Где спотыкаются
Не экранируют ввод пользователя в HTML или MarkdownV2. Первое же имя с символом < или _ даёт ошибку can't parse entities, и сообщение не уходит.
Не режут длинный текст. Список из ста позиций упирается в 4096 символов, нужна разбивка на части или пагинация кнопками.
Смешивают в одном обработчике запрос, форматирование и отправку. Такой код не тестируется и на второй же ветке сценария превращается в простыню условий.