
Реализация Statefull команд в Telegram API
KpoccoB_ok 20 минут назад Реализация Statefull команд в Telegram API Средний 5 мин 606 Java * Кейс Из песочницы ПроблемаНа протяжении года мы с моей командой пишем телеграмм ботов для коммерческого использования малыми...
В сфере искусственного интеллекта произошло заметное событие. KpoccoB_ok 20 минут назад Реализация Statefull команд в Telegram API Средний 5 мин 606 Java * Кейс Из песочницы ПроблемаНа протяжении года мы с моей командой пишем телеграмм ботов для коммерческого использования малыми бизнесами (аутсорсинг) и столкнулись с большим количеством проблем, самая неприятная из которых это реализация statefull через stateless. Эта проблема знакома всем разработчикам, которые пытались реализовать заполнение формы в TelegramApi. Разработчики придумывают всякие костыли для этого, потому что в эталонном REST API поддержка состояния от запроса к запросу это нарушение REST-паттерна, однако при заполнении формы приходится использовать состояние.
АктуальностьПервый раз я столкнулся с этой проблемой на первом курсе университета в 2024 году. После долгого серчинга мне пришлось смириться с тем что сегодня за меня код будет писать LLM (вернее помогать). Информации и правда мало, что очень странно, так как проблема нерешенная.
Технические детали
Например неделю назад, в довольно распространенном боте @MergeBot, который специализируется на записи данных о мигренях мне попался странный баг: если достаточно быстро нажать 2 раза на одну и ту же inline-кнопку ответа на первый вопрос, то бот начинает спрашивать третий вопрос, вместо того чтобы перейти ко второму, причем в ответе на второй вопрос даже нету варианта ответа как в первом. А это значит что реализация состояния на сервере работает с помощью последовательного заполнения формы от запроса к запросу. 3 Проблемы реализации statefull через RESTНеидемпотентная обработка callback’овОдин и тот же пользовательский action может быть доставлен или обработан больше одного раза.
Если обработчик каждый раз двигает состояние вперёд, пользователь перескакивает через шаги формы. Нарушение инвариантов сценарияПользователь может отправить ответ не на тот вопрос, повторить старую кнопку, нажать callback из предыдущего сообщения или вызвать команду параллельно с текущим flow. Невоспроизводимость состоянияЕсли сервер хранит только currentStep, невозможно понять, как пользователь туда попал, какой ответ был на предыдущих шагах и где именно flow сломался.
Наивная реализацияРазработчики, знающие как работает Spring Context под коробкой догадались до реализации сразу. Напомню: Spring Context это просто Map, то есть структура, которая позволяет получать объект в любом месте программы без явного DI (Dependency Injecton). Поэтому мой выбор первой реализации по аналогии пал на Map.
Это максимально логичная реализация в рамках однопоточного telegram flow. Серверу приходит объект Update в котором есть вся информация об отправителе и контенте:Работа с объектом UpdateТаскать такой объект с огромным количеством полей глупо (Да и не очень хорошо зависеть от реализации Telegram, вдруг завтра мне понадобится перенести бота в ВК), поэтому был написан API для работы с Update: RequestPOJO/AnswerPOJO. 2) Парсим поля которые нам нужны из Update и дальше уже работает с RequestPOJO.
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.





