Вызов через API (изображения / видео)
Стандартный формат интерфейса OpenAI, аутентификация по токену. Изображения возвращаются синхронно в base64; видео — асинхронная задача (создать → опросить → скачать).
Группа токена
Токен должен принадлежать группе media / media-gen, иначе появится ошибка «нет доступного канала». См. Выбор группы.
Изображения · Текст → изображение
POST https://byesu.com/v1/images/generations
Authorization: Bearer sk-ваш-токен
Content-Type: application/json| Поле | Обязательно | Описание |
|---|---|---|
model | ✅ | Имя модели, см. Генерация изображений |
prompt | ✅ | Промпт |
size | Ширина x высота в пикселях, одновременно задаёт соотношение сторон и уровень разрешения: длинная сторона ≈1024 → 1K, ≈2048 → 2K, ≈3840 → 4K. Например "1024x1024" (1:1 · 1K), "2048x1152" (16:9 · 2K), "3840x3840" (1:1 · 4K). Если не указано — по умолчанию 1:1, базовый уровень |
curl https://byesu.com/v1/images/generations \
-H "Authorization: Bearer sk-ваш-токен" \
-H "Content-Type: application/json" \
-d '{
"model": "nano-banana-2",
"prompt": "Золотистый ретривер бежит по золотому пшеничному полю на закате, кинематографично",
"size": "2048x1152"
}'Ответ (изображение — PNG в base64):
{ "data": [ { "b64_json": "<строка base64>" } ] }Изображения · Изображение → изображение (референсы)
Используется POST /v1/images/edits в формате multipart/form-data, референсные изображения загружаются как файлы (имя поля image, можно передать несколько раз, каждое ≤8MB; лимит количества зависит от модели, см. Генерация изображений):
curl https://byesu.com/v1/images/edits \
-H "Authorization: Bearer sk-ваш-токен" \
-F model="nano-banana-2" \
-F prompt="Преврати эту фотографию в акварельный рисунок" \
-F size="1024x1024" \
-F image=@ref1.png \
-F image=@ref2.pngФормат ответа такой же, как при генерации по тексту.
Видео (асинхронно, в стиле Sora)
Три шага: создать задачу → опрашивать статус → скачать mp4.
import requests, time
BASE = "https://byesu.com"
H = {"Authorization": "Bearer sk-ваш-токен"}
# 1. Создаём задачу
task = requests.post(f"{BASE}/v1/videos", headers=H, json={
"model": "gemini-veo31",
"prompt": "Волны разбиваются о скалы, замедленная съёмка, кинематографично",
"seconds": "6", # длительность (сек), допустимые значения зависят от модели
"size": "1280x720", # соотношение сторон задаётся размером; 1920x1080 = 1080p (поддерживается не всеми моделями)
}).json()
# 2. Опрашиваем до завершения (от десятков секунд до нескольких минут)
while task["status"] not in ("completed", "failed"):
time.sleep(5)
task = requests.get(f"{BASE}/v1/videos/{task['id']}", headers=H).json()
# 3. Скачиваем mp4
if task["status"] == "completed":
mp4 = requests.get(f"{BASE}/v1/videos/{task['id']}/content", headers=H)
open("out.mp4", "wb").write(mp4.content)Видео из изображения: при создании задачи используйте multipart/form-data, изображение первого кадра передайте в файловом поле input_reference (model / prompt / seconds / size передаются вместе как поля формы). Для runway-gen4-turbo изображение первого кадра обязательно.
Видео тарифицируется посекундно
Цена видео = цена за секунду × seconds. Если задача завершилась сбоем, средства возвращаются автоматически.
Ошибки
- «Нет доступного канала» → неверная группа токена, см. Выбор группы
too many reference images→ количество референсных изображений превышает лимит модели- 401 / недостаточно средств / прочее → см. Частые ошибки и решения
