Загрузка...

GPT отзывы для FPC

Тема в разделе Python создана пользователем Эксфадор 3 мар 2025. (поднята 28 апр 2025) 596 просмотров

Загрузка...
  1. Эксфадор
    Эксфадор Автор темы 3 мар 2025 ПЛАГИНЫ ДЛЯ FPC - t.me/coxerhub 1747 30 авг 2023
    GPT Отзывы
    Версия: 0.2
    Автор: Эксфадор

    Описание:
    Плагин "GPT Отзывы" автоматически генерирует доброжелательные и эмоциональные ответы на отзывы покупателей в интернет-магазине на Funpay с использованием ИИ (библиотека g4f). Ответы создаются на основе данных о заказе и отзыве, включая имя покупателя, товар, стоимость и оценку.

    Основные функции:
    • Генерирует развернутые ответы на отзывы с использованием ИИ (модель GPT-4o-mini).
    • Учитывает детали заказа: имя покупателя, товар, стоимость, оценку и текст отзыва.
    • Добавляет много эмодзи для дружелюбного тона. ✨
    • Отвечает только на отзывы с оценкой выше заданного минимума (по умолчанию 3 звезды). ⭐
    • Ограничивает длину ответа (до 300 слов или 1000 символов). ✂
    • Логирует все действия и ошибки для удобства отладки.

    Как работает плагин:
    1. Слушает новые отзывы (или изменения отзывов, если настроено).
    2. Проверяет, соответствует ли оценка минимальному порогу (MIN_STARS). ✅
    3. Формирует запрос (prompt) для ИИ с данными о заказе и отзыве.
    4. Генерирует ответ через g4f, обрезает его при необходимости и отправляет покупателю.
    5. Логирует процесс и уведомляет в 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


    Мои каналы:
     
Top