Files
AdNova/solution/services/backend/integrations/yandexai/generators/ad_text.py
T
2025-02-18 23:57:18 +03:00

64 lines
2.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
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.
# 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())