# █▀▀ ▄▀█ █▀▄▀█ █▀█ █▀▄ █▀
# █▀░ █▀█ █░▀░█ █▄█ █▄▀ ▄█
# https://t.me/famods
# 🔒 Licensed under the GNU AGPLv3
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
# ---------------------------------------------------------------------------------
# Name: FreeGPT
# Description: Бесплатный ChatGPT. БЕЗ API. БЕЗ БОТОВ.
# meta developer: @FAmods
# meta banner: https://github.com/FajoX1/FAmods/blob/main/assets/banners/freegpt.png?raw=true
# requires: g4f[all]
# ---------------------------------------------------------------------------------
import asyncio
import logging
from g4f.client import Client
from .. import loader, utils
logger = logging.getLogger(__name__)
@loader.tds
class FreeGPT(loader.Module):
"""Бесплатный ChatGPT. БЕЗ API. БЕЗ БОТОВ."""
strings = {
"name": "FreeGPT",
"no_args": "❌ Нужно {}{} {}",
"asking_chatgpt": """🔄 Спрашиваю ChatGPT...
👾 Вы также можете получать ответы в реальном времены с помощью stream_answer в {prefix}cfg FreeGPT""",
"creating_image": "🔄 Генерирую изображение...",
"answer_text": """👨💻 Вопрос: {question}
🤖 Ответ: {answer}
🖥 Модель: {model}""",
"photo_caption": """🖼 Промпт: {prompt}
🖥 Модель: {model}""",
}
def __init__(self):
self.config = loader.ModuleConfig(
loader.ConfigValue(
"model",
"gpt-4o",
lambda: "Модель ChatGPT",
),
loader.ConfigValue(
"image_model",
"flux",
lambda: "Модель для генерации изображений",
),
loader.ConfigValue(
"role",
"user",
lambda: "Кто ты для ChatGPT?",
),
loader.ConfigValue(
"stream_answer",
False,
lambda: "Ответ в реальном времени",
validator=loader.validators.Boolean()
),
loader.ConfigValue(
"stream_answer_delay",
1.162131238129,
lambda: "Задержка обновлений в реальном времени",
),
)
async def client_ready(self, client, db):
self.db = db
self._client = client
@loader.command()
async def gf(self, message):
"""Задать вопрос к ChatGPT"""
q = utils.get_args_raw(message)
if not q:
return await utils.answer(message, self.strings["no_args"].format(self.get_prefix(), "gf", "[вопрос]"))
if not self.config['stream_answer']:
await utils.answer(message, self.strings['asking_chatgpt'].format(prefix=self.get_prefix()))
client = Client()
response = client.chat.completions.create(
model=self.config['model'],
messages=[{"role": self.config['role'], "content": q}],
stream=False,
)
return await utils.answer(message, self.strings['answer_text'].format(question=q, answer=response.choices[0].message.content.replace("Generated by BLACKBOX.AI, try unlimited chat https://www.blackbox.ai", "").strip(), model=self.config['model']))
await utils.answer(message, self.strings['answer_text'].format(question=q, answer="Загрузка...", model=self.config['model']))
client = Client()
response = client.chat.completions.create(
model=self.config['model'],
messages=[{"role": self.config['role'], "content": q}],
stream=self.config['stream_answer'],
)
response_text = ""
for chunk in response:
if chunk.choices[0].delta.content:
response_text += chunk.choices[0].delta.content
await utils.answer(message, self.strings['answer_text'].format(question=q, answer=response_text+"...".replace("Generated by BLACKBOX.AI, try unlimited chat https://www.blackbox.ai", "").strip(), model=self.config['model']))
await asyncio.sleep(self.config['stream_answer_delay'])
return await utils.answer(message, self.strings['answer_text'].format(question=q, answer=response_text.replace("Generated by BLACKBOX.AI, try unlimited chat https://www.blackbox.ai", "").strip(), model=self.config['model']))
@loader.command()
async def gfi(self, message):
"""Сгенерировать картинку"""
prompt = utils.get_args_raw(message)
if not prompt:
return await utils.answer(message, self.strings["no_args"].format(self.get_prefix(), "gfi", "[промпт]"))
m = await utils.answer(message, self.strings['creating_image'])
client = Client()
response = client.images.generate(
model=self.config['image_model'],
prompt=prompt.replace(" ", "+"),
)
await self.client.send_file(m.peer_id, response.data[0].url, force_document=True, caption=self.strings['photo_caption'].format(prompt=prompt, model=self.config['image_model']))
await m.delete()