From bcb6583883064b8b3c22caad858a52f438fa4c43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B8=D0=BA=20=28Claude=29?= Date: Wed, 10 Jun 2026 08:55:39 +0300 Subject: [PATCH] feat: upgrade to gpt-image-2, switch to response_format=url MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - app_settings AI_IMAGE_MODEL: gpt-image-1-mini → gpt-image-2 - covers.js generateCoverViaImageGenerations: добавлен response_format='url' (рекомендация провайдера: url быстрее, b64 весит ~5MB) Порядок обработки ответа: url → b64_json (fallback для старых моделей) - aiUsage.js: добавлена цена gpt-image-2 в IMAGE_PRICES_USD --- src/services/aiUsage.js | 3 ++- src/services/covers.js | 8 ++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/services/aiUsage.js b/src/services/aiUsage.js index 0fbf3b3..3b4222c 100644 --- a/src/services/aiUsage.js +++ b/src/services/aiUsage.js @@ -30,8 +30,9 @@ const TEXT_PRICES_USD_PER_1M = { // USD за 1 картинку (приблизительно — aiguoguo не публикует точно). const IMAGE_PRICES_USD = { + 'gpt-image-2': 0.04, // новая модель, ориентировочно как gpt-image-1 'gpt-image-1': 0.04, - 'gpt-image-1-mini': 0.01, // оценка, поправь после первого месяца использования + 'gpt-image-1-mini': 0.01, 'dall-e-3': 0.04, 'dall-e-2': 0.02, }; diff --git a/src/services/covers.js b/src/services/covers.js index 84f240e..ec982dc 100644 --- a/src/services/covers.js +++ b/src/services/covers.js @@ -278,6 +278,7 @@ async function generateCoverViaImageGenerations({ prompt }) { prompt: prompt.slice(0, 4000), n: 1, size: '1024x1024', + response_format: 'url', // рекомендовано провайдером: url быстрее чем b64 (~5MB) }, { headers: { Authorization: `Bearer ${config.ai.imageApiKey}` }, @@ -308,14 +309,13 @@ async function generateCoverViaImageGenerations({ prompt }) { requestType: 'image', model, imageCount: 1, durationMs: Date.now() - started, succeeded: true, }).catch(() => {}); - // b64_json или url - const b64 = item.b64_json; - if (b64) return { bytes: Buffer.from(b64, 'base64'), format: 'png' }; + // Приоритет: url (быстро) → b64_json (fallback для старых моделей) if (item.url) { const r = await axios.get(item.url, { responseType: 'arraybuffer', timeout: 60_000 }); return { bytes: Buffer.from(r.data), format: 'png' }; } - throw new Error('No b64_json or url in response'); + if (item.b64_json) return { bytes: Buffer.from(item.b64_json, 'base64'), format: 'png' }; + throw new Error('No url or b64_json in response'); } /**