> ## Documentation Index
> Fetch the complete documentation index at: https://www.krea.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Жизненный цикл задания

> Разберитесь с каждым состоянием задания Krea — от создания до завершения — включая паттерны опроса, повторные попытки и практические стратегии обработки ошибок.

## Обзор

Все запросы на генерацию проходят через один и тот же базовый жизненный цикл:

<img className="w-full mx-auto dark:hidden" src="https://mintcdn.com/krea/ZLw3hmlHm50-cthl/images/job-status.svg?fit=max&auto=format&n=ZLw3hmlHm50-cthl&q=85&s=6cbb1b15fcde8ed4c7d7d84c2637d5c6" alt="Job lifecycle diagram" width="569" height="239" data-path="images/job-status.svg" />

<img className="w-full mx-auto dark:block hidden" src="https://mintcdn.com/krea/ZLw3hmlHm50-cthl/images/job-status-dark.svg?fit=max&auto=format&n=ZLw3hmlHm50-cthl&q=85&s=cc4c42010e1f9fb4688263f83705e37d" alt="Job lifecycle diagram" width="569" height="239" data-path="images/job-status-dark.svg" />

### Состояния задания

<span className="text-sm font-bold text-blue-900 dark:text-blue-100 font-mono bg-blue-100 dark:bg-blue-900/30 border border-blue-300 dark:border-blue-600 px-1.5 py-0.5 rounded mr-1">queued</span> Задание ожидает обработки в очереди

<span className="text-sm font-bold text-blue-900 dark:text-blue-100 font-mono bg-blue-100 dark:bg-blue-900/30 border border-blue-300 dark:border-blue-600 px-1.5 py-0.5 rounded mr-1">backlogged</span> Задание ожидает освобождения слота в вашем текущем лимите параллелизма

<span className="text-sm font-bold text-blue-900 dark:text-blue-100 font-mono bg-blue-100 dark:bg-blue-900/30 border border-blue-300 dark:border-blue-600 px-1.5 py-0.5 rounded mr-1">scheduled</span> Задание принято и запланировано к обработке

<span className="text-sm font-bold text-amber-900 dark:text-amber-100 font-mono bg-amber-100 dark:bg-amber-900/30 border border-amber-300 dark:border-amber-600 px-1.5 py-0.5 rounded mr-1">processing</span> Задание активно обрабатывается воркером

<span className="text-sm font-bold text-amber-900 dark:text-amber-100 font-mono bg-amber-100 dark:bg-amber-900/30 border border-amber-300 dark:border-amber-600 px-1.5 py-0.5 rounded mr-1">sampling</span> Задание генерирует выходные сэмплы

<span className="text-sm font-bold text-amber-900 dark:text-amber-100 font-mono bg-amber-100 dark:bg-amber-900/30 border border-amber-300 dark:border-amber-600 px-1.5 py-0.5 rounded mr-1">intermediate-complete</span> У задания есть промежуточный результат, обработка может продолжаться

<span className="text-sm font-bold text-green-900 dark:text-green-100 font-mono bg-green-100 dark:bg-green-900/30 border border-green-300 dark:border-green-600 px-1.5 py-0.5 rounded mr-1">completed</span> Задание успешно завершено, результат доступен в `result.urls`

<span className="text-sm font-bold text-red-900 dark:text-red-100 font-mono bg-red-100 dark:bg-red-900/30 border border-red-300 dark:border-red-600 px-1.5 py-0.5 rounded mr-1">failed</span> Задание завершилось ошибкой, подробности в `result.error`

<span className="text-sm font-bold text-gray-900 dark:text-gray-100 font-mono bg-gray-100 dark:bg-gray-900/30 border border-gray-300 dark:border-gray-600 px-1.5 py-0.5 rounded mr-1">cancelled</span> Задание отменено пользователем или системой

### Ошибки и отмена

**Задание может завершиться неудачно** по нескольким причинам:

* Ошибки API сервиса генерации
* Некорректные параметры или неподдерживаемые конфигурации
* Модерация контента (NSFW-фильтрация)
* Автоматическое обнаружение таймаута (3 минуты для наших инструментов, 2 часа для внешних провайдеров)

**Как отменить задание:** отправьте `DELETE`-запрос на `/jobs/{id}`. Обратите внимание: задание можно отменить только когда его статус — <span className="text-sm font-bold text-blue-900 dark:text-blue-100 font-mono bg-blue-100 dark:bg-blue-900/30 border border-blue-300 dark:border-blue-600 px-1.5 py-0.5 rounded mr-1">queued</span> или <span className="text-sm font-bold text-amber-900 dark:text-amber-100 font-mono bg-amber-100 dark:bg-amber-900/30 border border-amber-300 dark:border-amber-600 px-1.5 py-0.5 rounded mr-1">processing</span>.

<Check>
  **Важно:** неудачные и отменённые задания не тарифицируются. Вы платите только за завершённые задания.
</Check>

### Проверка статуса задания

Опрашивайте статус задания `GET`-запросом на `/jobs/{id}`. Рекомендуемые практики:

* Опрашивайте каждые 2–5 секунд, пока задание в ожидании (`backlogged`, `queued`, `scheduled`, `processing`, `sampling` или `intermediate-complete`)
* Используйте экспоненциальный backoff для более длительных заданий
* Прекращайте опрос, когда статус — <span className="text-sm font-bold text-green-900 dark:text-green-100 font-mono bg-green-100 dark:bg-green-900/30 border border-green-300 dark:border-green-600 px-1.5 py-0.5 rounded mr-1">completed</span>, <span className="text-sm font-bold text-red-900 dark:text-red-100 font-mono bg-red-100 dark:bg-red-900/30 border border-red-300 dark:border-red-600 px-1.5 py-0.5 rounded mr-1">failed</span> или <span className="text-sm font-bold text-gray-900 dark:text-gray-100 font-mono bg-gray-100 dark:bg-gray-900/30 border border-gray-300 dark:border-gray-600 px-1.5 py-0.5 rounded mr-1">cancelled</span>
* Некоторые задания могут включать превью-изображения в ответах на стадии <span className="text-sm font-bold text-amber-900 dark:text-amber-100 font-mono bg-amber-100 dark:bg-amber-900/30 border border-amber-300 dark:border-amber-600 px-1.5 py-0.5 rounded mr-1">processing</span>

**Пример реализации опроса:**

<CodeGroup>
  ```javascript Node.js theme={null}
  // npm install @krea-ai/sdk
  import { Krea } from "@krea-ai/sdk";

  const krea = new Krea({ apiKey: process.env.KREA_API_KEY });

  async function waitForJob(jobId) {
    const job = await krea.jobs.wait(jobId, { intervalMs: 2000 });
    return job.result;
  }
  ```

  ```python Python theme={null}
  import time

  def wait_for_job(job_id):
      while True:
          response = requests.get(
              f"{API_BASE}/jobs/{job_id}",
              headers={"Authorization": f"Bearer {API_TOKEN}"}
          )
          job = response.json()

          if job["status"] == "completed":
              return job["result"]
          if job["status"] in ("failed", "cancelled"):
              raise Exception(f"Job {job['status']}: {job.get('result', {}).get('error')}")

          print(f"Status: {job['status']}")
          time.sleep(2)
  ```
</CodeGroup>

## Следующие шаги

<CardGroup cols={2}>
  <Card title="Webhooks" icon="bell" href="/developers/webhooks">
    Получайте уведомления о завершении заданий
  </Card>

  <Card title="Лимиты запросов" icon="gauge" href="/developers/rate-limits">
    Разберитесь с лимитами API по тарифам
  </Card>

  <Card title="Model APIs" icon="book-open" href="/api-reference/image/flux">
    Изучите все доступные эндпоинты и параметры
  </Card>

  <Card title="API-ключи и биллинг" icon="key" href="/developers/api-keys-and-billing">
    Создавайте и управляйте API-ключами
  </Card>
</CardGroup>
