sendRichMessageDraft позволяет показывать статусы инструментов, а параметр can_stop включает кнопку Stop. - Без обновлений черновик исчезает через 30 секунд, поэтому его нужно обновлять по событиям и таймеру. ### 🔍 Что обнаружено Автор статьи на Хабре, Иван Магда, разобрал работу агента swift-claw, который ищет обзоры наушников, читает страницы и проверяет отзывы о микрофонах. Чтобы пользователь видел ход выполнения, бот использует sendRichMessageDraft с тегом <tg-thinking> в rich_message.html. Статусы обновляются отправкой запроса с тем же draft_id — так Telegram заменяет содержимое существующего черновика. Кнопка Stop активируется параметром can_stop. Для привязки статусов к вызовам инструментов нужны события начала и завершения: при старте добавляется шаг с понятной подписью, при завершении записывается результат. Несколько событий объединяются в одно обновление черновика. Весь динамический текст (поисковые запросы, заголовки страниц) экранируется перед вставкой в HTML. Когда агент завершил работу, готовый ответ отправляется через sendRichMessage — в нём блок <tg-thinking> не используется, так как он допустим только в черновиках. Это сохраняет итоговое сообщение в истории чата. ### 💡 Почему это важно Такой подход превращает пустой чат с надписью «печатает…» в наглядную панель состояний. Пользователь видит, на каком этапе находится агент: поиск, чтение источника, обработка результата. Анимированные эмодзи из набора AIActions дополняют текстовые статусы, а кнопка Stop позволяет остановить задачу, если она пошла не туда. Примеры в статье используют HTTP и псевдокод, поэтому реализацию можно перенести в бота на любом языке или фреймворке. ### 🧩 Контекст В статье упоминаются предыдущие разборы на Хабре: стриминг через sendMessageDraft и формат Rich Messages. Здесь эти возможности собраны в единый интерфейс для агента, который выполняет несколько действий перед финальным ответом. Важно помнить про таймер: если инструмент работает дольше 30 секунд, черновик нужно периодически обновлять, даже когда текст статуса не меняется. Иначе блок состояния исчезнет, пока агент ещё выполняет задачу.Источник: habr.com · пост в Telegram