Техническое руководство
Video API: проверка reference image перед запуском задачи
Проверка reference image перед video API задачей должна происходить на вашем сервере до создания асинхронной операции: приложение подтверждает владельца, тип и размер файла, фиксирует основание для использования и только затем передаёт разрешённую ссылку или объект. Это снижает число бесполезных задач и не превращает технический запуск в обещание результата.
Сначала подтвердите право на материал
Техническая проверка не заменяет права на изображение. Для каждого файла определите, кто его загрузил, для какого проекта он используется, есть ли разрешение владельца авторских прав и, если на изображении узнаваемый человек, подтверждённое согласие. Не полагайтесь на название файла или на фразу пользователя в форме. Сохраните минимальную запись: внутренний ID, дату, версию согласия и статус проверки. Не копируйте сам файл, исходную ссылку и персональные данные в обычный лог.
Если основание неясно, безопасный результат — не создавать задачу и показать пользователю понятный путь повторной загрузки или проверки. Не просите прислать паспорт, приватную переписку или чужие учётные данные для «доказательства». Юридические требования и правила конкретной модели меняются; их нужно подтвердить отдельно для вашего сценария и региона.
Проверьте файл до сетевого вызова
Backend должен принимать reference image только через контролируемый upload или разрешённый объектный storage. Проверьте заявленный MIME type, фактическую сигнатуру, размер, число кадров и лимит времени жизни временной ссылки. Не доверяйте расширению .jpg: оно не доказывает, что внутри изображение. Ограничьте редиректы, частные адреса и произвольные URL, чтобы сервер не стал прокси для неизвестного ресурса.
Полезен двухшаговый workflow: сначала сервис загрузок выдаёт внутренний asset ID, затем server-side policy разрешает его для конкретной задачи. Так клиент не подменит путь в JSON и не сможет передать файл другого tenant. Если формат или размер не подходят, верните свой нормализованный код ошибки и не создавайте удалённую задачу «на всякий случай».
Свяжите проверку с асинхронной задачей
После разрешения входа создайте локальную запись задачи с tenant, asset ID, версией policy и идемпотентным ключом. Внешний task ID, если он появился, храните отдельно. Повтор кнопки, таймаут или повторный callback не должны создавать вторую операцию с тем же материалом. Статус результата не подтверждает права на изображение: это только техническое состояние задачи.
Перед rollout выполните малый synthetic test с собственным нейтральным изображением. Зафиксируйте дату, текущий маршрут, форму ответа и действие при ошибке. Не обещайте пользователю, что определённая модель обработает любой файл, сохранит материал на заданный срок или создаст видео без ручной проверки.
Контрольный список перед релизом
До изменения production сохраните версию адаптера, владельца решения, дату проверки и безопасный способ отключения. Прогоните положительный сценарий на синтетическом входе и отдельные отрицательные случаи: пустое поле, неверный tenant, недоступный alias, timeout и повтор того же запроса. Измеряйте только технические признаки, достаточные для поддержки, а не содержимое пользователя.
После релиза наблюдайте за нормализованными кодами ошибок, длительностью, очередью и долей отменённых операций. Если один из сигналов выходит за заранее согласованный порог, остановите rollout, не расширяйте доступ автоматически и проверьте текущий договорный каталог. Такая дисциплина полезна независимо от выбранной модели и не подменяет требования к данным, авторским правам, согласию или внутреннему контролю.
Server-side пример
Этот минимальный пример рассчитан на Node.js 18+ и защищённый server-side запуск. Он не содержит реального ключа и не утверждает наличие недокументированной функции; перед интеграцией подтвердите текущий маршрут, alias модели и схему payload.
import { randomUUID } from 'node:crypto';
export async function createCheckedVideoTask({ session, asset, fetchImpl = fetch }) {
if (!session?.tenantId || asset?.tenantId !== session.tenantId) throw new Error('asset_access_denied');
if (!['image/jpeg', 'image/png', 'image/webp'].includes(asset.mime) || asset.bytes > 8_000_000) throw new Error('invalid_reference_image');
if (!asset.rightsConfirmed || !process.env.RUSSIAAPI_API_KEY) throw new Error('policy_or_key_missing');
const response = await fetchImpl('https://russiaapi.com/v1/video/generations', {
method: 'POST', headers: { authorization: `Bearer ${process.env.RUSSIAAPI_API_KEY}`, 'content-type': 'application/json', 'idempotency-key': randomUUID() },
body: JSON.stringify({ model: process.env.RUSSIAAPI_VIDEO_MODEL, reference_image: asset.storageUrl })
});
return { accepted: response.ok, status: response.status };
}
// Confirm the documented route, model and payload before an integration run.Проверьте синтаксис командой node --check, добавьте собственную аутентификацию, контролируемые лимиты и тесты отрицательных сценариев. Не добавляйте в журнал тело запроса, ответ целиком или авторизационные заголовки.
Проверьте сценарий в RussiaAPI
Создайте собственный тестовый ключ в консоли, сверьте текущий каталог моделей и выполните обезличенный server-side smoke test. Расширяйте нагрузку только после измеримой проверки.
FAQ
Можно ли передавать ссылку на изображение прямо из браузера?
Не по умолчанию. Сначала загрузите материал в контролируемый storage, получите внутренний asset ID и выполните серверную проверку tenant, типа, размера и прав. Так клиент не подменяет произвольный URL и не получает ключ gateway.
Проверяет ли MIME type права на фото?
Нет. MIME type и сигнатура помогают отсеять технически неподходящие файлы. Авторские права, согласие человека, товарные знаки и правила использования проверяются отдельным процессом владельца проекта.
Это гарантия, что video API примет файл?
Нет. Статья описывает application-side защиту. Доступные модели, параметры, лимиты и форма ответа подтверждаются по актуальному каталогу и договору до production-запуска.