В этой статье я покажу, как создать свой телеграм-бот ChatGPT на базе библиотеки GPT4free.

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

Я был очень удивлен, когда увидел, что в интернете на базе бесплатной библиотеки для Python GPT4free делают проекты, за которые берут деньги! Один из таких проектов даже сделал подписку на токены; по моему мнению, это полнейший кринж — брать деньги за то, что в открытом доступе и, более того, базируется на сторонних веб-сервисах, которые и предоставляют доступ к ChatGPT. GPT4free — ни что иное как API к веб-мордам этих сервисов, а никакое не хакерство и уязвимость в API Open AI, как в новостях писали неграмотные журналисты. Использование веб-версий кардинально отличается от платного оригинального API Open AI со всеми вытекающими минусами в виде лимитов или блокировок по GEO IP. Стоит ли говорить, что 100% стабильности бесплатное решение не гарантирует? Кто те особо одаренные, кто платит таким товарищам, я не знаю, поэтому и пишу эту статью, чтобы любой мог пользоваться бесплатно.

Для создания телеграм-бота я буду использовать библиотеки Aiogram и g4f. Структурно для работы нам потребуется несколько вещей.

1) Хранить историю сообщений пользователя, так как ChatGPT по API не имеет памяти, соответственно, чтобы вести связный диалог, нужно отправлять всю его историю вместе с каждым сообщением. При использовании g4f, а не оригинального API максимальный размер такого диалога ограничивается контекстным окном. Мы не знаем размер этого контекстного окна у сервисов, поэтому в коде будут использоваться простейшие методы для обнаружения этого в виде принтов в консоль после каждого сообщения с указанием общей длины диалога.

2) Обрезать историю сообщений пользователя, для того чтобы не превышать размер контекстного окна: превышение приведет к ошибке. Также необходимо дать возможность вручную очищать историю диалога, например, чтобы начать беседу на новую тему.

3) Отправлять историю сообщений и получать ответ от ChatGPT.

import logging
from aiogram import Bot, Dispatcher, types
import g4f
from aiogram.utils import executor

# Включите логирование
logging.basicConfig(level=logging.INFO)

# Инициализация бота
API_TOKEN = 'ВАШ ТОКЕН ТЕЛЕГРАММ'
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)

# Словарь для хранения истории разговоров
conversation_history = {}

# Функция для обрезки истории разговора
def trim_history(history, max_length=4096):
    current_length = sum(len(message["content"]) for message in history)
    while history and current_length > max_length:
        removed_message = history.pop(0)
        current_length -= len(removed_message["content"])
    return history


@dp.message_handler(commands=['clear'])
async def process_clear_command(message: types.Message):
    user_id = message.from_user.id
    conversation_history[user_id] = []
    await message.reply("История диалога очищена.")

# Обработчик для каждого нового сообщения
@dp.message_handler()
async def send_welcome(message: types.Message):
    user_id = message.from_user.id
    user_input = message.text

    if user_id not in conversation_history:
        conversation_history[user_id] = []

    conversation_history[user_id].append({"role": "user", "content": user_input})
    conversation_history[user_id] = trim_history(conversation_history[user_id])

    chat_history = conversation_history[user_id]

    try:
        response = await g4f.ChatCompletion.create_async(
            model=g4f.models.default,
            messages=chat_history,
            provider=g4f.Provider.GeekGpt,
        )
        chat_gpt_response = response
    except Exception as e:
        print(f"{g4f.Provider.GeekGpt.__name__}:", e)
        chat_gpt_response = "Извините, произошла ошибка."

    conversation_history[user_id].append({"role": "assistant", "content": chat_gpt_response})
    print(conversation_history)
    length = sum(len(message["content"]) for message in conversation_history[user_id])
    print(length)
    await message.answer(chat_gpt_response)


# Запуск бота
if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)

Как видите, код очень простой, всего 66 строк. Это БАЗА. Если вы по непонятной причине планируете использовать бесплатный телеграм-бот в серьезных целях, то вам потребуется любая база данных для хранения истории пользователя. В текущем коде сообщения хранятся в памяти, и этого более чем достаточно даже для использования совместно с друзьями или коллегами. Также НИКОГДА не храните API ключи в самом коде, в примере это сделано нарочно для самых маленьких, чтобы уж точно запустилось у всех и не было вопросов в комментариях. Ссылка на исходники на гитхаб.

В переменной provider вы можете выбрать любой провайдер из тех, что доступны, посмотреть список можно на гитхабе.

Провайдеров с доступом к ChatGPT-4 не так много, и многие из них или нестабильны, или имеют ограничения по GEO IP, или требуют авторизацию либо cookies. В примере на гитхабе я использовал провайдера, который нормально относится к IP-адресам из России.

Из реально стабильно и постоянно работающих ChatGPT-4 провайдеров — bing, но для его использования нужен прокси или впн. Если устанавливать телеграм бота на VPS, лучше использовать зарубежный. В самой библиотеке gpt4free поддерживается использование прокси, но вот мое мнение: если уже есть прокси или впн, зачем тогда этот самый бинг в телеграм-боте нужен? Можно же его использовать в оригинальном виде. Chat.geekGPT и phind тоже работают, но с переменным успехом. Я лично рекомендую использовать провайдеров ChatGPT 3.5: там и с IP из России можно, и не нужно париться с cookies; да и работа быстрая и относительно стабильная.

Для того чтобы использовать прокси, нужен следующий код:

response = await g4f.ChatCompletion.create_async(
            model=g4f.models.default,
            messages=chat_history,
            provider=g4f.Provider.GeekGpt,
            proxy="http://host:port",
    # or socks5://user:pass@host:port
    timeout=120,  # in secs
        )
        chat_gpt_response = response

Для выбора провайдера можно запускать телеграм-бот прямо из IDE и смотреть в консоли принты для отладки, чтобы определить максимальное контекстное окно выбранного провайдера. Просто пишите боту сообщения, можно сразу копипастить большие и смотреть, сколько символов они занимают; в коде для упрощения считаются только символы сообщений пользователя и ответы ChatGPT — то, что в словаре по ключу content. Технические данные не считаются, да и это не нужно. Надо понимать: это контекстное окно модели — 4096 токенов, либо 16384. Либо вообще что-то маленькое и ограниченное; да, есть и такие модели, но их лучше не использовать.

Инструкция по созданию телеграм-бота на Linux Ubuntu в картинках для самых маленьких

Для начала идем в телеграм-бот @BotFatherи пишем команду /newbot; далее выбираем название бота. Следующим сообщением нужно выбрать username — в конце обязательно нужно указать _bot по принципу, как сделано на скриншоте. Все, ваш бот создан.

Копируем токен бота в код.

# Инициализация бота
API_TOKEN = 'ВАШ ТОКЕН ТЕЛЕГРАМ'
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)

Далее сразу нужно создать кнопку в меню для очистки истории диалога, чтобы потом не возвращаться к этому. Пишем команду /mybots. Выбираем свой бот. Нажимаем Edit bot, далее Edit commands. Затем пишите clear — очистка истории сообщений. Теперь при написании команды или выборе в меню /clear будет очищаться диалог с пользователем.

Для работы на винде, например в IDE для тестов, достаточно запустить IDE, создать окружение, клонировать код с гитхаба или вручную скопировать в папку, далее ввести в терминале pip install -r requirements.txt и заменить API_TOKEN на токен вашего телеграм-бота, который вы только что получили.

На Ubuntu вам придется создать папку; я для удобства использую winSCP, вы можете использовать что удобно, в том числе клонировать с гита и перейти в папку командой.

Запускаем Putty и подключаемся к серверу либо из терминала:

git clone https://github.com/LORD-A-B/Telegram-bot-gpt4free.git
cd Telegram-bot-gpt4free

Либо создаем папку в WinSCP, копируем в нее main.py и requirements.txt. А затем переходим туда в консоли командой:

cd названиепапки

Обновляем список пакетов:

sudo apt update

По умолчанию в ubuntu уже установлен Python, проверяем командой:

python3 --version
pip3 --version

Обычно менеджер пакетов pip3 не установлен в Ubuntu, устанавливаем командой:

sudo apt install python3-pip

Также установите виртуальное окружение venv командой:

sudo apt install python3.10-venv

Далее убедитесь, что вы находитесь в нужной вам папке. Если нет — воспользуйтесь командой cd, а также командой ls и проверьте, содержатся ли в папке нужные вам файлы.

Создаем виртуальное окружение внутри папки:

python3 -m venv venv

Активируйте виртуальное окружение командой:

source venv/bin/activate

Установите необходимые библиотеки командой:

pip install -r requirements.txt

Теперь нужно сделать так, чтобы бот автоматически запускался и был активен при старте сервера. Идем в папку /etc/systemd/system/ и создаем любым удобным вам образом, я рекомендую через winSCP. Файл tgbot.service, в нем пишем:

[Unit]
Description=My Telegram bot

[Service]
WorkingDirectory=/tgbot/
User=ИМЯ ПОЛЬЗОВАТЕЛЯ ЗАМЕНИТЕ НА СВОЕ
ExecStart=/tgbot/venv/bin/python3 /tgbot/main.py

[Install]
WantedBy=multi-user.target

Замените в тексте имя пользователя на свое, а также tgbot замените на вашу директорию с папкой.

Далее используйте следующие команды:

sudo systemctl daemon-reload
sudo systemctl start tgbot.service
sudo systemctl enable tgbot.service

Ваш бот готов, чтобы проверить его статус, используйте команду:

sudo systemctl status tgbot.service

Все готово, тут все очень легко. Если выдает ошибку 403, значит, ваш IP провайдеру не нравится по каким-то причинам.

В данный момент я готовлю к релизу программу, ассистент на базе ChatGPT для Windows, который помогает проходить собеседования (лайв-кодинг, тестовые задания), а также его можно просто использовать как обычный ChatGPT, но без VPN, на базе оригинального API или на базе того же GPT4free. От аналогичных программ моя отличается тем, что имеет распознавание изображения и текста, сразу передает в ChatGPT и выводит ответ, также имеется режим невидимости, что очень полезно для собеседований и лайв-кодинга. В режиме невидимости интерфейс программы не видно, а ответы отправляются в ваш личный телеграм-бот. Программу я уже протестировал на прохождении собеседований. Когда все будет готово, тоже напишу статью. Если интересно, заходите в телеграм. https://t.me/game_2hard

Комментарии (14)


  1. janvarev
    05.12.2023 12:36
    -4

    Поскольку g4f бесплатный и относительно широко используемый проект, там провайдеры доступа к ChatGPT постоянно вылетают.

    Кому нужен стабильный доступ - используйте стабильный прокси из России к OpenAI API, например https://habr.com/ru/articles/762248/, там цена-то за обработку сообщения копеек 30-50... Имхо время, потраченное на апдейты g4f и постоянную борьбу с обрывами сильно дороже будет.


    1. janvarev
      05.12.2023 12:36
      -4

      В общем, если кому вдруг нужно - адаптированная опенсорс версия этого бота здесь: https://github.com/janvarev/Telegram-bot-vsegpt

      Эту можно использовать с любым классическим OpenAI API endpoint, но по умолчанию он установлен на VseGPT. Установка аналогична описанному автору в статье.


      1. ZeroBot-Dot
        05.12.2023 12:36
        +10

        Интересно, а почему же он по умолчанию на VseGPT?

        А, понятно.


        1. CodeDroidX
          05.12.2023 12:36
          +3

          Мда, ничего не имею против vsegpt или непосредственно его автора, но такой наглый self promo я давно не видел)


          1. janvarev
            05.12.2023 12:36
            +1

            Выкладывание в опенсорс кода считается агрессивным self-promo? :))

            Автор выложил оригинал, я форкнул и отредактировал - да, под свой проект, не скрываю, в общем.

            Если есть желание - делаем форк под свои нужды.


        1. janvarev
          05.12.2023 12:36

          Вообще-то я не скрываю, что являюсь основным автором сервиса; не знаю, что уж вы тут нашли такого удивительного.


    1. Lord_Alzov Автор
      05.12.2023 12:36
      +2

      Модели 3.5 достаточно стабильны, зачем кому-то платить за это? выглядит как открытая реклама в комментах. Кто хочет заплатить, будет пользоваться оригиналом OPEN AI.


      1. CodeDroidX
        05.12.2023 12:36
        +3

        Паразитирование на чужом интеллектуальном труде - выглядит именно так, как и должно.

        Начинающему автору спасибо за лёгкий в чтении текст и исходник, с которым можно будет поиграться!


        1. janvarev
          05.12.2023 12:36

          Использование g4f - реверс-инжиниринга и абуза сервисов для прокидывания запросов к ChatGPT - "ок, круто!"

          Предложение использовать стабильный платный коннект - "агрессивное промо, паразитирование на чужом труде"

          Ну, ок, ок...


  1. RichardMerlock
    05.12.2023 12:36

    Телеграм бот с гпт конечно круто, но как прикрутить чатгпт к личному аккаунту?


    1. Lord_Alzov Автор
      05.12.2023 12:36

      Что подразумевается под личным аккаунтом? К Оригинальному Open AI API ? Он платный за каждое сообщение нужно платить за токены.


      1. RichardMerlock
        05.12.2023 12:36

        Как взаимодействовать с openai понятно. Проблема с тем как автоматически взаимодействовать с собственным аккаунтом в телеге, чтобы забирать из чата сообщение от человека, который в телеге написал мне и возвращать ему в чат результат манипуляций с openai. Как прикрутить внешнюю логику к личному телеграм аккаунту? Чтобы когда надо самому отвечать, то общаешься как обычно, а когда отходишь покурить, включаешь openai поболтать.


  1. Constantine174RUS
    05.12.2023 12:36
    +1

    Однозначно +, теперь вопрос. Как узнать когда автор сделает программу и выложит? Я из тех кто платит посредникам за доступ....


    1. Lord_Alzov Автор
      05.12.2023 12:36
      +1

      Бесплатные версии не стабильны, и там часто нет многих новых функий типа генерации картинок итд. Сама программа так то готова уже. Сейчас тестово делаю модуль распознавания речи с микрофона, для помощи во время собеседований+возможность вести стенограмму и анализ. Т.е в программе будет бесплатный режим на базе gpt4free кому этого хватает и оригинальный по API OPEN AI.