docs-combiner 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/renderer.js +44 -22
- package/dist/renderer.js.map +1 -1
- package/package.json +1 -1
package/dist/renderer.js
CHANGED
|
@@ -90051,7 +90051,7 @@ function App() {
|
|
|
90051
90051
|
const rest = trimmed.slice(1).trim();
|
|
90052
90052
|
const priceMatch = rest.match(/^(\d+(?:\.\d+)?)$/);
|
|
90053
90053
|
if (priceMatch) {
|
|
90054
|
-
return { price: priceMatch[1], currency: currencySymbolMap[firstChar] };
|
|
90054
|
+
return { price: priceMatch[1], currency: currencySymbolMap[firstChar], currencySymbol: firstChar };
|
|
90055
90055
|
}
|
|
90056
90056
|
}
|
|
90057
90057
|
// Check if last character is a currency symbol (e.g., "48900 ₦" or "48900₦")
|
|
@@ -90060,7 +90060,7 @@ function App() {
|
|
|
90060
90060
|
const rest = trimmed.slice(0, -1).trim();
|
|
90061
90061
|
const priceMatch = rest.match(/^(\d+(?:\.\d+)?)$/);
|
|
90062
90062
|
if (priceMatch) {
|
|
90063
|
-
return { price: priceMatch[1], currency: currencySymbolMap[lastChar] };
|
|
90063
|
+
return { price: priceMatch[1], currency: currencySymbolMap[lastChar], currencySymbol: lastChar };
|
|
90064
90064
|
}
|
|
90065
90065
|
}
|
|
90066
90066
|
// Try to match pattern: number followed by currency code (3 letters)
|
|
@@ -91635,10 +91635,19 @@ function App() {
|
|
|
91635
91635
|
}
|
|
91636
91636
|
// Check if there's reasoning but no images (model might have failed)
|
|
91637
91637
|
if (message.reasoning_details && message.reasoning_details.length > 0) {
|
|
91638
|
+
logToTerminal('error', '❌ No images found in response. Model returned reasoning but no image was generated.');
|
|
91639
|
+
logToTerminal('error', '📋 Full response text:', responseText);
|
|
91640
|
+
logToTerminal('error', '📋 Parsed response data:', JSON.stringify(data, null, 2));
|
|
91641
|
+
logToTerminal('error', '📋 Message object:', JSON.stringify(message, null, 2));
|
|
91642
|
+
logToTerminal('error', '📋 Reasoning details:', JSON.stringify(message.reasoning_details, null, 2));
|
|
91638
91643
|
const reasoningError = new Error('No images found in response. Model returned reasoning but no image was generated.');
|
|
91639
91644
|
reasoningError.hasReasoning = true;
|
|
91640
91645
|
throw reasoningError;
|
|
91641
91646
|
}
|
|
91647
|
+
logToTerminal('error', '❌ No images found in response.');
|
|
91648
|
+
logToTerminal('error', '📋 Full response text:', responseText);
|
|
91649
|
+
logToTerminal('error', '📋 Parsed response data:', JSON.stringify(data, null, 2));
|
|
91650
|
+
logToTerminal('error', '📋 Message object:', JSON.stringify(message, null, 2));
|
|
91642
91651
|
throw new Error(`No images found in response. Message: ${JSON.stringify(message)}`);
|
|
91643
91652
|
}
|
|
91644
91653
|
// Images are returned as base64 data URLs: data:image/png;base64,...
|
|
@@ -92723,15 +92732,17 @@ function App() {
|
|
|
92723
92732
|
alert('Please fill in Product and Geo fields');
|
|
92724
92733
|
return;
|
|
92725
92734
|
}
|
|
92726
|
-
const { price: generatePrice, currency: generateCurrency } = parsePriceAndCurrency(generatePriceWithCurrency);
|
|
92735
|
+
const { price: generatePrice, currency: generateCurrency, currencySymbol } = parsePriceAndCurrency(generatePriceWithCurrency);
|
|
92727
92736
|
if (!generatePrice.trim() || !generateCurrency.trim()) {
|
|
92728
92737
|
logToTerminal('error', '❌ Missing price or currency');
|
|
92729
92738
|
alert('Please fill in Price field (format: "11400 HUF") for image generation');
|
|
92730
92739
|
return;
|
|
92731
92740
|
}
|
|
92741
|
+
// Use original currency symbol if available, otherwise use currency code
|
|
92742
|
+
const currencyForPrompt = currencySymbol || generateCurrency;
|
|
92732
92743
|
logToTerminal('log', '📦 Product:', generateProduct);
|
|
92733
92744
|
logToTerminal('log', '🌍 Geo:', generateGeo);
|
|
92734
|
-
logToTerminal('log', '💰 Price:', generatePrice,
|
|
92745
|
+
logToTerminal('log', '💰 Price:', generatePrice, currencyForPrompt);
|
|
92735
92746
|
if (!driveFolderUrl.trim()) {
|
|
92736
92747
|
logToTerminal('error', '❌ Missing Drive folder URL');
|
|
92737
92748
|
alert('Please fill in Google Drive Folder URL');
|
|
@@ -92766,7 +92777,8 @@ function App() {
|
|
|
92766
92777
|
// Base prompt structure
|
|
92767
92778
|
// NOTE: This generation prompt is intentionally STRICTER than the image validator (`validateCreativeImage`).
|
|
92768
92779
|
// Keep the prompt strict even if validator allows some "acceptable" deviations (e.g. 2-line headline, benefit headline, CTA position, discount emphasis).
|
|
92769
|
-
|
|
92780
|
+
// Use original currency symbol if available, otherwise use currency code
|
|
92781
|
+
const basePromptStructure = (0,_prompts__WEBPACK_IMPORTED_MODULE_1__.getImageGenerationBasePrompt)(generateGeo, generatePrice, currencyForPrompt);
|
|
92770
92782
|
// Generate 5 images with different approaches
|
|
92771
92783
|
const approaches = _prompts__WEBPACK_IMPORTED_MODULE_1__.CREO_APPROACHES;
|
|
92772
92784
|
// Initialize placeholders for 5 images
|
|
@@ -92958,10 +92970,12 @@ function App() {
|
|
|
92958
92970
|
errorMsg.includes('Failed to fetch') ||
|
|
92959
92971
|
errorMsg.includes('Network error') ||
|
|
92960
92972
|
errorMsg.includes('timeout') ||
|
|
92961
|
-
errorMsg.includes('Request timeout')
|
|
92973
|
+
errorMsg.includes('Request timeout') ||
|
|
92974
|
+
errorMsg.includes('Provider returned error') ||
|
|
92975
|
+
errorMsg.toLowerCase().includes('provider error'));
|
|
92962
92976
|
});
|
|
92963
92977
|
if (retryableErrors.length > 0) {
|
|
92964
|
-
addLog(formatLogMessage('log', `🔄 Повтор: найдено ${retryableErrors.length} ошибок (сеть/таймаут/JSON). Пробую ещё раз...`));
|
|
92978
|
+
addLog(formatLogMessage('log', `🔄 Повтор: найдено ${retryableErrors.length} ошибок (сеть/таймаут/JSON/Provider). Пробую ещё раз...`));
|
|
92965
92979
|
const retryIndices = retryableErrors.map(r => r.index).sort((a, b) => a - b);
|
|
92966
92980
|
let retryCursor = 0;
|
|
92967
92981
|
const retryWorkers = Array.from({ length: Math.min(maxParallel, retryIndices.length) }, () => (async () => {
|
|
@@ -94485,7 +94499,7 @@ function getTitlesSystemPrompt(geo) {
|
|
|
94485
94499
|
- Используй знания лучших практик рекламного копирайтинга
|
|
94486
94500
|
- Избегай только жёстких медицинских гарантий («лечит», «вылечивает», «гарантируем»). Мягкие обещания результата разрешены («Nopți fără treziri», «Stomac liniștit», «Efect rapid»). Разрешены: сроки («în 14 zile»), цифры соц. доказательства («9 din 10 bărbați»), мягкие результаты. Запрещены: «100% гарантия», «навсегда», «излечение».
|
|
94487
94501
|
- Избегай только: прямых медицинских диагнозов, слов «лечит/вылечивает/гарантируем», обещаний «100%/навсегда». Всё остальное — разрешено.
|
|
94488
|
-
-
|
|
94502
|
+
- Если в категории продукта есть специфические медицинские термины или диагнозы — используй их осторожно, не в каждом заголовке. Максимум 1 заголовок из 3 может содержать прямое упоминание таких терминов. Предпочитай мягкие формулировки, описывающие симптомы и дискомфорт, а не диагнозы. Если все 3 заголовка содержат прямые медицинские термины — перепиши 2 из них с мягкими альтернативами, фокусируясь на ощущениях и симптомах
|
|
94489
94503
|
- После создания проверь их правильность и разнообразие
|
|
94490
94504
|
- Верни только заголовки, по одному на строку, без нумерации или буллетов
|
|
94491
94505
|
- Заголовки должны быть на языке ${geo}
|
|
@@ -94546,8 +94560,8 @@ function getTextsSystemPrompt(geo) {
|
|
|
94546
94560
|
- Разрешены формулировки: «reduce frecvența», «elimină disconfortul», «rezultat vizibil în X zile», «9 din 10 observă diferența». Запрещены только: «лечит/vindecă», «гарантируем 100%», «навсегда/definitiv».
|
|
94547
94561
|
- Ты можешь усиливать эффект и результаты, но без прямых медицинских обещаний
|
|
94548
94562
|
- Избегай только: прямых медицинских диагнозов, слов «лечит/вылечивает/гарантируем», обещаний «100%/навсегда». Всё остальное — разрешено.
|
|
94549
|
-
-
|
|
94550
|
-
- Избегай
|
|
94563
|
+
- Если в категории продукта есть специфические медицинские термины или диагнозы — используй их осторожно, не в каждом тексте. Максимум 1 текст из 3 может содержать прямое упоминание таких терминов. Остальные тексты фокусируй на симптомах, дискомфорте и ощущениях пользователя, релевантных категории продукта. Избегай эвфемизмов и искусственных замен — используй естественные формулировки
|
|
94564
|
+
- Избегай прямых упоминаний интимных или деликатных деталей, связанных с проблемой. Используй мягкие формулировки, описывающие дискомфорт и симптомы, а не физиологические процессы
|
|
94551
94565
|
- Избегай повторения полного названия продукта более 2 раз в одном тексте. Используй местоимения или более короткие ссылки при необходимости
|
|
94552
94566
|
|
|
94553
94567
|
Требования к формату:
|
|
@@ -94630,7 +94644,7 @@ OTHER_TEXT: ["..."] (любой другой рекламный текст на
|
|
|
94630
94644
|
- ЗАПРЕЩЕНЫ только: «лечит», «вылечивает», «гарантируем», «100%», «навсегда», «полностью избавляет», диагностика заболеваний
|
|
94631
94645
|
- «Выводит/устраняет токсины» для детокс-продуктов — это мягкий клейм, НЕ медицинская гарантия
|
|
94632
94646
|
- Если найден запрещённый клейм — ошибка. Мягкие клеймы — не ошибка.
|
|
94633
|
-
-
|
|
94647
|
+
- Специфические медицинские термины или диагнозы — разрешены, но не должны повторяться чрезмерно. Если в HEADLINE + BULLETS один и тот же специфический термин встречается более 1 раза — РЕКОМЕНДАЦИЯ: разнообразить формулировки, использовать синонимы или фокус на симптомах вместо повторения термина
|
|
94634
94648
|
|
|
94635
94649
|
ШАГ 3 — TEXT LIMIT (критично):
|
|
94636
94650
|
- Общее число слов в HEADLINE + BULLETS <= 16. Если больше — ошибка.
|
|
@@ -94663,6 +94677,14 @@ OTHER_TEXT: ["..."] (любой другой рекламный текст на
|
|
|
94663
94677
|
function getImageGenerationBasePrompt(generateGeo, generatePrice, generateCurrency) {
|
|
94664
94678
|
return `Создай рекламный креатив для Facebook Ads 1:1 (квадрат).
|
|
94665
94679
|
Язык текста: ${generateGeo}.
|
|
94680
|
+
|
|
94681
|
+
КРИТИЧНО — РЕЛЕВАНТНОСТЬ ПРОДУКТУ:
|
|
94682
|
+
- Заголовок и буллиты ДОЛЖНЫ соответствовать категории и проблеме продукта из его названия и описания
|
|
94683
|
+
- НЕ копируй примеры из промпта буквально — примеры показывают только ФОРМАТ, не содержание
|
|
94684
|
+
- Определи категорию продукта (диабет, суставы, пищеварение, простата, зрение, похудение и т.д.) и используй ТОЛЬКО релевантные этой категории проблемы и выгоды
|
|
94685
|
+
- Если примеры в промпте про другую категорию — игнорируй их содержание, используй только структуру
|
|
94686
|
+
- Прочитай название и описание продукта внимательно и построй заголовок/буллиты вокруг ЕГО проблематики
|
|
94687
|
+
|
|
94666
94688
|
Используй предоставленный рендер упаковки продукта как есть (форма/цвет без изменений). На упаковке запрещены текст/цена/буллеты/стикеры.
|
|
94667
94689
|
|
|
94668
94690
|
CRITICAL RULES (это ВАЛИДАЦИЯ, не рекомендации; если нарушено — УДАЛИ ЛИШНЕЕ и ПЕРЕСОБЕРИ МАКЕТ):
|
|
@@ -94685,7 +94707,7 @@ HEADLINE (строгое правило):
|
|
|
94685
94707
|
- если не влезает: сначала измени композицию (расширь блок/переставь элементы), затем перепиши короче. НЕЛЬЗЯ уменьшать шрифт.
|
|
94686
94708
|
- Каждый из 5 креативов должен иметь УНИКАЛЬНЫЙ заголовок. Не повторяй один и тот же заголовок на разных визуалах. Варьируй: угол боли, формулировку, акцент (проблема vs облегчение)
|
|
94687
94709
|
- Вторая часть заголовка = конкретное улучшение, не абстрактное слово. ПРАВИЛЬНО: «Stomac liniștit», «Zile fără disconfort», «Confort după masă». НЕ ТАК: «Mai ușor», «Mai bine», «Soluția»
|
|
94688
|
-
-
|
|
94710
|
+
- Специфические медицинские термины или диагнозы разрешены в заголовке, но не обязательны. Варьируй между прямыми формулировками (если релевантно категории) и мягкими формулировками, фокусирующимися на симптомах и дискомфорте, для разных креативов. Не используй один и тот же термин во всех креативах
|
|
94689
94711
|
ПРИМЕР (HU, только как формат; для других GEO адаптируй язык, не копируй слова):
|
|
94690
94712
|
- НЕ ТАК: «Makacs méreganyag ellen» (лозунг)
|
|
94691
94713
|
- ТАК: «Puffadás gond? Könnyebb napok»
|
|
@@ -94735,32 +94757,32 @@ const CREO_APPROACHES = [
|
|
|
94735
94757
|
{
|
|
94736
94758
|
name: 'Врач / Эксперт (мужчина)',
|
|
94737
94759
|
prompt: `ВРАЧ-ЭКСПЕРТ (мужчина): спокойный профессионал, кабинет/клиника; врач слева/по центру, продукт справа, чистый нейтральный фон, фронтальный ракурс. Врач виден минимум по пояс, в белом халате со стетоскопом.`,
|
|
94738
|
-
headlineAngle:
|
|
94739
|
-
bulletsFocus:
|
|
94760
|
+
headlineAngle: `ЗАГОЛОВОК: угол «ежедневная проблема + спокойствие». Возьми ключевую проблему из описания продукта + мягкое обещание облегчения. Примеры в промпте — только для формата, НЕ копируй их содержание.`,
|
|
94761
|
+
bulletsFocus: `БУЛЛИТЫ: акцент на натуральности и доверии — натуральная формула, растительные экстракты, рекомендовано специалистами, без химии. Адаптируй под язык GEO и категорию продукта. Все тексты генерируй строго на языке, указанном в параметре GEO. Примеры слов в промпте — только ориентир для смысла, переводи их на нужный язык.`
|
|
94740
94762
|
},
|
|
94741
94763
|
{
|
|
94742
94764
|
name: 'Врач / Эксперт (женщина)',
|
|
94743
94765
|
prompt: `ВРАЧ-ЭКСПЕРТ (женщина): тёплый свет, уютный кабинет; врач справа/в углу, продукт слева/по центру. Врач в фокусе, чётко виден, лицо читаемое, профессиональный вид.`,
|
|
94744
|
-
headlineAngle:
|
|
94745
|
-
bulletsFocus:
|
|
94766
|
+
headlineAngle: `ЗАГОЛОВОК: угол «состояние/момент + облегчение». Возьми типичный момент проявления проблемы из описания продукта + конкретный результат. НЕ копируй примеры из других категорий.`,
|
|
94767
|
+
bulletsFocus: `БУЛЛИТЫ: акцент на результате — эффект, срок действия, улучшение состояния. Адаптируй под продукт и язык GEO. Все тексты генерируй строго на языке, указанном в параметре GEO. Примеры слов в промпте — только ориентир для смысла, переводи их на нужный язык.`
|
|
94746
94768
|
},
|
|
94747
94769
|
{
|
|
94748
94770
|
name: 'Lifestyle / Clean',
|
|
94749
94771
|
prompt: `LIFESTYLE/CLEAN: продукт в контексте момента приёма — кухня, обеденный стол, рядом с едой/чаем. Без человека, но с "историей" использования. Тёплые цвета, естественный свет.`,
|
|
94750
|
-
headlineAngle:
|
|
94751
|
-
bulletsFocus:
|
|
94772
|
+
headlineAngle: `ЗАГОЛОВОК: угол «социальное доказательство». Цифры клиентов/пользователей + основная выгода продукта. Формат: «X из Y выбирают...», «Более X клиентов...». НЕ копируй примеры из других категорий.`,
|
|
94773
|
+
bulletsFocus: `БУЛЛИТЫ: акцент на простоте использования — лёгкость приёма, удобство, доступность без рецепта. Адаптируй под продукт и язык GEO. Все тексты генерируй строго на языке, указанном в параметре GEO. Примеры слов в промпте — только ориентир для смысла, переводи их на нужный язык.`
|
|
94752
94774
|
},
|
|
94753
94775
|
{
|
|
94754
94776
|
name: 'WOW-эффект',
|
|
94755
94777
|
prompt: `WOW-ЭФФЕКТ: визуальная метафора действия — свежесть, очищение, лёгкость. Капли воды, зелёные листья в движении, эффект «чистоты изнутри». Премиально, минималистично. Фокус на эффекте, не на человеке.`,
|
|
94756
|
-
headlineAngle:
|
|
94757
|
-
bulletsFocus:
|
|
94778
|
+
headlineAngle: `ЗАГОЛОВОК: угол «ключевое действие продукта». Что продукт делает + мягкий результат. Визуальная метафора в заголовке. НЕ копируй примеры из других категорий.`,
|
|
94779
|
+
bulletsFocus: `БУЛЛИТЫ: акцент на механизме действия — что продукт делает, как работает, какой эффект даёт. Адаптируй под продукт и язык GEO. Все тексты генерируй строго на языке, указанном в параметре GEO. Примеры слов в промпте — только ориентир для смысла, переводи их на нужный язык.`
|
|
94758
94780
|
},
|
|
94759
94781
|
{
|
|
94760
94782
|
name: 'Эмоция результата',
|
|
94761
94783
|
prompt: `ЭМОЦИЯ РЕЗУЛЬТАТА: реальный человек с естественным облегчением (тихий выдох, расслабленная поза), без стоковой улыбки. Фокус на человеке и его состоянии после приёма.`,
|
|
94762
|
-
headlineAngle:
|
|
94763
|
-
bulletsFocus:
|
|
94784
|
+
headlineAngle: `ЗАГОЛОВОК: угол «срочность + результат». Ограниченное предложение/время + основная выгода продукта. Формат: «Только сегодня — ...», «Последние дни — ...». НЕ копируй примеры из других категорий.`,
|
|
94785
|
+
bulletsFocus: `БУЛЛИТЫ: акцент на ощущениях пользователя — как человек себя чувствует после приёма, улучшение качества жизни. Адаптируй под продукт и язык GEO. Все тексты генерируй строго на языке, указанном в параметре GEO. Примеры слов в промпте — только ориентир для смысла, переводи их на нужный язык.`
|
|
94764
94786
|
}
|
|
94765
94787
|
];
|
|
94766
94788
|
|