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 — абстракция провайдера, а не выбор одной модели в коде:
- Интерфейс
ImageGenerationProvider:generate(prompt, refs?, size, n) → Image[]; параметры и ключи провайдера — в конфиге; выход нормализуется в JPG на нашей стороне (провайдер может отдавать PNG/webp). - Провайдер — сменный. Стартовый выбирается коротким пилотом на реальных карточках по критериям: качество предметки, консистентность по референсу, качество текста на изображении, стоимость за изображение, лимиты/скорость, работа с русскоязычным промптом.
- Рекомендованный порядок пилота: Gemini Flash Image (сценарий «редактирование/товар на фоне») + FLUX.1 или Recraft (сценарий «генерация с нуля / текст на баннере»).
- SEO/тексты (OP-139) остаются на LLM-абстракции (ADR-0014) — этот ADR только про изображения.
Последствия
- Положительные: OP-141 разблокируется — пишется против абстракции, а не против конкретного API; смена/добавление провайдера = новый адаптер + конфиг, без переписывания модуля; выход всегда JPG независимо от провайдера.
- Границы (осознанно): нужен платный аккаунт/бюджет у выбранного провайдера; финальный провайдер не фиксируется этим ADR — его определяет мини-пилот (бенч на реальных карточках), который стоит оформить подзадачей OP-141 или отдельным тикетом. До пилота дефолт для разработки — FLUX.1 через fal/Replicate (дёшево, открытые веса).
- Зависимость от внешней нестабильности: лидер рынка image-gen меняется — шорт-лист перепроверять перед пилотом; абстракция делает это дешёвым.