Картинки и видео
Генерация картинок и асинхронная генерация видео через OpenAI SDK.
Картинки возвращаются сразу, видео делается асинхронно: вы создаёте задачу, ждёте статус и скачиваете файл. Оба API совместимы с OpenAI SDK.
Картинки
import base64
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.morphogen.ru/v1",
api_key=os.environ["MORPHOGEN_API_KEY"],
)
resp = client.images.generate(
model="flux-2-klein",
prompt="красное яблоко на белом столе",
n=2,
)
for i, image in enumerate(resp.data):
with open(f"apple-{i}.jpg", "wb") as f:
f.write(base64.b64decode(image.b64_json))Картинка приходит строкой b64_json. Режим response_format: "url" не поддерживается: хостинга картинок нет. Потоковый режим тоже не поддерживается. Параметры: Images.
Модели картинок работают и через /v1/chat/completions с modalities: ["image"]: картинка тогда приходит в choices[0].message.images[].image_url.url как data URL. Это удобно, если приложение уже построено на чате.
Видео
- Создайте задачу
video = client.videos.create( model="grok-imagine-video", prompt="бумажный кораблик на озере на закате", seconds="4", size="854x480", ) print(video.id, video.status)Ответ приходит сразу со статусом
queued. - Дождитесь результата
import time while video.status in ("queued", "in_progress"): time.sleep(10) video = client.videos.retrieve(video.id) print(video.status)Ролик обычно генерируется до пары минут. Статус
failedзначит, что генерация не удалась, деньги за неё не списываются. - Скачайте файл
client.videos.download_content(video.id).write_to_file("boat.mp4") - Удалите, когда файл не нужен
client.videos.delete(video.id)Пока вы не удалите задачу, файл хранится на нашей стороне.
Те же вызовы доступны обычным HTTP, SDK не обязателен: Создать, Получить, Скачать, Удалить.
Деньги
Перед запуском видео резервируется сумма: секунды, умноженные на цену секунды в выбранном разрешении. Если не указать generate_audio, модель со звуком возьмёт цену со звуком. После завершения списывается фактическая стоимость. Отменённая задача в очереди и любая задача со статусом failed ничего не стоят. Для картинок резерв равен числу картинок, умноженному на цену одной.
К картинкам и видео оно не применяется: замаскированный промпт даст плейсхолдеры в картинке, а демаскировать картинку нельзя. Для картинок явный X-PII-Masking: on вернёт 400 pii_masking_unsupported_endpoint. Для видео заголовок игнорируется, запрос проходит, а промпт уходит провайдеру без маскирования: не отправляйте персональные данные в промпте видео.
Ошибки
| Код | Что сделать |
|---|---|
400 unsupported_video_parameter | выберите длительность и разрешение из допустимых для модели |
400 invalid_image_count | n должно быть от 1 до 10 |
404 video_not_ready | файл запрошен до статуса completed |
409 video_cancel_unsupported | задача уже у провайдера, дождитесь завершения |
Все коды: Ошибки.