Привет, Хабр! 👋 Меня зовут Дима Косаревский, я инженер данных (DE), увлеченный Data Science и всем, что связано с этим направлением. Data Science позволяет извлекать ценную информацию из огромных объемов данных при помощи статистических и вычислительных методов. В последнее время эти ИИ, вроде ChatGPT, врываются прямо во все сферы. И вот благодаря увлечению Data Science можно использовать этих ботов, чтобы помогать людям, да ещё и пообщаться с ними на разные темы. ChatGPT действительно впечатляет. Он не только общается на разные темы, но еще и стихи сочинять умеет. Здорово, правда? Вот один из примеров, которые я получил недавно: Покоритель мира - ИИ, ChatGPT сулит грани новой жизни. Работу заберёт у многих, Страх испытавших горечь пламени. В ответственности вложена сила, Судьбы людей на блюдечке держа. ИИ слава без предела, В бесконечности вразумляя нас. Сайт ChatGPT иногда работает медленно, и для доступа к нему в некоторых странах, например в России, требуется VPN. Некоторые из моих друзей хотят протестировать ИИ без СМС и регистрации. Я решил эту проблему с помощью официального API ChatGPT и Streamlit. Давайте посмотрим как это сделать? Из этого туториала можно узнать: Как использовать ChatGPT API Как отобразить диалог с ботом в чате Как преобразовать текст в речь (TTS) Как сделать локализацию Как собрать все вместе в приложении Streamlit Хотите сразу к делу? Вот рабочее приложение и репозиторий с кодом. И сразу код. Сначала напишем несколько вспомогательных функций: Эти функции позволяют очистить состояние cессии Streamlit и отобразить область ввода пользовательского текста и кнопки чата. Взаимодействие с API: Эта функция принимает на вход два аргумента: ai_model, модель GPT, и messages, список сообщений чата для поддержания контекста диалога. Указываем ключ API, используя функцию секретов Streamlit, и создаём экземпляр класса ChatCompletion, используя метод create, передавая модель и сообщения. Когда API отвечает, функция возвращает результат в виде словаря (json): следующего вида: В целом, эта функция обеспечивает простой способ взаимодействия с API OpenAI и создания чат-бота. Параметр messages можно использовать для хранения истории разговоров и обеспечения контекстуальности и согласованности ответов чат-бота. В этом шаге можно увидеть код для отображения разговора в чате с использованием модели GPT. Код состоит из трех основных функций: show_chat, show_gpt_conversation и show_conversation. Тут на помощь приходит библиотека streamlit-chat. Она позволяет отображать чат с ботом в удобном формате. Функция show_chat отвечает за отображение сообщений разговора между ИИ и пользователем. В качестве аргументов он принимает ai_content (ответ от ИИ) и user_text (введенный пользователем текст). Сначала функция проверяет, отсутствует ли ai_content в списке st.session_state.generated. Если это не так, пользовательский ввод и созданный ИИ контент добавляются в списки st.session_state.past и st.session_state.generated соответственно. Если в списке st.session_state.generated есть сообщения, функция будет перебирать список и отображать сообщения пользователя, за которыми следуют ответы, сгенерированные ИИ, с использованием функции message. Функция show_gpt_conversation управляет потоком генерации ответа ИИ и отображения разговора пользователю. Сначала пытаемся вызвать функцию create_gpt_completion, чтобы сгенерировать ответ ИИ с использованием модели GPT и пользовательского ввода. Затем ответ ИИ (ai_content) добавляется в список st.session_state.messages . Если контент, сгенерированный ИИ, не пустой, функция вызывает функцию show_chat, чтобы отобразить сообщения разговора и обработать любые ошибки, если таковые имеются, с помощью блоков try-except. Функция show_conversation отвечает за управление состоянием беседы и обновление списка сообщений. Если в st.session_state.messages есть сообщения, ввод пользователя (st.session_state.user_text) добавляется к списку. Если сообщений нет, создается вводное сообщение ИИ с ai_role и добавляется в список, после чего следует ввод данных пользователем. Функция show_gpt_conversation вызывается для обработки потока разговора и генерации ответов ИИ. Разделение кода на эти функции позволяет легко настраивать поток общения между пользователем и ИИ и управлять им. Вспомогательные функции упрощают код, облегчая его чтение и поддержку. В функции show_gpt_conversation можно заметить вызов функции show_audio_player, но что там под капотом? Давайте посмотрим. Начнем с необходимых импортов: BytesIO из модуля io и предоставляет способ чтения и записи из байтового буфера. gTTS и gTTSError из библиотеки преобразования текста в речь, которая, внезапно, преобразует текст в речь. Теперь давайте посмотрим на функцию show_audio_player : Функция show_audio_player принимает параметр ai_content, который представляет собой текст, который будет отображаться и воспроизводиться как звук. При запуске функции, создав объект BytesIO. Этот объект будет хранить аудиоданные в памяти, что упростит воспроизведение аудио позже. Далее будем использовать блок try для обработки любых возможных ошибок при преобразовании текста в аудио. Внутри блока try создаём экземпляр объекта gTTS с заданным текстом и языком. ДалееgTTS преобразует входной текст на заданном языке в речь. Дальше происходит запись аудиоданных в буфер sound_file. Наконец, воспроизведится преобразование текста в речь, используя метод st.audio Streamlit. Если во время процесса возникают какие-либо ошибки, легко отлавливаем их и выводим информацию об исключении с помощью метода st.error. Функция show_audio_player готова. Она принимает строку в качестве входных данных, создает аудиофайл из текста, а затем воспроизводит его в приложении Streamlit. Если есть необходимость или желание сделать локализацию для нескольких языков - это легко сделать с помощью примера кода ниже:  В этом ⤴️ коде показано, как создать простую систему локализации приложения с двумя вариантами языка — Английским и Русским. Основными компонентами кода являются: Импортируются необходимые модули: dataclasses используются для создания структур классов данных, а typing используется для тайп-хинтов. Создаётся родительский класс данных Locale, содержащий общий атрибут ai_role_options для списка возможных ролей ИИ для всех поддерживаемых языков. Определяется два дочерних класса данных, EnLocale и RuLocale, которые наследуются от Locale и предоставляют фактические переводы для каждого фрагмента статического текста в приложении. Английские переводы предоставляются в EnLocale, а русские переводы — в RuLocale. Назначаются предопределённые роли ИИ для каждого языка с помощью AI_ROLE_OPTIONS_EN и AI_ROLE_OPTIONS_RU - это нам пригодится позже. Создаются экземпляры каждого дочернего класса данных, en для английского языка и ru для русского языка, с соответствующими списками ролей ИИ. При реализации локализации в приложении можно использовать соответствующий экземпляр (en или ru) в зависимости от выбранного языка, чтобы отображались правильные переводы для всех меток, сообщений и другого текста. Используя этот пример, можно легко выполнить локализацию для своего языка или даже для нескольких языков. Это просто, давайте посмотрим на код. Создать основную логику приложения можно следующим образом:  Этот код настраивает наше приложение с интерфейсом чата для взаимодействия с различными моделями ИИ. Импортирует необходимые библиотеки и модули. Определяет общие настройки, такие как заголовок страницы, иконку для страницы браузера и параметры языка. Настраивает конфигурацию страницы Streamlit с указанными параметрами. Создаёт горизонтальное меню выбора языка (английский или русский). Инициализирует значения состояния сеанса для хранения контекста разговора и пользовательского ввода. Определяет функцию main, которая содержит следующие элементы:  Выбор модели ИИ и переключения между типами ролей, а также выбор предопределённых или создание собственных ролей. Отображение истории разговоров с show_conversation, если пользователь ввел текст. Отображение поля ввода для пользователя, чтобы ввести свое сообщение с помощью show_text_input. Отображение ряда кнопок чата с помощью show_chat_buttons, чтобы пользователи могли управлять чатом и отправлять сообщения. Выполняет основную функцию main и отображает выбранный язык и название приложения. Отображение компонентов интерфейса чата на веб-странице. Спасибо за уделённое время, надеюсь моя статья была полезна! Теперь Вы можете создать своего ИИ-помощника или использовать AI Talks из любой страны без регистрации и СМС. VPN тоже не нужен. На момент написания поста доступны модели gpt-3.5-turbo и gpt-4, но не удивляйтесь, если gpt-4 будет отключен в продакшене из‑за высокой нагрузки. Если у вас есть вопросы, задавайте их в комментариях ниже или в Streamlit Discord app-sharing-gallery. Также можно задавать вопросы в Telegram в AI Talks Chat или смотреть за обновлениями приложения на канале AI Talks. Блог пост на английском можно почитать на веб-сайте Streamlit. Можно посмотреть видео в TikTok. Репозиторий с кодом ожидающий ваших issue, pr и звёзд 🙂. Успехов! 🎈  SE | DE