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

# Генерация изображений Flux Kontext

> - Асинхронная обработка: после отправки возвращается идентификатор задачи для последующего запроса

- Модели Pro и Max поддерживают генерацию по тексту и редактирование по референсным изображениям

- Поле `expires_at` в результате указывает время истечения срока действия ссылки на изображение


<RequestExample>
  ```bash cURL theme={null}
  curl --request POST \
    --url https://api.apimart.ai/v1/images/generations \
    --header 'Authorization: Bearer <token>' \
    --header 'Content-Type: application/json' \
    --data '{
      "model": "flux-kontext-pro",
      "prompt": "Change hair color to blue",
      "image_urls": ["https://upload.apimart.ai/f/models/9998230420418352-159728fe-5ae8-4330-857a-a84c034d8d21-flux-kontext-pro.webp"],
      "size": "16:9"
    }'
  ```

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

  url = "https://api.apimart.ai/v1/images/generations"

  payload = {
      "model": "flux-kontext-pro",
      "prompt": "Change hair color to blue",
      "image_urls": ["https://upload.apimart.ai/f/models/9998230420418352-159728fe-5ae8-4330-857a-a84c034d8d21-flux-kontext-pro.webp"],
      "size": "16:9"
  }

  headers = {
      "Authorization": "Bearer <token>",
      "Content-Type": "application/json"
  }

  response = requests.post(url, json=payload, headers=headers)

  print(response.json())
  ```

  ```javascript JavaScript theme={null}
  const url = "https://api.apimart.ai/v1/images/generations";

  const payload = {
    model: "flux-kontext-pro",
    prompt: "Change hair color to blue",
    image_urls: ["https://upload.apimart.ai/f/models/9998230420418352-159728fe-5ae8-4330-857a-a84c034d8d21-flux-kontext-pro.webp"],
    size: "16:9"
  };

  const headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
  };

  fetch(url, {
    method: "POST",
    headers: headers,
    body: JSON.stringify(payload)
  })
    .then(response => response.json())
    .then(data => console.log(data))
    .catch(error => console.error("Error:", error));
  ```
</RequestExample>

<ResponseExample>
  ```json 200 theme={null}
  {
    "code": 200,
    "data": [
      {
        "status": "submitted",
        "task_id": "task_01KFG5BBFNK1YQDTJDZY0P0QT2"
      }
    ]
  }
  ```

  ```json 401 theme={null}
  {
    "error": {
      "code": 401,
      "message": "Не удалось выполнить аутентификацию. Проверьте API-ключ.",
      "type": "authentication_error"
    }
  }
  ```

  ```json 402 theme={null}
  {
    "error": {
      "code": 402,
      "message": "Недостаточно средств. Пополните баланс.",
      "type": "payment_required"
    }
  }
  ```
</ResponseExample>

## Поддерживаемые модели

| Модель             | Описание                                                                           |
| ------------------ | ---------------------------------------------------------------------------------- |
| `flux-kontext-pro` | Flux Kontext Pro для генерации и редактирования изображений                        |
| `flux-kontext-max` | Flux Kontext Max для генерации и редактирования изображений с повышенным качеством |

## Авторизация

<ParamField header="Authorization" type="string" required>
  Для всех конечных точек требуется аутентификация с помощью Bearer Token.

  Получение API-ключа:

  Перейдите на [страницу управления API-ключами](https://apimart.ai/keys), чтобы получить API-ключ.

  Добавьте его в заголовок запроса:

  ```text theme={null}
  Authorization: Bearer YOUR_API_KEY
  ```
</ParamField>

## Тело запроса

<ParamField body="model" type="string" required>
  Название модели:

  * `flux-kontext-pro` — Kontext Pro для генерации и редактирования изображений
  * `flux-kontext-max` — Kontext Max для генерации и редактирования изображений с повышенным качеством
</ParamField>

<ParamField body="prompt" type="string" required>
  Текстовое описание для генерации или редактирования изображения.
</ParamField>

<ParamField body="image_urls" type="array">
  Список референсных изображений. Без этого параметра выполняется генерация по тексту; при его наличии изображения редактируются.

  **Ограничения:**

  * Не более 4 изображений
  * Поддерживаются общедоступные URL
  * Поддерживаются изображения в формате Base64
  * Суммарное число пикселей выходного изображения и всех референсов не должно превышать 9 МП

  Если URL референса недоступен, задача может вернуть `temporarily unavailable dependency`. В таком случае сначала проверьте, что URL общедоступен, не истёк и не блокирует внешний доступ.
</ParamField>

<ParamField body="size" type="string" default="1:1">
  Соотношение сторон изображения.

  Поддерживаемые соотношения сторон:

  * `1:1` — квадрат (по умолчанию)
  * `4:3` — горизонтальное 4:3
  * `3:4` — вертикальное 3:4
  * `16:9` — широкоформатное горизонтальное
  * `9:16` — широкоформатное вертикальное
  * `3:2` — горизонтальное 3:2
  * `2:3` — вертикальное 2:3
  * `21:9` — сверхширокое
  * `9:21` — сверхвысокое

  Также можно передать строку пикселей, например `1024x1536`. Kontext сопоставляет её с ближайшим поддерживаемым соотношением сторон и не гарантирует точные указанные размеры.

  Параметр `resolution` не влияет на результат Kontext, который остаётся около 1 МП. Не передавайте `width` или `height`: Kontext не поддерживает эти параметры, и задача завершится с ошибкой.
</ParamField>

<ParamField body="output_format" type="string" default="png">
  Формат выходного изображения:

  * `png` — PNG (по умолчанию)
  * `jpeg` — JPEG
  * `webp` — WebP
</ParamField>

<ParamField body="response_format" type="string">
  Совместимый параметр формы ответа. Допустимые значения: `url` и `b64_json`. Он не изменяет формат изображения; если также передан `output_format`, приоритет имеет `output_format`.
</ParamField>

<ParamField body="n" type="integer" default="1">
  Число генерируемых изображений. Поддерживается только значение `1`.
</ParamField>

<ParamField body="seed" type="integer">
  Случайное начальное значение. Фиксированный seed при остальных неизменных параметрах позволяет воспроизвести тот же результат; если параметр не передан, значение выбирается случайно.
</ParamField>

<ParamField body="prompt_upsampling" type="boolean" default="false">
  Включает или отключает улучшение промпта:

  * `true` — включено
  * `false` — отключено (по умолчанию)

  > Явно укажите `false`, чтобы отключить переформулирование промпта.
</ParamField>

<ParamField body="safety_tolerance" type="integer" default="2">
  Уровень допустимости при проверке контента.

  Диапазон: 0–6. Чем выше значение, тем менее строгая проверка применяется.
</ParamField>

### Фактические размеры результата

| Соотношение | Фактический размер |
| ----------- | ------------------ |
| `1:1`       | 1024×1024          |
| `4:3`       | 1184×880           |
| `3:4`       | 880×1184           |
| `16:9`      | 1392×752           |
| `9:16`      | 752×1392           |
| `3:2`       | 1248×832           |
| `2:3`       | 832×1248           |
| `21:9`      | 1568×672           |
| `9:21`      | 672×1568           |

## Примеры использования

**Редактирование по входному изображению**

```json theme={null}
{
  "model": "flux-kontext-pro",
  "prompt": "Change the background to a beach",
  "image_urls": ["https://example.com/photo.jpg"],
  "size": "16:9",
  "output_format": "png"
}
```

**Генерация только по тексту**

```json theme={null}
{
  "model": "flux-kontext-max",
  "prompt": "A blue cat",
  "size": "1:1",
  "seed": 12345
}
```

**Редактирование по нескольким референсам**

```json theme={null}
{
  "model": "flux-kontext-max",
  "prompt": "Place the person from image 1 into the scene from image 2 and harmonize the lighting",
  "image_urls": [
    "https://example.com/person.jpg",
    "https://example.com/scene.jpg"
  ],
  "size": "4:3"
}
```

## Ответ

<ResponseField name="code" type="integer">
  Код состояния ответа.
</ResponseField>

<ResponseField name="data" type="array">
  Массив данных ответа.

  <Expandable title="Свойства">
    <ResponseField name="status" type="string">
      Статус задачи:

      * `submitted` — отправлена
    </ResponseField>

    <ResponseField name="task_id" type="string">
      Уникальный идентификатор задачи для последующего получения результата.
    </ResponseField>
  </Expandable>
</ResponseField>

## Получение результата задачи

После успешной отправки опрашивайте статус задачи через `GET /v1/tasks/{task_id}`. Подробности приведены на странице [получения статуса задачи](/ru/api-reference/tasks/status).

### Пример успешного ответа

```json theme={null}
{
  "code": 200,
  "data": {
    "id": "task_01KFG5BBFNK1YQDTJDZY0P0QT2",
    "status": "completed",
    "progress": 100,
    "created": 1785133674,
    "completed": 1785133683,
    "actual_time": 9,
    "estimated_time": 15,
    "result": {
      "images": [
        {
          "url": [
            "https://upload.apimart.ai/f/image/xxxxxxxx-flux-kontext.png"
          ],
          "expires_at": 1785220083
        }
      ]
    }
  }
}
```

Изображение доступно по пути `data.result.images[0].url[0]`. `expires_at` — Unix-время истечения срока действия этой ссылки. Сохраните изображение до указанного момента.

### Статусы задачи

| Статус                  | Значение                                                                                                   |
| ----------------------- | ---------------------------------------------------------------------------------------------------------- |
| `submitted` / `pending` | Задача принята или находится в очереди; продолжайте опрос                                                  |
| `processing`            | Идёт генерация; продолжайте опрос                                                                          |
| `completed`             | Генерация завершена; результат находится в `result.images`                                                 |
| `failed`                | Генерация завершилась с ошибкой; причина находится в `data.error.message`, средства возвращаются полностью |

### Пример ответа с ошибкой

```json theme={null}
{
  "code": 200,
  "data": {
    "status": "failed",
    "error": {
      "type": "task_failed",
      "code": "task_failed",
      "message": "width/height are not supported by flux-kontext-pro"
    }
  }
}
```

Некорректные параметры модели не возвращают синхронный ответ 400. Отправка возвращает HTTP 200 и `task_id`, затем при опросе задача переходит в `failed`. Полная причина всегда находится в `error.message`; значение `error.code` — `task_failed`. За неуспешную задачу средства возвращаются полностью.

## Примечания

1. **Асинхронная обработка**: после отправки возвращается `task_id`. Опрашивайте `/v1/tasks/{task_id}`, чтобы получить результат.
2. **Требования к референсам**: поддерживается до 4 референсных изображений по общедоступным URL или в формате Base64; суммарный объём выхода и всех референсов не должен превышать 9 МП.
3. **Правила размера**: соотношение по умолчанию — `1:1`; `resolution` не влияет на результат, а `width` и `height` не поддерживаются.
4. **Число изображений**: параметр `n` должен иметь значение `1`.
5. **Переформулирование промпта**: явно укажите `prompt_upsampling: false`, чтобы отключить переформулирование промпта.
6. **Ссылка на результат**: срок действия URL изображения определяется соответствующим Unix-временем `expires_at`. Сохраните изображение до истечения срока.
