Files
limoka/MoriSummerz/ftg-mods/chatgpt.py
2025-07-10 21:02:34 +03:00

279 lines
9.4 KiB
Python
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

__version__ = (1, 0, 0)
import contextlib
"""
█▀▄▀█ █▀█ █▀█ █ █▀ █ █ █▀▄▀█ █▀▄▀█ █▀▀ █▀█
█ ▀ █ █▄█ █▀▄ █ ▄█ █▄█ █ ▀ █ █ ▀ █ ██▄ █▀▄
Copyright 2022 t.me/morisummermods
Licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International
"""
# meta developer: @morisummermods
# meta banner: https://i.imgur.com/H1vPM6U.jpg
from telethon.tl.types import Message
import requests
import logging
import re
from .. import loader, utils # noqa
logger = logging.getLogger(__name__)
@loader.tds
class ChatGPT(loader.Module):
"""ChatGPT AI API interaction"""
strings = {
"name": "ChatGPT",
"no_args": (
"<emoji document_id=5312526098750252863>🚫</emoji> <b>No arguments"
" provided</b>"
),
"question": (
"<emoji document_id=5974038293120027938>👤</emoji> <b>Question:</b>"
" {question}\n"
),
"answer": (
"<emoji document_id=5199682846729449178>🤖</emoji> <b>Answer:</b> {answer}"
),
"loading": "<code>Loading...</code>",
"no_api_key": (
"<b>🚫 No API key provided</b>\n<i><emoji"
" document_id=5199682846729449178></emoji> Get it from official OpenAI"
" website and add it to config</i>"
),
}
strings_ru = {
"no_args": (
"<emoji document_id=5312526098750252863>🚫</emoji> <b>Не указаны"
" аргументы</b>"
),
"question": (
"<emoji document_id=5974038293120027938>👤</emoji> <b>Вопрос:</b>"
" {question}\n"
),
"answer": (
"<emoji document_id=5199682846729449178>🤖</emoji> <b>Ответ:</b> {answer}"
),
"loading": "<code>Загрузка...</code>",
"no_api_key": (
"<b>🚫 Не указан API ключ</b>\n<i><emoji"
" document_id=5199682846729449178></emoji> Получите его на официальном"
" сайте OpenAI и добавьте в конфиг</i>"
),
}
strings_es = {
"no_args": (
"<emoji document_id=5312526098750252863>🚫</emoji> <b>No se han"
" proporcionado argumentos</b>"
),
"question": (
"<emoji document_id=5974038293120027938>👤</emoji> <b>Pregunta:</b>"
" {question}\n"
),
"answer": (
"<emoji document_id=5199682846729449178>🤖</emoji> <b>Respuesta:</b>"
" {answer}"
),
"loading": "<code>Cargando...</code>",
"no_api_key": (
"<b>🚫 No se ha proporcionado una clave API</b>\n<i><emoji"
" document_id=5199682846729449178></emoji> Obtenga una en el sitio web"
" oficial de OpenAI y agréguela a la configuración</i>"
),
}
strings_fr = {
"no_args": (
"<emoji document_id=5312526098750252863>🚫</emoji> <b>Aucun argument"
" fourni</b>"
),
"question": (
"<emoji document_id=5974038293120027938>👤</emoji> <b>Question:</b>"
" {question}\n"
),
"answer": (
"<emoji document_id=5199682846729449178>🤖</emoji> <b>Réponse:</b> {answer}"
),
"loading": "<code>Chargement...</code>",
"no_api_key": (
"<b>🚫 Aucune clé API fournie</b>\n<i><emoji"
" document_id=5199682846729449178></emoji> Obtenez-en un sur le site"
" officiel d'OpenAI et ajoutez-le à la configuration</i>"
),
}
strings_de = {
"no_args": (
"<emoji document_id=5312526098750252863>🚫</emoji> <b>Keine Argumente"
" angegeben</b>"
),
"question": (
"<emoji document_id=5974038293120027938>👤</emoji> <b>Frage:</b>"
" {question}\n"
),
"answer": (
"<emoji document_id=5199682846729449178>🤖</emoji> <b>Antwort:</b> {answer}"
),
"loading": "<code>Laden...</code>",
"no_api_key": (
"<b>🚫 Kein API-Schlüssel angegeben</b>\n<i><emoji"
" document_id=5199682846729449178></emoji> Holen Sie sich einen auf der"
" offiziellen OpenAI-Website und fügen Sie ihn der Konfiguration hinzu</i>"
),
}
strings_tr = {
"no_args": (
"<emoji document_id=5312526098750252863>🚫</emoji> <b>Argümanlar"
" verilmedi</b>"
),
"question": (
"<emoji document_id=5974038293120027938>👤</emoji> <b>Soru:</b> {question}\n"
),
"answer": (
"<emoji document_id=5199682846729449178>🤖</emoji> <b>Cevap:</b> {answer}"
),
"loading": "<code>Yükleniyor...</code>",
"no_api_key": (
"<b>🚫 API anahtarı verilmedi</b>\n<i><emoji"
" document_id=5199682846729449178></emoji> OpenAI'nın resmi websitesinden"
" alın ve yapılandırmaya ekleyin</i>"
),
}
strings_uz = {
"no_args": (
"<emoji document_id=5312526098750252863>🚫</emoji> <b>Argumentlar"
" ko'rsatilmadi</b>"
),
"question": (
"<emoji document_id=5974038293120027938>👤</emoji> <b>Savol:</b>"
" {question}\n"
),
"answer": (
"<emoji document_id=5199682846729449178>🤖</emoji> <b>Javob:</b> {answer}"
),
"loading": "<code>Yuklanmoqda...</code>",
"no_api_key": (
"<b>🚫 API kalit ko'rsatilmadi</b>\n<i><emoji"
" document_id=5199682846729449178></emoji> Ofitsial OpenAI veb-saytidan"
" oling</i>"
),
}
strings_it = {
"no_args": (
"<emoji document_id=5312526098750252863>🚫</emoji> <b>Nessun argomento"
" fornito</b>"
),
"question": (
"<emoji document_id=5974038293120027938>👤</emoji> <b>Domanda:</b>"
" {question}\n"
),
"answer": (
"<emoji document_id=5199682846729449178>🤖</emoji> <b>Risposta:</b> {answer}"
),
"loading": "<code>Caricamento...</code>",
"no_api_key": (
"<b>🚫 Nessuna chiave API fornita</b>\n<i><emoji"
" document_id=5199682846729449178></emoji> Ottienila dal sito ufficiale"
" di OpenAI e aggiungila al tuo file di configurazione</i>"
),
}
def __init__(self):
self.config = loader.ModuleConfig(
loader.ConfigValue(
"api_key",
"",
"API key from OpenAI",
validator=loader.validators.Hidden(loader.validators.String()),
),
)
async def _make_request(
self,
method: str,
url: str,
headers: dict,
data: dict,
) -> dict:
resp = await utils.run_sync(
requests.request,
method,
url,
headers=headers,
json=data,
)
return resp.json()
def _process_code_tags(self, text: str) -> str:
return re.sub(
r"`(.*?)`",
r"<code>\1</code>",
re.sub(r"```(.*?)```", r"<code>\1</code>", text, flags=re.DOTALL),
flags=re.DOTALL,
)
async def _get_chat_completion(self, prompt: str) -> str:
resp = await self._make_request(
method="POST",
url="https://api.openai.com/v1/chat/completions",
headers={
"Content-Type": "application/json",
"Authorization": f'Bearer {self.config["api_key"]}',
},
data={
"model": "gpt-3.5-turbo",
"messages": [{"role": "user", "content": prompt}],
},
)
if resp.get("error", None):
return f"🚫 {resp['error']['message']}"
return resp["choices"][0]["message"]["content"]
@loader.command(
ru_doc="<вопрос> - Задать вопрос",
it_doc="<domanda> - Fai una domanda",
fr_doc="<question> - Posez une question",
de_doc="<frage> - Stelle eine Frage",
es_doc="<pregunta> - Haz una pregunta",
tr_doc="<soru> - Soru sor",
uz_doc="<savol> - Savol ber",
)
async def gpt(self, message: Message):
"""<question> - Ask a question"""
if self.config["api_key"] == "":
return await utils.answer(message, self.strings("no_api_key"))
args = utils.get_args_raw(message)
if not args:
return await utils.answer(message, self.strings("no_args"))
await utils.answer(
message,
"\n".join(
[
self.strings("question").format(question=args),
self.strings("answer").format(answer=self.strings("loading")),
]
),
)
answer = await self._get_chat_completion(args)
await utils.answer(
message,
"\n".join(
[
self.strings("question").format(question=args),
self.strings("answer").format(
answer=self._process_code_tags(answer)
),
]
),
)