Фоновые задания
POST /v1/jobs запускает операцию в фоне. Вы сразу получаете ответ 202 и номер задания, потом сами спрашиваете состояние и забираете готовый результат. Это удобно, когда запрос долгий или соединение не хочется держать открытым.
Сейчас доступна одна операция — chat.completions (чат моделей групп op и vn). Картинки и видео через fal и sixio и так работают заданиями: см. модели fal и модели Sixio.
Пример целиком
import time
import requests
API = "https://api.6io.io/v1"
H = {"Authorization": "Bearer sixio_sk_..."}
job = requests.post(f"{API}/jobs", headers=H, json={
"model": "op/openai/gpt-4o-mini",
"operation": "chat.completions",
"input": {"messages": [{"role": "user", "content": "Привет!"}], "max_tokens": 200},
}).json()
while True:
state = requests.get(job["status_url"], headers=H).json()
if state["status"] != "running":
break
time.sleep(2)
if state["status"] == "succeeded":
result = requests.get(job["result_url"], headers=H).json()
print(result["choices"][0]["message"]["content"])
else:
print(state["status"], state.get("error"))Создать задание
input — тело обычного запроса чата без поля model (модель указывается рядом с operation). Потоковый режим (stream) в заданиях не поддерживается: для него используйте POST /v1/chat/completions. Платные инструменты и нетекстовый ввод отвергаются так же, как в обычном чате. Заголовок Idempotency-Key работает как везде. Чтобы не опрашивать состояние, добавьте webhook_url: когда задание закончится, мы отправим уведомление на этот адрес (вебхуки).
Ответ 202, заголовок Location ведёт на состояние:
{
"id": "req_8fK2xQ1mZpVwT9sJdL4nAg",
"object": "job",
"operation": "chat.completions",
"model": "op/openai/gpt-4o-mini",
"status": "running",
"status_url": "https://api.6io.io/v1/jobs/req_8fK2xQ1mZpVwT9sJdL4nAg",
"result_url": "https://api.6io.io/v1/jobs/req_8fK2xQ1mZpVwT9sJdL4nAg/result"
}Номер задания совпадает с X-Sixio-Request-Id, поэтому деньги по нему видны и в GET /v1/requests/{id}. Если свободных мест нет, ответ приходит сразу (429): задание не ждёт в очереди. Пока сервис перезапускается, новые задания получают 503 с Retry-After.
Состояние
GET /v1/jobs/{id} возвращает status:
status |
Что значит |
|---|---|
running |
задание идёт |
succeeded |
готово, результат можно забрать |
failed |
не выполнено, причина в поле error, деньги не списаны |
unknown |
поставщик не подтвердил исход (обрыв, перегрузка): результата нет, деньги проверяются и закрываются позже |
В поле billing указаны состояние денег и списанная сумма в кредитах.
Результат
GET /v1/jobs/{id}/result возвращает обычный ответ чата. Чтение ничего не запускает и ничего не списывает.
- Пока задание идёт, ответ
202со ссылкой на состояние иRetry-After. - Результат хранится ограниченное время (по умолчанию сутки). Заберите его за это время: потом
410 result_expired. - Для
failedиunknownответ409с кодомjob_failedилиjob_outcome_unknown. - Бывает, что исход был неизвестен, а проверка показала: поставщик работу выполнил. Задание станет
succeededи будет оплачено, но ответа у нас нет:409 result_unavailable. - Ответ больше 4 МБ тоже оплачен, но не сохраняется:
409 result_too_large. Такие запросы отправляйте обычнымPOST /v1/chat/completions. - Если результат временно нельзя прочитать, ответ
503сRetry-After: повторите чтение.
Отмена
Отмены заданий нет: чат нельзя отменить после отправки поставщику, обрыв соединения его не останавливает.
Деньги
Как у обычного чата: резерв перед запуском, списание по факту после ответа.
- Поставщик отказал по вашему запросу — резерв возвращается.
- Поставщик отказал из-за частоты запросов (
429) или до него не достучались — работы не было, резерв возвращается, задание заканчивается ошибкойupstream_busy. Его можно отправить снова. - Исход неизвестен (таймаут,
5xx, обрыв после отправки) — резерв остаётся, пока мы проверяем расход. Платный запрос повторно не отправляется. То же происходит с заданием, которое не закончилось за таймаут поставщика, например при перезапуске сервиса.
Что делать при сбоях — в разделе Повторы и сбои.