Skip to content

Instantly share code, notes, and snippets.

@Priler
Created February 28, 2023 17:19
Show Gist options
  • Star 15 You must be signed in to star a gist
  • Fork 8 You must be signed in to fork a gist
  • Save Priler/1c4e02e2aada2764d4cb0af20e4ff3e5 to your computer and use it in GitHub Desktop.
Save Priler/1c4e02e2aada2764d4cb0af20e4ff3e5 to your computer and use it in GitHub Desktop.
Python Aiogram ChatGPT simple bot via OpenAI
TOKEN = "<telegram-bot-token>" # obtained from @BotFather
OPENAI_TOKEN = "<openai-api-key>" # obtained from https://platform.openai.com/account/api-keys
# Телеграм бот ChatGPT
import config
import logging
import openai
import asyncio
from gpytranslate import Translator
from aiogram import Bot, Dispatcher, executor, types
# log
logging.basicConfig(level=logging.INFO)
# init translator
t = Translator()
# init openai
openai.api_key = config.OPENAI_TOKEN
# init aiogram
bot = Bot(token=config.TOKEN)
dp = Dispatcher(bot)
@dp.message_handler()
async def gpt_answer(message: types.Message):
# await message.answer(message.text)
model_engine = "text-davinci-003"
max_tokens = 128 # default 1024
prompt = await t.translate(message.text, targetlang="en")
completion = openai.Completion.create(
engine=model_engine,
prompt=prompt.text,
max_tokens=max_tokens,
temperature=0.5,
top_p=1,
frequency_penalty=0,
presence_penalty=0
)
await message.answer("ChatGPT: Генерирую ответ ...")
translated_result = await t.translate(completion.choices[0].text, targetlang="ru")
await message.answer(translated_result.text)
# run long-polling
if __name__ == "__main__":
executor.start_polling(dp, skip_updates=True)
@seriesilia
Copy link

async defgpt_answer (message: types.Message):
Опечатка

@seriesilia
Copy link

async def gpt_answer (message: types.Message):

@bl4km0uz
Copy link

bl4km0uz commented Mar 1, 2023

Позволю себе сообщить о минусах в данной реализации:

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

@OlegBondarUA
Copy link

OlegBondarUA commented Mar 2, 2023

пользуйся нормальной фичей такой как .env и импортируй через os или python-decouple так и правильнее и новички сразу норм учится будут

@Priler
Copy link
Author

Priler commented Mar 2, 2023

пользуйся нормальной фичей такой как .env и импортируй через os или python-decouple так и правильнее и новички сразу норм учится будут

Данный проект не предназначен для деплоя куда-либо в принципе, поэтому и от env смысла нет

@Priler
Copy link
Author

Priler commented Mar 2, 2023

Позволю себе сообщить о минусах в данной реализации:

  1. Проблема с переводом кусков текста с английского на русский и обратно. Переводит только по 1 слову.
  2. Ты не сможешь пообщаться и по практиковать английский с чат ботом, он всегда отвечает на русском.
  3. Бот плохо умеет в диалог, т.е. задать уточняющий вопрос ему смысла нет, т.к. он не помнит, что отвечал одним сообщением ранее.
  1. На моем компьютере всё работает (но либа сырая, надо юзать оф. метод гугл транслейта с ключами и лимитами)
  2. Как вариант добавить возможность выбирать язык
  3. Надо смотреть библиотеку OpenAI, возможно она поддерживает функцию создания новых диалоговых сессий

@GeorgyDanberg
Copy link

А кто-нибудь сталкивался с проблемой, что в pycharm отваливается asyncio и как ее решал?

@Gip-dip
Copy link

Gip-dip commented Mar 3, 2023

Немного доработал, что думаете по этому поводу?

Отслеживание предыдущих ответов

previous_responses = {}

filename = "users.txt"

Обработка входящих сообщений

@bot.message_handler(func=lambda message: True)
def handle_message(message):
user_id = message.from_user.id
user_message = message.text

if not os.path.exists(filename):
    with open(filename, "w") as f:
        pass

try:
    with open(filename, "r+") as f:
        contents = f.read()
        if str(user_id) not in contents:
            f.seek(0, 2)
            f.write(str(user_id) + "\n")
except IOError as e:
    print(f"An error occurred while accessing the file: {e}")

# Хранение всей истории сообщений пользователя
if user_id not in previous_responses:
    previous_responses[user_id] = []
previous_responses[user_id].append(user_message)

# Создание контекста из всей истории сообщений пользователя
context = " ".join(previous_responses[user_id])

# Создание ответа с помощью API OpenAI
try:
    response = openai.Completion.create(
        engine="text-davinci-003",
        prompt=f"{context}\n",
        max_tokens=1024,
        n=1,
        stop=None,
        temperature=0.5,
    ).choices[0].text
except Exception as e:
    print(f"Ошибка при генерации ответа: {e}")
    response = "Извините, возникла ошибка при генерации ответа."

# Обновление истории ответов пользователя
previous_responses[user_id].append(response)

# Отправка ответа пользователю
bot.reply_to(message, response)

Запуск бота

while True:
try:
bot.polling()
except Exception as e:
print(f"Ошибка опроса: {e}"

@dako03
Copy link

dako03 commented Mar 27, 2023

А кто-нибудь сталкивался с проблемой, что в pycharm отваливается asyncio и как ее решал?

нашел ответ?

@Flarit228
Copy link

как вообще запустить бота, и обязательно ли нужен свой api?

@KusGrozzy
Copy link

KusGrozzy commented Apr 24, 2023

ВНИМАНИЕ!! Чтобы убрать переводчик, нужно сделать следующие изменения:

  1. Нужно заменить в 33 строке c "prompt=prompt.text," на "prompt=message.text,"
  2. Нужно заменить в 43 строке с "await message.answer(translated_result.text)" на "await message.answer(completion.choices[0].text)"
  3. Нужно удалить строки 6, 14, 30, 42

И все! Теперь chatGPT будет писать на таком языке, на котором вы задали ему вопрос.

@rndojshdg
Copy link

рабочий код # Телеграм бот ChatGPT
import config
import logging
import openai
import asyncio
import os

from aiogram import Bot, Dispatcher, executor, types

log

logging.basicConfig(level=logging.INFO)

init translator

init openai

openai.api_key = ""

init aiogram

bot = Bot(token="")
dp = Dispatcher(bot)

@dp.message_handler()
async def gpt_answer(message: types.Message):
# await message.answer(message.text)

model_engine = "text-davinci-003"
max_tokens = 128  # default 1024

completion = openai.Completion.create(
    engine=model_engine,
    prompt=message.text,
    max_tokens=max_tokens,
    temperature=0.5,
    top_p=1,
    frequency_penalty=0,
    presence_penalty=0
)

await message.answer("ChatGPT: Генерирую ответ ...")

await message.answer(completion.choices[0].text)

run long-polling

if name == "main":
executor.start_polling(dp, skip_updates=True)

@adoubt
Copy link

adoubt commented Oct 16, 2023

не рабочий...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment