> For the complete documentation index, see [llms.txt](https://visaver.gitbook.io/visaver-api/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://visaver.gitbook.io/visaver-api/dokumentaciya/upravlenie-zadachami.md).

# Управление задачами

{% stepper %}
{% step %}

## Создание новой задачи

**POST** `/jobs/`

Создает новую задачу обработки видео/аудио файла.

### Параметры запроса

Параметры передаются через JSON body:

```json
{
    "actions": ["transcript", "summary", "quiz", "timecodes", "frames", "search", "semantic_search", "multimodal_search"],
    "file_link": "https://example.com/video.mp4",
    "speakers_count": 2,
    "webhook_url": "https://your-site.com/webhook"
}
```

### Обязательные параметры

* `file_link` — URL медиа файла для обработки
* `actions` — Список действий для выполнения

### Опциональные параметры

* `speakers_count` — Количество спикеров, от 0 до 10 (по умолчанию: 1, для автоопределения количества спикеров используйте 0)
* `webhook_url` — URL для получения уведомлений о статусе

### Пример запроса

```bash
curl -X POST "https://your-domain.com/jobs/" \
  -H "vendor-key: your-vendor-key" \
  -H "Content-Type: application/json" \
  -d '{
    "actions": ["transcript", "summary"],
    "file_link": "https://example.com/video.mp4",
    "speakers_count": 1,
    "webhook_url": "https://your-site.com/webhook"
  }'
```

### Ответ

```json
{
    "job_id": "123e4567-e89b-12d3-a456-426614174000",
    "video_name": "video.mp4",
    "video_path": "/path/to/video.mp4",
    "job_state": "queued",
    "requested_actions": ["transcript", "summary"],
    "speakers_count": 1,
    "webhook_url": "https://your-site.com/webhook",
    "vendor_key": "vendor-uuid",
    "created": "2025-09-08T10:00:00.000Z",
    "modified": "2025-09-08T10:00:00.000Z"
}
```

Задача создаётся в статусе `queued` и переходит в `in_progress` после начала обработки.
{% endstep %}

{% step %}

## Получение списка задач

**GET** `/jobs/`

Получает список всех задач текущего пользователя.

### Параметры запроса

* `job_state` (опционально) — Фильтр по статусу задачи (`queued`, `in_progress`, `done`, `failed`)

### Пример запроса

```bash
curl -X GET "https://your-domain.com/jobs/?job_state=done" \
  -H "vendor-key: your-vendor-key"
```

### Ответ

```json
[
    {
        "job_id": "123e4567-e89b-12d3-a456-426614174000",
        "video_name": "video.mp4",
        "job_state": "done",
        "requested_actions": ["transcript", "summary"],
        "created": "2025-09-08T10:00:00.000Z",
        "modified": "2025-09-08T10:30:00.000Z"
    }
]
```

{% endstep %}

{% step %}

## Получение информации о задаче

**GET** `/jobs/{job_id}/`

Получает подробную информацию о конкретной задаче.

### Параметры пути

* `job_id` — UUID задачи

### Пример запроса

```bash
curl -X GET "https://your-domain.com/jobs/123e4567-e89b-12d3-a456-426614174000/" \
  -H "vendor-key: your-vendor-key"
```

### Ответ

```json
{
    "job_id": "123e4567-e89b-12d3-a456-426614174000",
    "video_name": "video.mp4",
    "video_path": "/app/media/content/vendor-uuid/job-uuid/job-uuid.mp4",
    "job_state": "done",
    "requested_actions": ["transcript", "summary", "quiz", "timecodes", "semantic_search", "multimodal_search"],
    "speakers_count": 0,
    "vendor_key": "vendor-uuid-here",
    "webhook_url": "https://your-site.com/webhook",
    "request_id": "external-request-uuid",
    "product_statuses": {
        "transcript": "done",
        "summary": "done",
        "quiz": "done",
        "timecodes": "done",
        "semantic_search": "done",
        "multimodal_search": "done"
    },
    "created": "2025-09-08T10:00:00.000Z",
    "modified": "2025-09-08T10:30:00.000Z"
}
```

### Описание полей ответа

* `job_id` — Уникальный UUID задачи
* `video_name` — Оригинальное имя файла
* `video_path` — Путь к сохраненному файлу на сервере
* `job_state` — Текущий статус задачи (`queued`, `in_progress`, `done`, `failed`)
* `requested_actions` — Список запрошенных действий обработки
* `speakers_count` — Количество спикеров (0 для автоопределения)
* `vendor_key` — UUID пользователя/клиента
* `webhook_url` — URL для webhook уведомлений
* `request_id` — UUID запроса во внешней системе обработки (появляется после начала обработки)
* `product_statuses` — Статусы отдельных продуктов обработки
* `created` — Дата и время создания задачи
* `modified` — Дата и время последнего изменения
  {% endstep %}

{% step %}

## Получение транскрипта

**GET** `/jobs/{job_id}/transcript/`

Получает расшифровку текста для указанной задачи.

### Параметры пути

* `job_id` — UUID задачи

### Параметры запроса

* `format` (опционально) — Формат экспорта: `txt`, `docx`

### Пример запроса (JSON)

```bash
curl -X GET "https://your-domain.com/jobs/123e4567-e89b-12d3-a456-426614174000/transcript/" \
  -H "vendor-key: your-vendor-key"
```

### Ответ (JSON)

```json
{
    "transcript_id": "transcript-uuid",
    "external_id": "external-uuid",
    "cues": [
        {
            "text": "Привет, добро пожаловать на наш канал",
            "start": 0.0,
            "duration_s": 5.5,
            "speaker": "Спикер 1"
        }
    ],
    "full_text": "Привет, добро пожаловать на наш канал. Сегодня мы расскажем...",
    "job_id": "123e4567-e89b-12d3-a456-426614174000"
}
```

Каждая реплика (`cue`) содержит текст, время начала `start` (в секундах), длительность `duration_s` (в секундах) и имя спикера (`speaker`, может быть `null`).
{% endstep %}

{% step %}

## Получение временных меток

**GET** `/jobs/{job_id}/timecodes/`

Получает временные метки для указанной задачи.

### Параметры пути

* `job_id` — UUID задачи

### Параметры запроса

* `format` (опционально) — Формат экспорта: `txt`, `docx`

### Пример запроса

```bash
curl -X GET "https://your-domain.com/jobs/123e4567-e89b-12d3-a456-426614174000/timecodes/" \
  -H "vendor-key: your-vendor-key"
```

### Ответ

```json
{
    "timecodes_id": "timecodes-uuid",
    "timecodes": [
        {
            "start": 0.0,
            "title": "Введение",
            "text": "Приветствие и обзор темы"
        },
        {
            "start": 30.0,
            "title": "Основная часть",
            "text": "Подробное объяснение темы"
        }
    ],
    "job_id": "123e4567-e89b-12d3-a456-426614174000"
}
```

Каждая метка содержит время начала раздела `start` (в секундах), заголовок `title` и описание `text`.
{% endstep %}

{% step %}

## Получение краткого изложения

**GET** `/jobs/{job_id}/summary/`

Получает краткое изложение содержимого.

### Параметры пути

* `job_id` — UUID задачи

### Параметры запроса

* `format` (опционально) — Формат экспорта: `txt`, `docx`

### Пример запроса

```bash
curl -X GET "https://your-domain.com/jobs/123e4567-e89b-12d3-a456-426614174000/summary/" \
  -H "vendor-key: your-vendor-key"
```

### Ответ

```json
{
    "summary_id": "summary-uuid",
    "html": "<h1>Краткое изложение</h1><p>В данном видео рассматриваются...</p>",
    "job_id": "123e4567-e89b-12d3-a456-426614174000"
}
```

{% endstep %}

{% step %}

## Получение квиза

**GET** `/jobs/{job_id}/quiz/`

Получает тест/квиз по содержимому.

### Параметры пути

* `job_id` — UUID задачи

### Параметры запроса

* `format` (опционально) — Формат экспорта: `txt`, `docx`

### Пример запроса

```bash
curl -X GET "https://your-domain.com/jobs/123e4567-e89b-12d3-a456-426614174000/quiz/" \
  -H "vendor-key: your-vendor-key"
```

### Ответ

```json
{
    "quiz_id": "quiz-uuid",
    "data": [
        {
            "quiz": {
                "question": "О чем рассказывается в видео?",
                "correct_answer": "О программировании",
                "wrong_answers": [
                    "О кулинарии",
                    "О путешествиях",
                    "О спорте"
                ]
            },
            "chapter": {
                "start": 0.0
            }
        }
    ],
    "job_id": "123e4567-e89b-12d3-a456-426614174000"
}
```

Каждый элемент `data` содержит вопрос (`quiz.question`), правильный ответ (`quiz.correct_answer`), список неправильных ответов (`quiz.wrong_answers`) и привязку к разделу видео (`chapter.start`, в секундах).
{% endstep %}

{% step %}

## Получение кадров

**GET** `/jobs/{job_id}/frames/`

Получает извлеченные кадры из видео.

### Параметры пути

* `job_id` — UUID задачи

### Пример запроса

```bash
curl -X GET "https://your-domain.com/jobs/123e4567-e89b-12d3-a456-426614174000/frames/" \
  -H "vendor-key: your-vendor-key"
```

### Ответ

```json
{
    "frames_id": "frames-uuid",
    "frameset": [
        "media/content/vendor-uuid/job-uuid/frameset/frame_0.jpg",
        "media/content/vendor-uuid/job-uuid/frameset/frame_30.jpg"
    ],
    "job_id": "123e4567-e89b-12d3-a456-426614174000"
}
```

`frameset` — список путей к сохранённым кадрам; кадр извлекается на начало каждой реплики транскрипта. Само изображение кадра доступно по адресу:

```
GET https://your-domain.com/frames/frame/{vendor_key}/{job_id}/{секунда}
```

{% endstep %}

{% step %}

## Перезаказ материалов

**POST** `/jobs/reorder/`

Перезапускает обработку существующей задачи с новыми действиями. Позволяет дозаказать дополнительные материалы (продукты) для уже обработанного файла без повторной загрузки.

### Параметры запроса

Параметры передаются через JSON body:

```json
{
    "job_id": "123e4567-e89b-12d3-a456-426614174000",
    "actions": ["quiz", "frames"]
}
```

### Обязательные параметры

* `job_id` — UUID существующей задачи
* `actions` — Список новых действий для обработки

### Доступные действия

* `transcript` — Расшифровка текста
* `summary` — Краткое изложение
* `quiz` — Тест/квиз
* `timecodes` — Временные метки
* `frames` — Извлечение кадров
* `search` — Поиск по содержимому
* `semantic_search` — Семантическая индексация для векторного поиска
* `multimodal_search` — Мультимодальная индексация кадров видео

### Пример запроса

```bash
curl -X POST "https://your-domain.com/jobs/reorder/" \
  -H "vendor-key: your-vendor-key" \
  -H "Content-Type: application/json" \
  -d '{
    "job_id": "123e4567-e89b-12d3-a456-426614174000",
    "actions": ["quiz", "frames"]
  }'
```

### Ответ

```json
{
    "job_id": "123e4567-e89b-12d3-a456-426614174000",
    "video_name": "video.mp4",
    "video_path": "/path/to/video.mp4",
    "job_state": "in_progress",
    "requested_actions": ["transcript", "summary", "quiz", "frames"],
    "speakers_count": 1,
    "webhook_url": "https://your-site.com/webhook",
    "vendor_key": "vendor-uuid",
    "created": "2025-09-08T10:00:00.000Z",
    "modified": "2025-09-08T10:15:00.000Z"
}
```

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

* Задача должна иметь `request_id` для возможности перезаказа
* Новые действия добавляются к списку `requested_actions`
* Если действие уже было запрошено ранее, оно будет переобработано
* Файл не загружается повторно, используется уже сохраненная версия
* Webhook уведомления отправляются по завершении дополнительной обработки

### Ошибки

* `400 Bad Request` — Задача не найдена или у задачи отсутствует `request_id`
* `401 Unauthorized` — Неверный API ключ
* `404 Not Found` — Задача не принадлежит данному пользователю
  {% endstep %}

{% step %}

## Получение всех продуктов

**GET** `/jobs/{job_id}/products/`

Получает все доступные продукты (результаты обработки) для задачи.

### Параметры пути

* `job_id` — UUID задачи

### Пример запроса

```bash
curl -X GET "https://your-domain.com/jobs/123e4567-e89b-12d3-a456-426614174000/products/" \
  -H "vendor-key: your-vendor-key"
```

### Ответ

```json
{
    "job_id": "123e4567-e89b-12d3-a456-426614174000",
    "job_state": "done",
    "requested_actions": ["transcript", "timecodes", "summary", "quiz", "frames"],
    "transcript": {
        "transcript_id": "transcript-uuid",
        "external_id": "external-uuid",
        "cues": [
            {
                "text": "Привет, добро пожаловать на наш канал",
                "start": 0.0,
                "duration_s": 5.5,
                "speaker": "Спикер 1"
            }
        ],
        "full_text": "Привет, добро пожаловать на наш канал. Сегодня мы расскажем..."
    },
    "timecodes": {
        "timecodes_id": "timecodes-uuid",
        "external_id": "external-uuid",
        "timecodes": [
            {
                "start": 0.0,
                "title": "Введение",
                "text": "Приветствие и обзор темы"
            }
        ]
    },
    "summary": {
        "summary_id": "summary-uuid",
        "external_id": "external-uuid",
        "html": "<h1>Краткое изложение</h1><p>В данном видео рассматриваются...</p>"
    },
    "quiz": {
        "quiz_id": "quiz-uuid",
        "external_id": "external-uuid",
        "data": [
            {
                "quiz": {
                    "question": "О чем рассказывается в видео?",
                    "correct_answer": "О программировании",
                    "wrong_answers": ["О кулинарии", "О путешествиях", "О спорте"]
                },
                "chapter": {"start": 0.0}
            }
        ]
    },
    "frames": {
        "frames_id": "frames-uuid",
        "frameset": [
            "media/content/vendor-uuid/job-uuid/frameset/frame_0.jpg"
        ]
    }
}
```

В ответ включаются только готовые продукты; незапрошенные или ещё не готовые продукты передаются как `null`. Готовность `semantic_search` и `multimodal_search` отражается в `product_statuses` эндпоинта `GET /jobs/{job_id}/` — содержимого у этих продуктов нет, поиск выполняется через `POST /semantic_search/` и `POST /multimodal_search/`.
{% endstep %}
{% endstepper %}
