Skip to content

Commit

Permalink
26jan1
Browse files Browse the repository at this point in the history
  • Loading branch information
shliamb committed Jan 26, 2024
1 parent 80a8f66 commit fac2123
Show file tree
Hide file tree
Showing 6 changed files with 2,509 additions and 14 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ ChatGPT + Telegram bot. В интернете таких много, мой во
2. Бот на библиотеке telebot,
3. При превышении ожидания перепоключается автоматически - логирует,

- Общение с OpenAI идет асинхронно, но не в стриме, так как телеграм не будет стримить, как я понял. Асинхрон, но надо еще попрактиковать, так как не отскакивает.

- Думаю даза SQLite в GitHab будет пустая но с таблицами. Если забуду и будет пустая или вы сами удалите, то можно запусть файл init_db.py - он разметит и внесет все по умолчанию.

Expand Down
70 changes: 63 additions & 7 deletions app/my-test.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,72 @@




























# from keys import api_key

# from openai import AsyncOpenAI
# import asyncio



# client = AsyncOpenAI(
# api_key=api_key,
# )


# async def main():
# stream = await client.chat.completions.create(
# model="gpt-4",
# messages=[{"role": "user", "content": "Say this is a test"}],
# stream=True,
# )
# async for chunk in stream:
# print(chunk.choices[0].delta.content or "", end="")


# asyncio.run(main())





#from sqlalchemy.ext.declarative import declarative_base
#from sqlalchemy import Column, Integer, String, Float, ForeignKey, Boolean, DateTime
from sqlalchemy.orm import relationship, sessionmaker
from models import UsersTelegram, engine
# from sqlalchemy.orm import relationship, sessionmaker
# from models import UsersTelegram, engine



Session = sessionmaker(bind=engine)
session = Session()
# Session = sessionmaker(bind=engine)
# session = Session()

users = session.query(UsersTelegram).all()
for user in users:
print(f'User: {user.user_id}, Email: {user.user_username}, id: {user.id}')
# users = session.query(UsersTelegram).all()
# for user in users:
# print(f'User: {user.user_id}, Email: {user.user_username}, id: {user.id}')



Expand Down
187 changes: 185 additions & 2 deletions app/open_ai.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,190 @@
from keys import api_key
from openai import AsyncOpenAI
import asyncio
from typing import Union


client = AsyncOpenAI(api_key=api_key)

all_in = []

async def main(question: str) -> Union[str, None]:

# Добавляю вопросы в кучу для поддержания контекста
all_in.append(f"{question}\n") # Добавляю вопрос
res = ' '.join(all_in) # Пробелы между словами и убираю запятую
print(res)


chat_completion = await client.chat.completions.create(
messages=[
{
"role": "user",
"content": res, #question,
}
],
model="gpt-3.5-turbo", #"gpt-4", "text-davinci-002", "text-curie-003", or "gpt-3.5-turbo"
)

answer = chat_completion.choices[0].message.content # Ответ
model_version = chat_completion.model
completion_tokens = chat_completion.usage.completion_tokens
prompt_tokens = chat_completion.usage.prompt_tokens
total_tokens = chat_completion.usage.total_tokens
total_answer = answer, model_version, completion_tokens, prompt_tokens, total_tokens # В кортеж
#print(f"Ответ {answer}\nВерсия модели {model_version}\nЗавершенные токены {completion_tokens}\nПодсказки_токены {prompt_tokens}\nВсего токенов {total_tokens} ")
# print(total_answer[0])
all_in.append(f"{answer}\n") # Добавляю вопрос


return total_answer or None

if __name__ == "__main__": # Если код запускается как основной файл (а не импортирован), тогда вызываем asyncio.run(main())
asyncio.run(main())






# async def main(question) -> None:
# chat_completion = await client.chat.completions.create(
# messages=[
# {
# "role": "user",
# "content": question,
# }
# ],
# model="gpt-3.5-turbo",
# )
# answer = chat_completion.choices[0].message.content # Ответ
# model_version = chat_completion.model
# completion_tokens = chat_completion.usage.completion_tokens
# prompt_tokens = chat_completion.usage.prompt_tokens
# total_tokens = chat_completion.usage.total_tokens
# total_answer = answer, model_version, completion_tokens, prompt_tokens, total_tokens # В кортеж
# print(f"Ответ {answer}\nВерсия модели {model_version}\nЗавершенные токены {completion_tokens}\nПодсказки_токены {prompt_tokens}\nВсего токенов {total_tokens} ")
# # print(total_answer[0])
# return total_answer


# async def run_main():
# result = await main("Ваш вопрос") # Замените "Ваш вопрос" на реальный вопрос
# print(result[0])


# asyncio.run(run_main())

# def open_ai(quest):
# stream = client.chat.completions.create(
# model="gpt-3.5-turbo",#"gpt-4",
# messages=[{"role": "user", "content": quest}],
# stream=True,
# )
# # print(quest)
# # for gh in stream:
# # print(gh)
# for chunk in stream:
# print(chunk.choices[0].delta.content or "", end="")


# Предположим, что у нас есть объект stream, представляющий собой поток данных
# В этом потоке есть набор объектов chunk, которые, вероятно, являются частью какой-то структуры данных

# Итерируемся по всем chunk в потоке stream
# for chunk in stream:

# # Получаем первый элемент (choices[0]) из списка choices в объекте chunk
# first_choice = chunk.choices[0]

# # Проверяем, существует ли свойство delta у объекта first_choice
# if hasattr(first_choice, 'delta'):
# # Если свойство delta существует, получаем объект delta и извлекаем свойство content
# delta_content = first_choice.delta.content

# # Печатаем значение свойства content, если оно не является пустой строкой
# if delta_content:
# print(delta_content, end="")
# else:
# # Если свойство delta отсутствует, выводим пустую строку
# print("", end="")

#open_ai(quest)






# from openai import AsyncOpenAI
# import asyncio

# client = AsyncOpenAI(
# api_key=api_key,
# )

# async def main():
# stream = await client.chat.completions.create(
# model="gpt-3.5-turbo",#"gpt-4",
# messages=[{"role": "user", "content": "Say this is a test"}],
# stream=True,
# )
# async for chunk in stream:
# print(chunk.choices[0].delta.content or "", end="")
# asyncio.run(main())




# def ffg
# # Предположим, у вас есть асинхронная функция, возвращающая поток данных
# async def main(text):
# stream = await client.chat.completions.create(
# model="gpt-3.5-turbo",#"gpt-4",
# messages=[{"role": "user", "content": text}],
# stream=True,
# )
# # Итерация по потоку данных
# async for chunk in stream:
# content = chunk.choices[0].delta.content or "" # Получение контента из текущего чанка
# print(content, end="") # Печать контента без новой строки в конце


# asyncio.run(main(question))




# def open_ai(message):
# # bot.send_message(message.chat.id, "hi")
# #logger.info(f" - message_text:'{message.text}' - user_name:{message.from_user.username} - user_id:{message.from_user.id}")
# # bot.reply_to(message, "hi")
# # Собираем запрос Json к API Openai
# question = message.text + " "# +patch
# # print(question)

# url = 'https://api.openai.com/v1/chat/completions'
# headers = {
# 'Authorization': f'Bearer {api_key}',
# 'Content-Type': 'application/json'
# }
# data = {
# "model": "gpt-3.5-turbo", # model,
# "messages": [{"role": "user", "content": question}],
# "temperature": 0.7, # temp,
# }
# response = requests.post(url, headers=headers, data=json.dumps(data))

# response_data = response.json() # Разбираем JSON-ответ

# first_choice_message = response_data['choices'][0]['message']['content']
# # print("\n", first_choice_message, "\n", temp)
# return first_choice_message





def test_openai():
print(api_key[:5])



Expand Down
42 changes: 37 additions & 5 deletions app/tele_bot.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
import telebot
from keys import token
from worker_db import read_tele_user, add_tele_user, add_chatgpt_setings

import asyncio
from open_ai import main

bot = telebot.TeleBot(token) # Conection for API Telegram




# /start
@bot.message_handler(commands=['start'])
def start(context):
Expand All @@ -34,6 +32,41 @@ def start(context):
# Вносим id в таблицу настроек gpt, нужное проставиться по default
add_chatgpt_setings(added_user_id)

# # /admin - статистика будет, загруженность базы, токены..
# @bot.message_handler(commands=['admin'])
# def start(context):


# Message from OpenAI
@bot.message_handler(func=lambda message: message.text is not None and not message.text.startswith('/')) # Декоратор Telebot принимает все, кроме того, что начинается на /
def handle_message(message):
bot.send_chat_action(message.chat.id, 'typing') # typing bot
async def run_main():
bot.send_chat_action(message.chat.id, 'typing') # typing bot
result = await main(message.text)
send = f"{result[0]}\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - -\nВерсия модели: {result[1]}\nЗавершенные токены: {result[2]}\nПодсказки токены: {result[3]}\nВсего токенов: {result[4]}"
# send = f"{переменная}\n<b>Жирным - b</b> <i>Курсив - i</i> <code>Код - code</code> <pre>Отдельный блок для копирования - pre</pre>"
bot.reply_to(message, send) # bot.reply_to(message, send, parse_mode='HTML')
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop.run_until_complete(run_main())




#####
start_bot = bot.polling() # Запуск инициализируется в run_bot.py














Expand All @@ -45,4 +78,3 @@ def start(context):



start_bot = bot.polling()
Binary file modified db/sqlite3.db
Binary file not shown.
Loading

0 comments on commit fac2123

Please sign in to comment.