GPT Отзывы Версия: 0.2 Автор: Эксфадор Описание: Плагин "GPT Отзывы" автоматически генерирует доброжелательные и эмоциональные ответы на отзывы покупателей в интернет-магазине на Funpay с использованием ИИ (библиотека g4f). Ответы создаются на основе данных о заказе и отзыве, включая имя покупателя, товар, стоимость и оценку. Основные функции: Генерирует развернутые ответы на отзывы с использованием ИИ (модель GPT-4o-mini). Учитывает детали заказа: имя покупателя, товар, стоимость, оценку и текст отзыва. Добавляет много эмодзи для дружелюбного тона. ✨ Отвечает только на отзывы с оценкой выше заданного минимума (по умолчанию 3 звезды). ⭐ Ограничивает длину ответа (до 300 слов или 1000 символов). ✂ Логирует все действия и ошибки для удобства отладки. Как работает плагин: Слушает новые отзывы (или изменения отзывов, если настроено). Проверяет, соответствует ли оценка минимальному порогу (MIN_STARS). ✅ Формирует запрос (prompt) для ИИ с данными о заказе и отзыве. Генерирует ответ через g4f, обрезает его при необходимости и отправляет покупателю. Логирует процесс и уведомляет в Telegram администратора при ошибках (если настроено). Настройки: Prompt: Шаблон текста для ИИ с placeholders вроде {name}, {item}, {cost}, {rating}, {text}. MIN_STARS: Минимальная оценка для ответа (по умолчанию 3). MAX_WORDS: Максимум слов в ответе (300). MAX_CHARACTERS: Максимум символов в ответе (1000). ANSWER_ONLY_ON_NEW_FEEDBACK: Отвечать только на новые отзывы (True). SEND_IN_CHAT: Отправлять ответ в чат (True). Пример prompt'а: from __future__ import annotations from typing import Final from enum import Enum from FunPayAPI.updater.events import NewMessageEvent from FunPayAPI.types import MessageTypes from FunPayAPI.common.utils import RegularExpressions from cardinal import Cardinal from pip._internal.cli.main import main from datetime import datetime from telebot.types import InlineKeyboardMarkup as K, InlineKeyboardButton as B from tg_bot import CBT import random import telebot import re import json import logging try: from g4f.client import Client except ImportError: main(["install", "-U", "g4f"]) from g4f.client import Client client = Client() logger = logging.getLogger("FPC.ChatGPT-Reviews") LOGGER_PREFIX = "[ChatGPT-Review's]" logger.info(f"{LOGGER_PREFIX} Плагин успешно запущен.") NAME = "GPT отзывы" VERSION = "0.2" DESCRIPTION = "Отзывы от AI (g4f)" CREDITS = "@exfador" UUID = "b93bfb30-03ef-42ef-ad13-d406cc60b353" SETTINGS_PAGE = False CBT_BACK = "back" MAX_WORDS: Final[int] = 300 MAX_CHARACTERS: Final[int] = 1000 SETTINGS = { "prompt": """ Привет! Ты - ИИ Ассистент в нашем интернет-магазине игровых ценностей. Давай посмотрим детали заказа и составим отличный ответ для покупателя! Информация о покупателе и заказе: - Имя: {name} - Товар: {item} - Стоимость: {cost} рублей - Оценка: {rating} из 5 - Отзыв: {text} Твоя задача: - Ответить покупателю в доброжелательном тоне. - Использовать много эмодзи (даже если это не всегда уместно ). - Обязательно учесть информацию о покупателе и заказе. - Сделать так, чтобы покупатель остался доволен. - Написать большой и развернутый ответ. - Пожелать что-нибудь хорошее покупателю. ✨ - В конце добавить шутку, связанную с покупателем или его заказом. Важно: - Не упоминать интернет-ресурсы. - Не использовать оскорбления, ненормативную лексику, противозаконную или политическую информацию. """, } MIN_STARS: Final[int] = 3 ANSWER_ONLY_ON_NEW_FEEDBACK: Final[bool] = True SEND_IN_CHAT: Final[bool] = True MAX_ATTEMPTS: Final[int] = 5 MINIMUM_RESPONSE_LENGTH: Final[int] = 15 CHINESE_PATTERN = re.compile(r'[\u4e00-\u9fff]') class G4FModels(Enum): GPT4_MINI = "gpt-4o" def log(text: str) -> None: logger.info(f"{LOGGER_PREFIX} {text}") def tg_log(cardinal: Cardinal, text: str) -> None: for user in cardinal.telegram.authorized_users: bot = cardinal.telegram.bot bot.send_message(user, text, parse_mode="HTML") def replace_items(prompt: str, order) -> str: replacements = { "{category}": getattr(order.subcategory, "name", ""), "{categoryfull}": getattr(order.subcategory, "fullname", ""), "{cost}": str(order.sum), "{disc}": str(getattr(order, "description", "N/A")), "{rating}": str(getattr(order.review, "stars", "")), "{name}": str(getattr(order, "buyer_username", "")), "{item}": str(getattr(order, "title", "")), "{text}": str(getattr(order.review, "text", "")) } try: for placeholder, replacement in replacements.items(): prompt = prompt.replace(placeholder, replacement) except Exception as e: logger.error(f"An unexpected error occurred: {e}") finally: logger.debug(f"Processed prompt: {prompt}") return prompt def need_regenerate(content: str) -> bool: try: if re.search(CHINESE_PATTERN, content): return True content = content.replace("Generated by BLACKBOX.AI, try unlimited chat https://www.blackbox.ai", "") if len(content) < MINIMUM_RESPONSE_LENGTH: return True if ( "Unable to decode JSON response" in content or "Model not found or too long input. Or any other error (xD)" in content or "Request ended with status code" in content ): return True return False except Exception: return False def generate(prompt: str) -> str: try: response = g4f_generate_response(prompt) if not response: return "" return response except Exception as e: logger.error(f"Error generating response: {e}") return "" def g4f_generate_response(prompt: str) -> str: models = list(G4FModels) for attempt in range(MAX_ATTEMPTS): model = random.choice(models) try: response = client.chat.completions.create( model=model.value, messages=[ {"role": "user", "content": prompt} ] ) content = response.choices[0].message.content if need_regenerate(content): continue return content except Exception as e: logger.error(f"Error in attempt {attempt + 1}: {e}") return "" def truncate_text(text: str, max_chars: int) -> str: if len(text) <= max_chars: return text return text[:max_chars].rstrip() + '...' def message_handler(cardinal: Cardinal, event: NewMessageEvent) -> None: try: if ANSWER_ONLY_ON_NEW_FEEDBACK and event.message.type != MessageTypes.NEW_FEEDBACK: return if event.message.type not in [MessageTypes.NEW_FEEDBACK, MessageTypes.FEEDBACK_CHANGED]: return order_id = RegularExpressions().ORDER_ID.findall(str(event.message))[0][1:] order = cardinal.account.get_order(order_id) if order.review.stars <= MIN_STARS: return prompt: str = replace_items(SETTINGS["prompt"], order) response: str = generate(prompt) response = " ".join(response.splitlines()) words = response.split() if len(words) > MAX_WORDS: response = ' '.join(words[:MAX_WORDS]) + '...' logger.debug(f"Response truncated to {MAX_WORDS} words.") response_details = f"(づ ◕‿◕ )づ [{order.title or 'Не указано'}]\n\n{response}" response_details = truncate_text(response_details, 700) logger.debug(f"Final response_details: {response_details}") logger.debug(f"Final length: {len(response_details)} characters.") if len(response_details) > 700: logger.warning("Final response_details still exceed the character limit.") response_details = truncate_text(response_details, 700) cardinal.account.send_review(order_id=order.id, rating=None, text=response_details) except Exception as e: logger.error(f"An unexpected error occurred: {e}") BIND_TO_NEW_MESSAGE = [message_handler] BIND_TO_DELETE = None Код from __future__ import annotations from typing import Final from enum import Enum from FunPayAPI.updater.events import NewMessageEvent from FunPayAPI.types import MessageTypes from FunPayAPI.common.utils import RegularExpressions from cardinal import Cardinal from pip._internal.cli.main import main from datetime import datetime from telebot.types import InlineKeyboardMarkup as K, InlineKeyboardButton as B from tg_bot import CBT import random import telebot import re import json import logging try: from g4f.client import Client except ImportError: main(["install", "-U", "g4f"]) from g4f.client import Client client = Client() logger = logging.getLogger("FPC.ChatGPT-Reviews") LOGGER_PREFIX = "[ChatGPT-Review's]" logger.info(f"{LOGGER_PREFIX} Плагин успешно запущен.") NAME = "GPT отзывы" VERSION = "0.2" DESCRIPTION = "Отзывы от AI (g4f)" CREDITS = "@exfador" UUID = "b93bfb30-03ef-42ef-ad13-d406cc60b353" SETTINGS_PAGE = False CBT_BACK = "back" MAX_WORDS: Final[int] = 300 MAX_CHARACTERS: Final[int] = 1000 SETTINGS = { "prompt": """ Привет! Ты - ИИ Ассистент в нашем интернет-магазине игровых ценностей. Давай посмотрим детали заказа и составим отличный ответ для покупателя! Информация о покупателе и заказе: - Имя: {name} - Товар: {item} - Стоимость: {cost} рублей - Оценка: {rating} из 5 - Отзыв: {text} Твоя задача: - Ответить покупателю в доброжелательном тоне. - Использовать много эмодзи (даже если это не всегда уместно ). - Обязательно учесть информацию о покупателе и заказе. - Сделать так, чтобы покупатель остался доволен. - Написать большой и развернутый ответ. - Пожелать что-нибудь хорошее покупателю. ✨ - В конце добавить шутку, связанную с покупателем или его заказом. Важно: - Не упоминать интернет-ресурсы. - Не использовать оскорбления, ненормативную лексику, противозаконную или политическую информацию. """, } MIN_STARS: Final[int] = 3 ANSWER_ONLY_ON_NEW_FEEDBACK: Final[bool] = True SEND_IN_CHAT: Final[bool] = True MAX_ATTEMPTS: Final[int] = 5 MINIMUM_RESPONSE_LENGTH: Final[int] = 15 CHINESE_PATTERN = re.compile(r'[\u4e00-\u9fff]') class G4FModels(Enum): GPT4_MINI = "gpt-4o" def log(text: str) -> None: logger.info(f"{LOGGER_PREFIX} {text}") def tg_log(cardinal: Cardinal, text: str) -> None: for user in cardinal.telegram.authorized_users: bot = cardinal.telegram.bot bot.send_message(user, text, parse_mode="HTML") def replace_items(prompt: str, order) -> str: replacements = { "{category}": getattr(order.subcategory, "name", ""), "{categoryfull}": getattr(order.subcategory, "fullname", ""), "{cost}": str(order.sum), "{disc}": str(getattr(order, "description", "N/A")), "{rating}": str(getattr(order.review, "stars", "")), "{name}": str(getattr(order, "buyer_username", "")), "{item}": str(getattr(order, "title", "")), "{text}": str(getattr(order.review, "text", "")) } try: for placeholder, replacement in replacements.items(): prompt = prompt.replace(placeholder, replacement) except Exception as e: logger.error(f"An unexpected error occurred: {e}") finally: logger.debug(f"Processed prompt: {prompt}") return prompt def need_regenerate(content: str) -> bool: try: if re.search(CHINESE_PATTERN, content): return True content = content.replace("Generated by BLACKBOX.AI, try unlimited chat https://www.blackbox.ai", "") if len(content) < MINIMUM_RESPONSE_LENGTH: return True if ( "Unable to decode JSON response" in content or "Model not found or too long input. Or any other error (xD)" in content or "Request ended with status code" in content ): return True return False except Exception: return False def generate(prompt: str) -> str: try: response = g4f_generate_response(prompt) if not response: return "" return response except Exception as e: logger.error(f"Error generating response: {e}") return "" def g4f_generate_response(prompt: str) -> str: models = list(G4FModels) for attempt in range(MAX_ATTEMPTS): model = random.choice(models) try: response = client.chat.completions.create( model=model.value, messages=[ {"role": "user", "content": prompt} ] ) content = response.choices[0].message.content if need_regenerate(content): continue return content except Exception as e: logger.error(f"Error in attempt {attempt + 1}: {e}") return "" def truncate_text(text: str, max_chars: int) -> str: if len(text) <= max_chars: return text return text[:max_chars].rstrip() + '...' def message_handler(cardinal: Cardinal, event: NewMessageEvent) -> None: try: if ANSWER_ONLY_ON_NEW_FEEDBACK and event.message.type != MessageTypes.NEW_FEEDBACK: return if event.message.type not in [MessageTypes.NEW_FEEDBACK, MessageTypes.FEEDBACK_CHANGED]: return order_id = RegularExpressions().ORDER_ID.findall(str(event.message))[0][1:] order = cardinal.account.get_order(order_id) if order.review.stars <= MIN_STARS: return prompt: str = replace_items(SETTINGS["prompt"], order) response: str = generate(prompt) response = " ".join(response.splitlines()) words = response.split() if len(words) > MAX_WORDS: response = ' '.join(words[:MAX_WORDS]) + '...' logger.debug(f"Response truncated to {MAX_WORDS} words.") response_details = f"(づ ◕‿◕ )づ [{order.title or 'Не указано'}]\n\n{response}" response_details = truncate_text(response_details, 700) logger.debug(f"Final response_details: {response_details}") logger.debug(f"Final length: {len(response_details)} characters.") if len(response_details) > 700: logger.warning("Final response_details still exceed the character limit.") response_details = truncate_text(response_details, 700) cardinal.account.send_review(order_id=order.id, rating=None, text=response_details) except Exception as e: logger.error(f"An unexpected error occurred: {e}") BIND_TO_NEW_MESSAGE = [message_handler] BIND_TO_DELETE = None Мои каналы: Основной канал: https://t.me/coxerhub Канал с плагинами: https://t.me/exfador_plugins Отзывы: https://t.me/exfador_reviews