Перейти к основному содержимому

0033. Провайдер генерации изображений для карточек товара

Копия ADR из репозитория: backend/docs/adr/0033-image-generation-provider.md. Канонический текст — в репозитории; портал обновляется командой npm run sync:adr.

  • Статус: accepted (2026-07-07 — принята архитектура «абстракция провайдера + шорт-лист + критерии пилота»; конкретный провайдер фиксируется коротким пилотом на этапе реализации)
  • Дата: 2026-07-07
  • Связанные задачи: OP-140 (Spike · 5.13 · Генерация контента); потребители — OP-141 (интеграция генерации изображений), OP-142 (хранение/версионирование контента), OP-139 (генерация текстов)
  • Связанные ADR: ADR-0014 (абстракция LLM-провайдера — тот же паттерn сменного провайдера)

Контекст и проблема​

ТЗ 5.13 требует генерацию изображений для карточек, помечает модель как «предположительно NanoBanana (уточнить актуальный лидер)», формат вывода — JPG. В отличие от текста («любая бесплатная LLM», ADR-0014), качественная генерация изображений платная/хостится — «бесплатной» опции промышленного уровня нет. Рынок image-gen меняется на горизонте месяцев, поэтому жёстко «зашивать» одного провайдера в код — ошибка.

«NanoBanana» из ТЗ — кодовое имя Google Gemini 2.5 Flash Image (силён в редактировании по референсу и консистентности объекта — удобно для «товар на новом фоне»).

Шорт-лист провайдеров​

ПровайдерСильная сторонаЗамечание
Gemini 2.5 Flash Image (Nano Banana)Редактирование по референсу, консистентность товараОблачный API Google
FLUX.1 (Black Forest Labs) через fal/ReplicateОткрытые веса, гибко и дёшево (schnell/dev)Генерация с нуля; редактирование слабее
Recraft V3Заточен под e-com/бренд-стиль, хорошо кладёт текст на изображениеОблачный API
Ideogram / SDXL (self-host)Текст на картинке / полный контроль и ценаSDXL уступает SOTA по качеству

Решение​

По образцу ADR-0014 — абстракция провайдера, а не выбор одной модели в коде:

  1. Интерфейс ImageGenerationProvider: generate(prompt, refs?, size, n) → Image[]; параметры и ключи провайдера — в конфиге; выход нормализуется в JPG на нашей стороне (провайдер может отдавать PNG/webp).
  2. Провайдер — сменный. Стартовый выбирается коротким пилотом на реальных карточках по критериям: качество предметки, консистентность по референсу, качество текста на изображении, стоимость за изображение, лимиты/скорость, работа с русскоязычным промптом.
  3. Рекомендованный порядок пилота: Gemini Flash Image (сценарий «редактирование/товар на фоне») + FLUX.1 или Recraft (сценарий «генерация с нуля / текст на баннере»).
  4. SEO/тексты (OP-139) остаются на LLM-абстракции (ADR-0014) — этот ADR только про изображения.

Последствия​

  • Положительные: OP-141 разблокируется — пишется против абстракции, а не против конкретного API; смена/добавление провайдера = новый адаптер + конфиг, без переписывания модуля; выход всегда JPG независимо от провайдера.
  • Границы (осознанно): нужен платный аккаунт/бюджет у выбранного провайдера; финальный провайдер не фиксируется этим ADR — его определяет мини-пилот (бенч на реальных карточках), который стоит оформить подзадачей OP-141 или отдельным тикетом. До пилота дефолт для разработки — FLUX.1 через fal/Replicate (дёшево, открытые веса).
  • Зависимость от внешней нестабильности: лидер рынка image-gen меняется — шорт-лист перепроверять перед пилотом; абстракция делает это дешёвым.