# Действия с результатом

> Увеличить, продлить, доработать готовый результат: поле actions задачи.

## <a id="list"></a>Что можно сделать

Готовый результат можно доработать: увеличить картинку из сетки Midjourney, продлить видео Veo, разделить песню Suno на дорожки, конвертировать 3D-модель Tripo и так далее. Что можно сделать с задачей прямо сейчас, перечислено в её поле actions: его отдаёт GET /v1/tasks/{id}, когда задача succeeded. В списке задач (GET /v1/tasks) этого поля нет, пустой список значит, что делать с задачей нечего.

Так выглядит сетка Midjourney в ответе GET /v1/tasks/{id} (часть полей и действий опущена):

```json
{
  "id": "TASK_ID",
  "model_key": "midjourney",
  "status": "succeeded",
  "actions": [
    {
      "action": "upscale",
      "title": "Увеличить картинку из сетки",
      "artifact_index": 0,
      "request": {
        "model": "midjourney",
        "settings": {
          "version": "upscale",
          "source_task_id": "TASK_ID",
          "index": 0
        }
      },
      "data": null
    },
    {
      "action": "reroll",
      "title": "Повторить сетку",
      "artifact_index": null,
      "request": {
        "model": "midjourney",
        "settings": {
          "version": "reroll",
          "source_task_id": "TASK_ID"
        }
      },
      "data": null
    }
  ]
}
```

| Поле | Что в нём |
|---|---|
| `action` | Режим модели, который делает это действие, например upscale. |
| `title` | Название действия для человека, на языке запроса. |
| `artifact_index` | index файла в result.artifacts, с которым работает действие. null: действие над всем результатом. |
| `request` | Готовое тело для POST /v1/price и POST /v1/tasks: ключ модели и settings режима. |
| `data` | Что нужно форме действия: области картинки Grok, слои разбора Seedream, части песни Eleven Music, название, длина и слова версии песни Suno. null, когда ничего не нужно. |

## <a id="run"></a>Запустить действие

Действие это режим той же модели, только работает он с прошлой задачей. В settings значение режима стоит в поле, которое переключает режимы модели (у Midjourney version, у Tripo task_type, у остальных mode), id готовой задачи в source_task_id, а index файла результата в index, если действие работает с одним файлом. В request такой запрос уже собран: отправьте его в POST /v1/price, чтобы узнать цену, и в POST /v1/tasks, чтобы запустить.

```bash
curl -X POST "https://api.cyhub.ai/v1/tasks" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: order-1042" \
  --data '{
  "model": "midjourney",
  "settings": {
    "version": "upscale",
    "source_task_id": "TASK_ID",
    "index": 0,
    "upscale_type": "creative"
  }
}'
```

```python
import requests

API = "https://api.cyhub.ai/v1"
HEADERS = {"Authorization": "Bearer YOUR_API_KEY"}

body = {
  "model": "midjourney",
  "settings": {
    "version": "upscale",
    "source_task_id": "TASK_ID",
    "index": 0,
    "upscale_type": "creative"
  }
}
headers = {**HEADERS, "Idempotency-Key": "order-1042"}
response = requests.post(f"{API}/tasks", json=body, headers=headers, timeout=60)
response.raise_for_status()
task = response.json()
print(task["id"], task["status"], task["amount_minor"])
```

Поля, которые выбирает человек (описание продления, области правки, части песни), в request не входят: их добавляют по описанию режима на странице модели. Там же значения по умолчанию, которые можно поменять. Результат действия это новая задача со своим id, статусом и файлами, а исходная задача не меняется.

Цена действия зависит от исходной задачи (скорость сетки Midjourney, качество ролика Veo, длина песни) и берётся так же, как у любой задачи: резерв при приёме, списание после успеха. Бывает и нулевая цена, например у сборки картинки из слоёв Seedream. Точную цену покажет POST /v1/price.

Действие работает только с задачами своего кабинета и той же модели, и только пока файлы результата хранятся (7 дней). Одноразовые действия Suno (например, разделение песни на дорожки или WAV) делаются один раз: повтор бесплатно вернёт уже готовый файл.

## <a id="models"></a>Действия моделей

| Модель | Режимы | Что делают |
|---|---|---|
| `midjourney` | upscale, vary, reroll, grid_edit | Увеличить картинку из сетки, вариации картинки, повторить сетку, правка картинки из сетки по маске. |
| `veo` | extend | Продлить видео. |
| `flux3` | enhance | Черновик в полном качестве. |
| `seedance` | upscale_draft | Пересобрать черновик в высоком качестве. |
| `suno` | extend_track, replace_section, separate_vocals, midi, wav, cover_image, music_video, timestamped_lyrics | Продолжить песню, переписать фрагмент, разделить на дорожки, ноты MIDI, песня в WAV, обложка, видео для соцсетей, слова с таймкодами. |
| `grok_image2` | edit_area | Изменить выбранные области картинки по описанию. |
| `seedream` | compose_layers | Собрать картинку из слоёв разбора в своём порядке. |
| `elevenlabs_music` | edit | Правка песни по частям. |
| `tripo3d` | convert_model, texture_model, animate | Конвертировать модель, новая текстура, анимация. |

Поля, пределы и пример запроса каждого действия на странице модели, в разделе режима.

[Все нейросети и их API](https://api.cyhub.ai/models)

## <a id="errors"></a>Ошибки

| HTTP | Код | Что делать |
|---|---|---|
| `404` | source_not_found | Задачи с таким id нет среди задач кабинета: возьмите id из GET /v1/tasks. |
| `409` | source_not_ready | Исходная задача ещё в работе: дождитесь succeeded. |
| `409` | action_in_progress | То же одноразовое действие с задачей уже идёт: дождитесь его результата. |
| `422` | source_wrong_model | Исходная задача сделана другой моделью: действие работает только с задачами своей модели. |
| `422` | source_failed | Исходная задача не удалась или отменена: работать не с чем. |
| `422` | action_unavailable | С этой задачей так сделать нельзя (файлы уже не хранятся, у результата нет такого действия): сверьтесь с полем actions. |
| `422` | invalid_settings | Неподходящий index или поле режима: подробности в message. |
