# Задача (Task)

Единица работы и её состояния

> Страница сайта A2A Docs — неофициального перевода документации протокола Agent2Agent (https://a2adocs.ru/concepts/task/). Тип: Перевод. Основа: Спецификация, разделы 4.1.1–4.1.3 и 3.4 (https://a2a-protocol.org/latest/specification/#411-task). Версия спецификации 1.0.0, сверено 05.10.2026.

Task — основная единица работы в A2A. У задачи есть текущий статус. Результаты работы сохраняются в артефактах, а если над задачей было несколько обменов, то и в истории.

## Поля Task

| Поле | Тип | Обязательное | Описание |
| --- | --- | --- | --- |
| `id` | `string` | Да | Уникальный идентификатор (например, UUID). Для новой задачи создаётся сервером. |
| `contextId` | `string` | Нет | Идентификатор контекста: набора связанных взаимодействий (задач и сообщений). |
| `status` | `TaskStatus` | Да | Текущий статус задачи: состояние и необязательное сообщение. |
| `artifacts` | массив [`Artifact`](https://a2adocs.ru/concepts/artifact/) | Нет | Набор артефактов, полученных в результате задачи. |
| `history` | массив [`Message`](https://a2adocs.ru/concepts/message-and-part/) | Нет | История взаимодействий в рамках задачи. |
| `metadata` | `object` | Нет | Произвольные метаданные о задаче в виде пар «ключ — значение». |

## TaskStatus

| Поле | Тип | Обязательное | Описание |
| --- | --- | --- | --- |
| `state` | `TaskState` | Да | Текущее состояние задачи. |
| `message` | `Message` | Нет | Сообщение, связанное со статусом. |
| `timestamp` | `timestamp` | Нет | Время фиксации статуса по ISO 8601, например `2023-10-27T10:00:00Z`. |

> **Заметка переводчика.** В версии 1.0 формат времени уточнён: UTC с точностью до миллисекунд, `YYYY-MM-DDTHH:mm:ss.sssZ`.

## Состояния

Перечисление `TaskState` определяет возможные состояния жизненного цикла задачи. Наведите на состояние на шкале, чтобы прочитать его описание.



| Значение | Класс | Описание |
| --- | --- | --- |
| `TASK_STATE_UNSPECIFIED` | не указан | Задача в неизвестном или неопределённом состоянии. |
| `TASK_STATE_SUBMITTED` | не указан | Задача успешно отправлена и принята. |
| `TASK_STATE_WORKING` | не указан | Агент активно обрабатывает задачу. |
| `TASK_STATE_COMPLETED` | конечное | Задача успешно завершена. |
| `TASK_STATE_FAILED` | конечное | Задача завершена с ошибкой. |
| `TASK_STATE_CANCELED` | конечное | Задача отменена до завершения. |
| `TASK_STATE_REJECTED` | конечное | Агент решил не выполнять задачу. Это может произойти при создании задачи или позже, когда агент понял, что не может или не будет продолжать. |
| `TASK_STATE_INPUT_REQUIRED` | прерванное | Агенту нужен дополнительный ввод пользователя, чтобы продолжить. |
| `TASK_STATE_AUTH_REQUIRED` | прерванное | Для продолжения требуется аутентификация. |

> **Заметка переводчика.** Оригинал называет конечными (terminal) и прерванными (interrupted) только перечисленные состояния. Для остальных класса не указано, поэтому в таблице стоит «не указан».

Сообщения в задачи с конечным состоянием не принимаются: сервер вернёт `UnsupportedOperationError`. Режимы выполнения, при которых операция ждёт конечного или прерванного состояния, описаны на странице [«Методы»](https://a2adocs.ru/protocol/methods/#sendmessage).

## Идентификаторы: контекст и задача

### Идентификатор контекста

`contextId` логически объединяет несколько связанных задач и сообщений и обеспечивает непрерывность разговора.

- Агент МОЖЕТ сгенерировать новый `contextId`, если пришло сообщение без него. Сгенерированный идентификатор ДОЛЖЕН попасть в ответ (в `Task` или `Message`).
- Агент МОЖЕТ принять и сохранить `contextId`, присланный клиентом. Если принять его нельзя, агент ДОЛЖЕН отклонить запрос ошибкой и НЕ ДОЛЖЕН создавать новый `contextId` для ответа.
- Клиентам СЛЕДУЕТ НЕ присылать собственный `contextId`, пока они не понимают, как сервер его обработает. Идентификаторы, созданные сервером, СЛЕДУЕТ считать непрозрачными.
- Все задачи и сообщения с одним `contextId` СЛЕДУЕТ считать частью одного разговора. Агент МОЖЕТ использовать его, чтобы хранить внутреннее состояние, историю или контекст LLM. Агент МОЖЕТ ввести политику истечения срока контекста и СЛЕДУЕТ её описать.

### Идентификатор задачи

`taskId` — уникальный идентификатор объекта `Task`.

- Идентификаторы задач создаёт **сервер**, когда в ответ на сообщение появляется новая задача. Для каждой новой задачи агент ДОЛЖЕН создать уникальный `taskId` и вернуть его в объекте `Task`.
- Если клиент указывает `taskId` в сообщении, он ДОЛЖЕН ссылаться на существующую задачу. Иначе агент ДОЛЖЕН вернуть `TaskNotFoundError`.
- Создавать новые задачи с идентификатором, придуманным клиентом, **нельзя**.

## Многоходовые взаимодействия

A2A поддерживает диалоги из нескольких обменов через идентификаторы контекста и ссылки на задачи.

- **Преемственность контекста.** Клиент МОЖЕТ указывать `contextId` в следующих сообщениях, продолжая прежнее взаимодействие. Клиент МОЖЕТ указать `taskId` (с `contextId` или без), чтобы продолжить или уточнить конкретную задачу. Указав только `contextId`, клиент начинает новую задачу в существующем разговоре.
- **Состояние «нужен ввод».** Агент может запросить дополнительные данные, переведя задачу в `TASK_STATE_INPUT_REQUIRED`. Клиент продолжает, отправив новое сообщение с тем же `taskId` и `contextId`.
- **Уточняющие сообщения.** Клиенты могут присылать дополнительные сообщения со ссылкой на `taskId`. В поле `referenceTaskIds` сообщения СЛЕДУЕТ явно указывать связанные задачи; агентам СЛЕДУЕТ использовать их, чтобы лучше понять смысл последующих запросов.
- **Наследование контекста.** Новые задачи в том же `contextId` могут наследовать контекст прежних взаимодействий.

Правила согласованности:

- если указан только `taskId`, агент ДОЛЖЕН вывести `contextId` из задачи;
- сообщения, у которых `contextId` не совпадает с контекстом указанной задачи, агент ДОЛЖЕН отклонять.
