Видеомодель принимает больше, чем промпт. Некоторые принимают первый и последний кадр. Некоторые принимают горстку референсных изображений. Некоторые принимают референсный клип и ведут себя иначе из-за него — заглушая собственную дорожку или беря длительность клипа как длительность результата. Некоторые принимают аудиоклип. Каждая модель рисует этот конверт иначе, и большинство наших отправляли лишь часть его.
Теперь есть единое место, описывающее конверт каждой модели: сколько изображений, разрешён ли клип и на сколько секунд, принимается ли аудио, нужно ли аудио с изображением рядом, заглушает ли клип собственный звук модели, фиксирует ли клип длительность. Это было прочитано из собственной документации провайдеров, а затем проверено в тот же день реальными рендерами на реальных ключах — так были найдены оба следующих пункта.
Файл без расширения
Передача модели клипа по ссылке — очевидный путь. На нескольких из них это ломается способом, который очень трудно угадать: файл приходит без расширения, а модель проверяет по расширению, поэтому отклоняет вполне хороший mp4 за то, что он якобы не mp4. Те же байты, отправленные встроенно, принимались везде. Поэтому каждый клип сначала перекодируется в стандартный формат и отправляется встроенно, с потолком размера, выше которого путь по ссылке всё равно используется, с предупреждением.
Уровень, который никто не получал
Второе стоило клиентам денег. У одной из видеомоделей вообще нет поля разрешения — её уровень качества настраивается через по-другому названное поле, — а платформа перед ней молча отбрасывает неопознанные поля. Поэтому каждый рендер на этой модели с момента добавления возвращался на уровне по умолчанию, пока клиент платил за более высокий уровень. Ничего не сбоило. Видео приходило. Просто это было не то видео, за которое платили.
Уровень теперь выводится из фактически тарифицированного разрешения и подтверждён зондом.
Seedance переходит на прямую линию
В тот же период всё семейство Seedance перешло с агрегатора на собственный API провайдера, оставив агрегатор как резерв. Одна строка модели, одно имя, два набора тарифов — и указанная вам цена — это то, что вы платите, даже когда основная линия отказывает и работает резерв, а книга фиксирует, какая линия реально выполнила работу, чтобы наш собственный учёт маржи читал правду, а не котировку.
Одна вещь, которую стоит знать пользователю: когда вы прикрепляете референсный клип на этой линии, провайдер тарифицирует секунды клипа поверх секунд результата. Оценка в форме говорит об этом, и число, указанное перед запуском, — это число, которое взимается.
Найдено по пути
Трём клиентам API не хватало единственного атрибута, делающего видимым в нашем контейнере класс, названный по имени провайдера. Два из них были клиентами текст-в-речь, невидимыми с того дня, когда были добавлены — почему два голоса, посеянных в каталоге, никогда не могли быть реально обслужены. Тест рефлексии теперь роняет сборку при следующем таком упущении вместо ожидания, пока кто-то заметит голос, который ничего не делает.
А страница веб-поиска, которую мы выпустили днём ранее, отвечала 403 на каждом уровне, в вебе и на мобильном. Она заблокирована родительским разрешением; оба сида ролей выдавали только три его дочерних разрешения, и нигде родитель не выводится из детей. Четыре других функции когда-то чинили это вручную. Теперь есть проверка, проходящая по дереву разрешений и падающая там, где сервис заблокирован разрешением, которым не владеет ни одна роль.