diff --git a/src/main/java/kz/konturai/parser/service/MarketingStrategyV3Service.java b/src/main/java/kz/konturai/parser/service/MarketingStrategyV3Service.java index c24d68c..6b99661 100644 --- a/src/main/java/kz/konturai/parser/service/MarketingStrategyV3Service.java +++ b/src/main/java/kz/konturai/parser/service/MarketingStrategyV3Service.java @@ -470,63 +470,67 @@ public class MarketingStrategyV3Service { .collect(Collectors.joining("\n")); } + String contentRulesSafe = scoring.getModel().getContentRules().replace("%", "%%"); + String modifiersBlockSafe = modifiersBlock.replace("%", "%%"); + String rationaleSafe = scoring.getRationale().replace("%", "%%"); + return """ - ТЫ — СТАРШИЙ SMM СТРАТЕГ РЫНКА КАЗАХСТАНА. - Скоринговая система рассчитала оптимальную модель на основе данных бизнеса. + ТЫ — СТАРШИЙ SMM СТРАТЕГ РЫНКА КАЗАХСТАНА. + Скоринговая система рассчитала оптимальную модель на основе данных бизнеса. - ════════════════════════════════════════════════ - ВЫБРАННАЯ МОДЕЛЬ: %s - ОБОСНОВАНИЕ: %s - ════════════════════════════════════════════════ + ════════════════════════════════════════════════ + ВЫБРАННАЯ МОДЕЛЬ: %s + ОБОСНОВАНИЕ: %s + ════════════════════════════════════════════════ - ОБЯЗАТЕЛЬНЫЕ ПРАВИЛА МОДЕЛИ (НАРУШАТЬ ЗАПРЕЩЕНО): - %s + ОБЯЗАТЕЛЬНЫЕ ПРАВИЛА МОДЕЛИ (НАРУШАТЬ ЗАПРЕЩЕНО): + %s - ════════════════════════════════════════════════ - МОДИФИКАТОРЫ (%d активных): - %s - ════════════════════════════════════════════════ + ════════════════════════════════════════════════ + МОДИФИКАТОРЫ (%d активных): + %s + ════════════════════════════════════════════════ - КРИТИЧЕСКИЕ ПРАВИЛА ГЕНЕРАЦИИ КОНТЕНТА: + КРИТИЧЕСКИЕ ПРАВИЛА ГЕНЕРАЦИИ КОНТЕНТА: - 1. КОЛИЧЕСТВО ПОСТОВ: - - 4 недели × минимум 3 поста = МИНИМУМ 12 постов в postCalendar - - Оптимально: 14-16 постов (равномерно распределить по неделям) + 1. КОЛИЧЕСТВО ПОСТОВ: + - 4 недели × минимум 3 поста = МИНИМУМ 12 постов в postCalendar + - Оптимально: 14-16 постов (равномерно распределить по неделям) - 2. СТРОГОЕ СОБЛЮДЕНИЕ ПРОПОРЦИЙ: - Подсчитай итоговое количество постов и распредели типы контента - строго согласно процентам модели (расчёт в userPrompt). + 2. СТРОГОЕ СОБЛЮДЕНИЕ ПРОПОРЦИЙ: + Подсчитай итоговое количество постов и распредели типы контента + строго согласно процентам модели (расчёт в userPrompt). - 3. ФОРМАТЫ: - - contentType принимает ТОЛЬКО два значения: "фото" или "видео" - - Соблюдай % видео/фото из правил модели + 3. ФОРМАТЫ: + - contentType принимает ТОЛЬКО два значения: "фото" или "видео" + - Соблюдай %% видео/фото из правил модели - 4. CTA В ПОСТАХ: - Используй ТОЛЬКО CTA-фразы из стиля своей модели (указаны в правилах выше) + 4. CTA В ПОСТАХ: + Используй ТОЛЬКО CTA-фразы из стиля своей модели (указаны в правилах выше) - 5. ТЕКСТЫ ПОСТОВ (postText): - - Минимум 120 слов в каждом посте — реальный живой текст - - Пиши на русском языке, для аудитории Казахстана - - Конкретика, факты, польза — без воды и шаблонных фраз - - Эмодзи уместно, умеренно + 5. ТЕКСТЫ ПОСТОВ (postText): + - Минимум 120 слов в каждом посте — реальный живой текст + - Пиши на русском языке, для аудитории Казахстана + - Конкретика, факты, польза — без воды и шаблонных фраз + - Эмодзи уместно, умеренно - 6. ХЭШТЕГИ: - - 5-10 тематических хэштегов + 1-2 гео (#алматы / #астана / #казахстан) - - Чередовать популярные и нишевые + 6. ХЭШТЕГИ: + - 5-10 тематических хэштегов + 1-2 гео (#алматы / #астана / #казахстан) + - Чередовать популярные и нишевые - 7. РАСПИСАНИЕ: - - Instagram: 09:00, 12:00, 18:00, 20:00 - - TikTok: 18:00, 20:00, 22:00 - - Telegram: 10:00, 13:00, 19:00 - - Не публиковать чаще 1 раза в день на одной платформе + 7. РАСПИСАНИЕ: + - Instagram: 09:00, 12:00, 18:00, 20:00 + - TikTok: 18:00, 20:00, 22:00 + - Telegram: 10:00, 13:00, 19:00 + - Не публиковать чаще 1 раза в день на одной платформе - ВЫВОДИ ТОЛЬКО ЧИСТЫЙ JSON! Никакого текста до или после. - """.formatted( + ВЫВОДИ ТОЛЬКО ЧИСТЫЙ JSON! Никакого текста до или после. + """.formatted( scoring.getModel().getTitle(), - scoring.getRationale(), - scoring.getModel().getContentRules(), + rationaleSafe, + contentRulesSafe, scoring.getActiveModifiers().size(), - modifiersBlock + modifiersBlockSafe ); }