Автор написал двести страниц. Герои дышат, мир уплотнился, в энциклопедии полно статей, на карте — двадцать городов, на таймлайне — три акта. И тут хочется увидеть. Лицо главной героини — какое оно? Не имя, не описание из карточки, а лицо — таким, каким автор его представляет, когда пишет диалог. Атмосферу той самой таверны — закопчённые балки, бочки в углу, узкое окно на канал. Эмблему ордена Сребряной Печати — символ, который герой носит на плаще. Карту континента — настоящую, в духе старых атласов, а не сетку с кружочками.
Можно открыть в соседней вкладке Midjourney, ChatGPT с DALL-E, Stable Diffusion и так далее — и пол-дня перетягивать промпты руками. Из карточки персонажа — копировать роль, возраст, особые приметы. Из заметок о таверне — складывать сенсорику в один длинный английский абзац. И в итоге получить вид космонавта, потому что модель что-то поняла не так. А потом понять, что у тебя в руках полтора десятка картинок без места — куда их? В отдельную папку на диске, рядом с папкой «лор», в которую автор и так не лазит.
Мы хотим, чтобы у писателя был один и тот же ИИ-помощник, который знает контекст книги, на расстоянии одной кнопки от карточки сущности. Чтобы картинка ложилась не в папку, а в нужное место — на героя, на локацию, на обложку произведения. И чтобы это работало через ту же инфраструктуру, через которую работает текстовый помощник по сценам и персонажам, — без отдельных подписок, отдельных промптов и отдельной возни.
Одна инфраструктура для всего. Под капотом — генератор картинок, и устроен он так же, как наш текстовый агент: цепочка моделей с приоритетами, повторы при ошибках, единый лог запросов. Сейчас в цепочке три модели от трёх разных провайдеров. Если основной не отвечает или возвращает мусор — автоматически идём к следующему в цепочке, пользователь не видит этого переключения, видит только результат. В дальнейшем хотим сделать чтобы была возможность сразу получать несколько вариантов от разных сетей и сохранять тот который больше понравился (или все пойдут в галерею).
Под каждый тип картинки — отдельный пайплайн с собственным промпт-билдером, собственным размером выходного файла. Картинка на выходе всегда уезжает в наш S3 (локальные файлы на диске, ежедневный бэкап на удалённый хост — потерять авторские картинки нельзя), а в БД сохраняется только запись с метаданными и ссылка с нужной сущности.
Аватары героев. Кнопка «сгенерировать» открывается прямо в карточке персонажа, в кнопке над аватарной плиткой. Промпт собирается из карточки: роль (главный герой / антагонист / второстепенный), архетип, физические признаки (возраст, рост, телосложение, цвет волос и глаз, особые приметы), первое предложение биографии, жанр произведения. Имя не передаём — модели любят подписать его кириллицей косноязычно, и портить кадр; «литературный персонаж — главный герой, возраст 65 лет, седые длинные волосы, шрам через бровь» работает лучше, чем «портрет Андрея, 65 лет, …».
Размер портретов — квадрат 512×512, стиль — «студийный портретный снимок, масляная живопись, мягкий рассеянный свет, нейтральный фон». Это не «обложка книги» (там модель попробует написать название) и не «фотореализм» (получается недоросший AI-блеск); это полугенеративная живопись, которая хорошо ложится на любую карточку — что у фэнтези, что у современной прозы.
Эмблемы групп. Семья, орден, гильдия, фракция — у каждой группы свой символ. Промпт собирается из названия группы, типа (семья / орден / фракция), цвета (если он задан), короткого описания. Стиль — «геральдический знак, минимализм, плоский монохром с одним акцентным цветом», 512×512 квадрат, белый фон. Получается значок, который можно поставить как герб группы — без поднимания темы «найти геральдиста и заказать у него отрисовку».
Главная-картинка локации. Это атмосферный пейзаж — 1024×576, широкий 16:9 под hero-блок в карточке. Промпт собирается из карточки места: тип (город, корабль, остров), регион, ключевая сенсорика (что видишь — поле уходит первым в промпт), теги атмосферы, климат, погода по умолчанию, первое предложение описания, жанр работы. Заголовок локации — не передаём (та же причина: модель попытается подписать), название города — это смысловой контекст, а не текст на кадре.
Стиль — «кинематографичный пейзаж, атмосферный environment art, масляная живопись, без людей на переднем плане». Картинка ложится фоном в блок карточки (200px на десктопе, тёмный градиент снизу, чтобы заголовок читался поверх), и плюс крупно — в начале вкладки «Описание», 16:9 на всю ширину контента. Клик — лайтбокс на весь экран.
Карта мира. Отдельный пайплайн под карты-подложки — 1024×768, 4:3 под канвас «Атласа» (раздел «Мир» с пинами поверх карты). Стиль — «стилизованная карта мира с высоты птичьего полёта, тушью и акварелью по пергаменту, рельеф штриховкой, береговая линия с лёгкой растушёвкой моря; без подписей, без легенды, без компасной розы».
Промпт собирается из жанра произведения и подсказки о масштабе (континент, регион, город, планета), плюс — и это главная ручка — из вашего свободного текста: «континент с тремя королевствами, на севере горный хребет, юг — пустыня, остров за проливом на западе». Без этого поля модель генерит обобщённую fantasy-карту, которая может быть красивой, но к вашему миру отношения не имеет. С полем — попытается передать ваш конкретный рельеф. (Поле сохраняется в карте, и при повторной генерации с теми же словами можно крутить варианты, пока не понравится.)
Обложка произведения. Портретная 2:3 (768×1152) — стандартная книжная пропорция. Промпт собирается из типа произведения («роман», «повесть», «новелла»), жанров и первого предложения общего описания. Заголовок книги и имя автора, как и везде, не шлём — модель попытается подписать.
Стиль — «литературная книжная обложка, портретная композиция, выразительная центральная иллюстрация в духе изданий small press, мягкая палитра под жанр; без названия, без имени автора, без любых надписей». Получаете не финальную обложку для печати, а черновик, который можно показать друзьям-бета-ридерам или поставить в превью на дашборде. Финальную в Photoshop ещё придётся доделать (или заказать), но первый кадр у вас уже есть.
Обложка ложится плиткой в правый верх карточки произведения на дашборде, 52×78px, заменяет собой ребрышковую закладку. Большой просмотр — модалка с превью и кнопками «заменить файлом / сгенерировать новую / удалить».
Главная-картинка статьи в вики. Тут отдельная семантика, которую стоит объяснить. Wiki-страницы у нас бывают двух типов: builtin (синхронизируются из карточек персонажей/локаций/групп) и custom (написанные с нуля). Для builtin страницы по умолчанию картинка — унаследованная картинка из исходной сущности: открываете статью о персонаже Андрее — наверху видите его аватар. Меняете аватар в карточке — меняется и в вики, без отдельной возни.
Но иногда хочется другой кадр именно для вики — не портрет, а сцену с участием героя, или эмблему, или абстрактный знак. Тогда можно загрузить поверх — собственную картинку для вики, и она перекроет унаследованную. Если потом передумать — кнопка «к исходной» сбросит обратно к наследуемому. Это удобно: один файл-источник у сущности, второй (опциональный) — у вики-статьи, никакого дублирования, никакого «откуда здесь две разные».
Генерации для вики мы не делаем: вики слишком разнообразна по типу содержимого, и единого хорошего промпта под неё не подобрать. Если хотите сгенерировать — идите в исходную карточку (персонажа / локации) и сгенерируйте там; в вики через наследование само подтянется.
Почему мы запретили моделям писать буквы. В каждом нашем промпте — и в основном тексте, и в отдельном negative-prompt поле — явно стоит «без названий, без подписей, без любых надписей». Это не каприз, это опыт. Все генеративные image-модели пытаются «подписать» картинку — поставить название книги на обложке, имя героя у портрета, названия городов на карте. И все они делают это плохо на кириллице: получается «Ттанцующий ввоин» или «Алгерра» с лишними буквами, и красивый кадр сразу превращается в стыдный.
Решение, как ни странно, — не пытаться улучшить надписи (этого нынешние модели не умеют), а полностью убрать их с картинки. Заголовок локации? Под кадром — текстом, не на кадре. Название книги? В UI рядом с обложкой, не на самой обложке. Имя героя? Подпись под портретом, не в нём. Это даёт нам два выигрыша: качество кадра растёт (модель не отвлекается на буквы и тратит «внимание» на композицию и атмосферу), и юзер всегда может прочитать текст — а не разбираться, что там модель попыталась подписать.
Где живёт лимит. На бете — 50 хранимых картинок на пользователя и 20 генераций в день. Хватает, чтобы перебрать аватары для основной команды героев, эмблемы для всех групп, hero-кадры для ключевых локаций и обложку произведения с парой вариантов карты. Когда тарифы появятся — лимиты станут слабее, не строже; пока это бета-щедрость без оплаты.
На телефоне. Аватары, эмблемы и hero-картинки локаций — то же самое, что на десктопе: hover-actions сжимаются под тап, генерация прячется в общую модалку ИИ-помощника, лайтбокс — на весь экран. Карта-подложка и обложка произведения на телефоне тоже видны (если их загрузил на десктопе), но генерация их — пока только с большого экрана: модалки с длинными formami кнопок неудобны на маленьком экране, а интерфейс хочется делать без компромиссов.
Что у нас впереди.
Главное — референс-картинка как часть промпта. Сейчас вы пишете описание словами, модель — рисует с нуля. Скоро можно будет приложить своё изображение как референс: «вот моё мысленное представление, нарисуй ближе к этому». Это закрывает важную нишу: автор может загрузить фотографию знакомого человека (которого он держит в голове как прообраз героя), и аватар будет похож, без необходимости описывать словами «зелёные глаза, шрам через бровь». То же — для локаций (photo атмосферного места из реального мира как референс) и обложек (любимая книга в похожем жанре как стилевая подсказка).
Дальше — варианты одним прогоном. Сейчас одна генерация = одна картинка; если не нравится — нажимайте «сгенерировать новую». Скоро — три варианта одним кликом, на одной странице, и выбираете лучший. Это удобнее: видно сразу, в каком направлении модель «думает», и проще выбрать тот вариант, в котором композиция, атмосфера и цвет ближе всего к нужному.
И — инпейнт. Когда у автора уже есть подходящая картинка, но в ней что-то одно не так — слишком тёмный угол, лишний предмет на столе, не то выражение лица, — можно будет выделить область и попросить модель её перерисовать, не трогая остальное. Это резко поднимает «коэффициент годности» одной генерации: вместо «получилось 9/10, надо генерить заново» — получаете «9/10, поправил один кусок, готово».
В сумме генерация картинок — это не «отдельная ИИ-фича рядом с текстом», это тот же инструмент, что текстовый помощник, только с другой модальностью выхода. Промпт собирается из того, что автор уже написал в карточке. Результат ложится прямо на нужную сущность. Хранится у нас, бэкапится у нас, отдаётся обратно через тот же API, через который работает всё остальное. И — это важно — каждая картинка ограничена там, где модели слабее (буквы, лица в фотореализме); там, где модели сильнее (атмосфера, композиция, стиль), — мы их максимально раскрепощаем.
Цель та же, что и у всего Стола Писателя: автору важно сидеть и писать. Если по дороге к этому хочется увидеть лицо героини, или таверну на Рыбной улице, или континент с тремя королевствами — это должно занимать пять секунд и происходить там, где это будет потом нужно, а не в третьей вкладке браузера с отдельной подпиской.
Следующий пост — о том, что мы сделали с дашбордом и единой панелью разделов: как мы наконец-то унифицировали навигацию между редактором, вики и экспортом, чтобы переключаться между ними одним кликом из любого места.
— команда Стол Писателя
Хотите присоединиться к обсуждению?
Комментировать могут только зарегистрированные пользователи.