Изображения
Изображение делается десятки секунд, поэтому оно не приходит в ответ на запрос: вызов ставит задачу и возвращает её номер, а готовый файл забирается опросом состояния. Порядок один на все задачи и разобран в разделе Как устроена задача; здесь тот же вызов на примере одной модели этого вида.
Семейства
Как вызывать
Генерация занимает десятки секунд, поэтому изображение не приходит в ответ на запрос. Первый вызов
ставит задачу и сразу отвечает её номером, второй по этому номеру отдаёт состояние задачи, а когда
она готова — ссылку на результат. Ключ передаётся в обоих запросах заголовком
Authorization: Bearer sk-… и выпускается
в кабинете. На один ключ шлюз пропускает
30 постановок задачи и 300
запросов состояния в минуту.
Имя модели ставится в поле model тела запроса
POST /api/v1/jobs/createTask, а всё, что зависит от модели, уходит
вложенным объектом input. Ниже — готовый вызов на модели
nano-banana/2; поля остальных моделей смотрите на странице
их семейства, тело запроса от этого не меняется.
Пример вызова
# 1. Поставить задачу — в ответе придёт её номер
TASK=$(curl -s https://api.gen202.com/api/v1/jobs/createTask \
-H "Authorization: Bearer sk-ваш-ключ" \
-H "Content-Type: application/json" \
-d '{
"model": "nano-banana/2",
"input": {
"prompt": "Рыжий кот в скафандре на фоне Земли, мягкий свет",
"aspect_ratio": "1:1",
"resolution": "1K"
}
}' | jq -r '.data.taskId')
# 2. Спрашивать состояние, пока задача не закончится: waiting, queuing и
# generating означают «работа идёт», success и fail — окончательные
while true; do
RECORD=$(curl -s "https://api.gen202.com/api/v1/jobs/recordInfo?taskId=$TASK" \
-H "Authorization: Bearer sk-ваш-ключ")
STATE=$(echo "$RECORD" | jq -r '.data.state')
case "$STATE" in success|fail) break;; esac
sleep 3
done
# 3. Забрать результат. Ссылка на файл лежит в resultJson — это строка JSON
# внутри JSON, поэтому её разбирают вторым разбором (fromjson)
echo "$RECORD" | jq -r '.data |
if .state == "fail"
then "отказ \(.failCode): \(.failMsg)"
else .resultJson | fromjson | .resultUrls[0]
end'
import json
import time
import requests
headers = {"Authorization": "Bearer sk-ваш-ключ"}
# 1. Поставить задачу — в ответе придёт её номер
created = requests.post(
"https://api.gen202.com/api/v1/jobs/createTask",
headers=headers,
json={
"model": "nano-banana/2",
"input": {
"prompt": "Рыжий кот в скафандре на фоне Земли, мягкий свет",
"aspect_ratio": "1:1",
"resolution": "1K"
}
},
).json()
task_id = created["data"]["taskId"]
# 2. Спрашивать состояние, пока задача не закончится: waiting, queuing и
# generating означают «работа идёт», success и fail — окончательные
while True:
task = requests.get(
"https://api.gen202.com/api/v1/jobs/recordInfo",
headers=headers,
params={"taskId": task_id},
).json()["data"]
if task["state"] in ("success", "fail"):
break
time.sleep(3)
# 3. Разобрать итог. У неудачи причина в failCode и failMsg
if task["state"] == "fail":
raise SystemExit("отказ " + task["failCode"] + ": " + task["failMsg"])
# resultJson — строка JSON внутри JSON, поэтому разбор второй
result = json.loads(task["resultJson"])
print(result["resultUrls"][0])
print("списано кредитов:", task["creditsConsumed"])
Пример проходит весь путь: ставит задачу, повторяет запрос состояния раз в
3 секунды, пока задача не закончится, и разбирает ответ до ссылки
на файл. Разборов два, потому что поле resultJson — строка JSON
внутри JSON. В теле первого запроса стоят обязательные поля модели и значения из её
перечислений, поэтому он проходит проверку шлюза как есть.
Подставить остаётся только свой ключ.
Пример на оболочке разбирает ответ через jq; на Python своего
ничего не нужно, кроме requests.
Ответ, когда задача готова
{
"code": 200,
"msg": "success",
"data": {
"taskId": "cm8r4t0vk0001s60p2xq7f9ab",
"model": "nano-banana/2",
"state": "success",
"resultJson": "{\"resultUrls\":[\"https://gen202.com/assets/sample-nano-banana-2.jpg\"]}",
"failCode": "",
"failMsg": ""
}
}
Ссылка на файл лежит в resultJson — это строка, внутри которой ещё
один JSON, поэтому разбирать её нужно вторым разбором. Пока задача не завершилась, там пустая
строка, а в state — waiting,
queuing или generating. В настоящем ответе
есть ещё поле creditsConsumed со списанием; здесь его нет намеренно —
сумма зависит от запрошенного варианта, а цены живут в
каталоге. Все поля записи перечислены в разделе
Формат ответа.
Что учесть
-
Значения проверяются до обращения к поставщику. Поле не из списка модели или значение
вне перечисления возвращают
422и кредитов не стоят. - Своя картинка на вход. Модели правки принимают исходное изображение только ссылкой, и к ней есть требования — они собраны в разделе Загрузка своих файлов вместе с адресом, который делает ссылку из файла на диске.
- Отказ не тарифицируется. Задача, закончившаяся отказом, не списывает кредитов: удержание возвращается на баланс целиком.