Рассмотрим создание приложения для работы с ChatGPT. Его задача будет заключаться в том, чтобы принимать голосовые сообщения через Телеграм, преобразовывать их в текст, передавать в ChatGPT и присылать ответ обратно в Телеграм. В процессе создания необходимо будет пройти следующие этапы:

  1. Создание бота для Телеграм и его базовая настройка.
  2. Получение файла с голосовым сообщением (Телеграм использует формат .oga).
  3. Преобразование файла из OGA в MP3.
  4. Передача файла MP3 в сервис Whisper для преобразования в текст.
  5. Отправка полученного текста в ChatGPT.
  6. Отправка ответа от ChatGPT пользователю в Телеграм.

Создание бота для Телеграм и его базовая настройка

Все начинается с самого факта регистрации бота. И для этого Телеграм использует свой специальный бот - BotFather. Необходимо написать ему и пройти простые последовательные шаги.

Telegram BotFather

Как результат у вас должна появиться ссылка на вашего бота, а также токен для запросов к его API.

Теперь можно перейти к настройке бота в AppMaster. Самый простой способ это сделать - установить соответствующий модуль. Нужно лишь выбрать его в списке модулей и указать свой API токен в настройках.

Модуль Телеграм

В вашем проекте автоматически будут созданы необходимые модели, появятся блоки для работы с Телеграм, а также базовый бизнес-процесс Telegram: Echo. Его стоит рассмотреть внимательно и понять принцип работы.

Бизнес процесс Telegram Echo

На вход он получает сообщение из Телеграм (модель Message). Она содержит текст отправленного сообщения (text), а также модель chat из которой можно получить идентификатор отправителя (id). Последний блок Telegram: Send Message отправляет полученное сообщение обратно отправителю, но уже от имени бота. Можно воспользоваться данным бизнес-процессом для начального тестирования работы бота и связи с ним. Для этого необходимо создать эндпойнт, который и будет принимать информацию и запускать бизнес-процесс.

Эндпойнт Телеграм

При его создании важно отключить Middleware Token Auth. Эндпойнт должен быть открыт для использования без авторизации.

Принцип работы бота Телеграм довольно простой - все сообщения, которые будут ему отправлены, попадают на специальный webhook, который автоматически может передать их дальше, отправить на выбранный вами эндпойнт для дальнейших действий.

Соответственно остается последний шаг для активации бота - нужно зарегистрировать данный эндпойнт в Телеграм и указать, что данный бот должен быть связан именно с ним. Для этого требуется отправить Post-запрос с полным url эндпойнта и указанием токена вашего бота вместо {Bot API Token} на адрес

https://api.telegram.org/bot{Bot API Token}/setWebhook

Если в ответ вы получите такое сообщение, то все было сделано верно.

 {

    "ok": true,

    "result": true,

    "description": "Webhook was set"

}

POST запрос на вебхук Телеграм

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

Получение файла с голосовым сообщением

Модуль Телеграм предназначен прежде всего для работы с текстовыми сообщениями. А наша задача заключается в том, чтобы получить файл с голосовым сообщением. С помощью AppMaster можно легко решить и эту задачу.

Для начала нужно проанализировать, что мы вообще получаем из Телеграм, разобрать структуру сообщения. Для этого предназначен блок Get Request Body. Он избавляет от необходимости заранее прописывать структуру запроса и позволяет получить запрос целиком, независимо от его содержания. Данный блок отдает результат запроса в виде набора байт и можно воспользоваться блоком To String для того, чтобы представить результат в понятной для человека форме, а также сохранить его в логах (блок Write to Log) для дальнейшего анализа.

Лог запроса

Сразу можно отметить, что из всего запроса нас интересуют два параметра:

  1. Идентификатор отправителя - в запросе прописан как "id":300493858
  2. Идентификатор файла - "file_id":"AwACAgIAAxkBAAMzZBk6QRvO-OYWsWUC-Bu1UXDM2FwAAkktAAKTZclIWTSkfTTw8wYvBA"

Можно создать свою модель, которая соответствует запросу и использовать ее для получения нужных полей. Но быстрее будет создать регулярное выражение (Regex) и использовать его. Для этого блок String Match Regex принимает на вход само выражение, а также строку, в которой будет проверяться совпадение с данным выражением.

В первом случае подойдет выражение "id":\d+

В результате получим строку "id":300493858 из которой нужно будет удалить лишнее ("id":) с помощью блока Replace String и оставить только сам идентификатор.

Во втором случае принцип точно такой же, но используется чуть более сложное выражение: "file_id":"[^"]+

Regex для получения ID из запроса

Теперь у нас есть идентификатор отправителя, идентификатор файла и можно использовать его для получения самого файла. Чтобы это сделать нужно обратиться к API Телеграм. Это уже делали ранее, когда регистрировали эндпойнт бота. Теперь нужно сделать подобный запрос, но уже для получения файла. {File ID} в URL запроса необходимо заменить на полученный идентификатор файла.

https://api.telegram.org/bot{Bot API Token}/getFile?file_id={File ID}

Для отправки запроса и получении его результата используем блок HTTP Request, указав для него в качестве параметров URL и Method = GET.

Запрос на получение файла из Телеграм

Из полученного ответа можно узнать относительный путь к файлу, он передается в параметре "file_path". Соответственно с помощью очередного регулярного выражения ("file_path":"[^"]+) можно извлечь нужно значение и соединить с “https://api.telegram.org/file/bot{Bot API Token}/” для получения полной ссылки на файл.

Преобразование файла из OGA в MP3

Файл получен, но препятствие в том, что сервис Whisper не поддерживает работу с форматом OGA. Требуется выполнить конвертацию в один из подходящих форматов.

В качестве примера используется сервис Zamzar (его бесплатный тариф поддерживает возможность сделать 100 преобразований в месяц) и конвертация в MP3.

Можете обратиться к его документации за подробностями, или использовать другой аналогичный сервис. Не будем разбирать работу с ним детально, рассмотрим лишь ту часть, которая относится непосредственно к реализации на AppMaster.

Прежде всего, для запроса понадобятся правильные аутентификационные данные. Их необходимо предоставить в формате Basic Authentication. Для этого в запросе нужно передать заголовок со значениями:

Key = 'Authorization'

Value = 'Basic '+ ID пользователя и пароль разделенные знаком “:” в формате base64

Ключ API, полученный при регистрации в сервисе, является ID пользователя. К нему нужно добавить “:” и закодировать в формат Base64 c помощью блока To Base64. Результат нужно превратить в заголовок (блок Make Key-Value (String)).

Auth заголовок Zamzar

Следующий шаг - создание модели для запроса в дизайнере базы данных. Запрос должен быть отправлен в формате Multipart Form, соответственно необходимо подготовить модель формы данного запроса. В нашем примере модель состоит из трех полей типа String:

  • source_file - полный путь к исходному файлу (его узнали на предыдущем этапе).
  • source_format - формат исходного файла, в данном примере это фиксированное значение “ogg”.
  • target_format - целевой формат для преобразования. Можно выбрать любой формат, который поддерживается Whisper. В качестве примера используем “mp3”.

Модель для запроса Zamzar

В редакторе бизнес процесса необходимо воспользоваться блоком Make для заполнения данных модели и отправить ее POST-запросом на https://sandbox.zamzar.com/v1/jobs/ с помощью блока HTTP Request (обязательно указать Serialize request body = Multipart Form).

Запрос Zamzar для конвертации

Стоит учесть, что данный запрос не возвращает преобразованный файл, а только создает задачу по его преобразованию. За результатом нужно обращаться отдельно, а для этого понадобится ID созданной задачи. Данный ID необходимо получить из тела ответа на запрос, а для этого проделать уже отработанный процесс с использованием регулярных выражений и извлечения значения id.

За результатом преобразования необходимо обращаться отдельно. Для этого потребуется еще два запроса. Первый - чтобы узнать готов ли результат. Второй - чтобы забрать готовый файл. При этом нам неизвестно точное время готовности, поэтому можно организовать цикл, который будет слать повторяющиеся запросы для проверки готовности через определенные промежутки времени (например, каждую секунду).

Цикл проверки конвертации Zamzar

HTTP Request необходимо отправить методом GET на URL https://sandbox.zamzar.com/v1/jobs/{id}, где {id} - это id задачи, полученный на предыдущем шаге. При этом используются те же самые заголовки, что и в предыдущем запросе.

Из полученного ответа нужно узнать статус готовности. В случае завершения преобразования ответ будет содержать "status":"successful" и для нас это является сигналом того, что можно завершить работу цикла и двигаться дальше.

Помимо статуса, в ответе должен содержаться идентификатор готового файла ("target_files":[{"id":). Его необходимо извлечь для получения итоговой ссылки на файл в виде https://sandbox.zamzar.com/v1/files/{ID}/content

При этом получение файла доступно только авторизованным пользователям, поэтому необходимо выполнить HTTP Request с использованием таких же заголовков, как в и предыдущих запросах.

В результате запроса будет получено содержимое файла, которому необходимо присвоить какое-то имя и сохранить для дальнейшего использования.

Сохранение конвертированного файла Zamzar

Передача файла MP3 в сервис Whisper для преобразования в текст

Теперь все готово для следующего этапа - отправка файла с голосовым сообщением для распознавания. Для этого потребуется очередной запрос в формате Multipart Form. Только в отличие от предыдущего примера, в запросе нужно будет передавать сам файл, а не ссылку на него.

Модель для подобного запроса можно создать в разделе External HTTP Request. При этом можно не создавать запрос полностью, а ограничиться только лишь созданием модели тела запроса. Сама модель состоит из двух параметров:

File (тип Virtual File) - тот самый файл, который необходимо распознать.
model (тип String) - здесь укажем значение whisper-1.

Модель запроса Whisper

Также для запроса необходимо получить ключ для работы с API OpenAI и сформировать заголовок авторизации типа Bearer Token.

Key = 'Authorization'

Value = 'Bearer '+ OpenAI API Key

Далее можно отправлять сам POST-запрос на распознавание голосового сообщения в сервис Whisper на URL https://api.openai.com/v1/audio/transcriptions

HTTP запрос Whisper

В результате успешного распознавания файла будет получен ответ в виде {"text":"Hello world.”}

Отправка полученного текста в ChatGPT

Для отправки запроса в ChatGPT можно продолжать пользоваться блоками HTTP Request. Изучить документацию по API, а также самостоятельно сформировать модели для запросов и ответов. Но можно использовать и более простой вариант в виде готового модуля от AppMaster для работы с OpenAI, который необходимо установить в разделе модулей.

Модуль OpenAI

В минимально достаточном варианте требуется только указать параметры модели OAI ChatCompletionMessage (role = user, content = посылаемое сообщение), добавить ее в массив и отправить запрос в ChatGPT блоком OpenAI: Create Chat Completion (в параметре model прописать gpt-4).

Запрос OpenAI

В результате получаем ответ от ChatGPT. Считываем его из параметра content модели OAI ChatCompletionChoice.

Ответ от ChatGPT

Отправка ответа от ChatGPT пользователю в Телеграм

Последним этапом остается только повторить то, что уже делали ранее - отправить сообщение в Телеграм. Но если начинали мы с того, что просто возвращали сообщение обратно отправителю, то теперь это сообщение запустило серию разнообразных действий и результат возвращается в виде ответа от ChatGPT.

Отправка ответа от ChatGPT в Телеграм

В процессе разработки подобного бота стоит учесть:

  1. Телеграм работает так, что каждый запрос переданный ботом должен успешно отработать. В противном случае он будет многократно пытаться повторить его, а значит в случае каких-то проблем вы будете получать его снова и снова. Убедитесь, что логика построена таким образом, что запрос не приводит к ошибке и может быть успешно отработан.
  2. Не все запросы будут выполняться так, как задумано, с первой попытки. Потребуется производить поиск ошибок, а для этого расставлять блоки Write to Log. Они пригодятся, как для того, чтобы проверить, что каждый блок действительно получает те данные, которые вы планировали передать, так и для того, чтобы проанализировать результат работы блока и детально изучить ответ.
  3. В рамках руководства мы исходили из того, что все запросы предсказуемы, выполняются успешно и процесс довольно линеен. На практике необходимо будет предусмотреть разнообразные варианты действий (например, что делать в том случае, если пользователь отправит текстовое сообщение вместо голосового, или вообще картинку) и обработки ошибок (проверять статус HTTP-запросов, учитывать различные варианты ответов). 
Was this article helpful?

AppMaster.io 101 Полный курс

10 модулей
2 недели

Не знаете с чего начать? Начните с нашего ускоренного курса для начинающих и изучите AppMaster от А до Я.

Начать обучение
Development it’s so easy with AppMaster!

Остались вопросы?

Наши эксперты с радостью ответят на все ваши вопросы о платформе AppMaster и помогут вам в создании приложений.

headphones

Служба поддержки

Поделитесь своей проблемой с нашими специалистами.

message

Комьюнити AppMaster

Обсудите вопросы с другими пользователями в нашем чате.

Присоединиться