# ruff: noqa: E501, W291 import logging from django.conf import settings from yandex_cloud_ml_sdk import YCloudML from yandex_cloud_ml_sdk.exceptions import YCloudMLError logger = logging.getLogger(__name__) AD_PROMPT_TEMPLATE = """ Сгенерируй креативный рекламный текст для рекламодателя: "{advertiser_name}", который проводит рекламную кампанию с названием: "{ad_title}" Требования: 1. Текст должен быть максимально привлекательным и продающим 2. Использовать современные маркетинговые приемы 3. Включить призыв к действию 4. Соблюдать структуру: заголовок - основной текст - заключение 5. Длина: 3-6 коротких предложений 6. Ответ должен содержать только текст рекламы без дополнительных комментариев Пример хорошего текста: Запустите свой бизнес в космос с {{advertiser_name}}! Кампания "{{ad_title}}" предлагает уникальные решения для цифрового продвижения. Присоединяйтесь к лидерам рынка - получите персональную консультацию сегодня! """.strip() class YandexAIAdTextGenerator: def __init__(self) -> None: self.sdk = YCloudML( folder_id=settings.YANDEX_CLOUD_FOLDER_ID, auth=settings.YANDEX_CLOUD_API_KEY, ) def generate_ad_text( self, advertiser_name: str, ad_title: str ) -> str | None: try: prompt = AD_PROMPT_TEMPLATE.format( advertiser_name=advertiser_name, ad_title=ad_title ) promise = ( self.sdk.models.completions( "yandexgpt-lite", model_version="latest" ) .configure(max_tokens=400, temperature=1.0) .run_deferred([{"role": "user", "text": prompt}]) ) result = promise.wait() logger.debug("Generated ad text: %s", result) return self._clean_response(result.alternatives[0].text) except YCloudMLError: return None def _clean_response(self, text: str) -> str: cleaned = text.strip() cleaned = cleaned.replace('"', "") return " ".join(cleaned.splitlines())