Программный интерфейс облачных агентов удобнее читать по группам ресурсов: долгоживущие агенты, их запуски, артефакты и учёт расхода, управление жизненным циклом, токены исполнителей, собственные исполнители и служебные точки для обнаружения возможностей. Такая группировка отражает то, как интеграция строится на практике - от создания до уборки, и заодно объясняет форму адресов: агент существует долго, запуск живёт внутри агента, всё остальное принадлежит одному из них.
Актуальная версия находится в открытой бете, а предыдущая продолжает обслуживать уведомления о событиях. Это переходное состояние, и в архитектуре его учитывают явно: слой, который переводит внешние сообщения в вашу модель данных, стоит написать сразу. Цена такого слоя - один файл и один тип; цена его отсутствия - переписанная бизнес-логика в тот день, когда предыдущая версия перестанет обслуживать уведомления.
Полезно один раз свести точки в таблицу по группам. Ниже она и приведена: создание и список агентов, работа с запусками, поток событий и отмена, артефакты и расход, архивация и удаление, токены, исполнители и обнаружение. К этой карте возвращаются при проектировании: она показывает, что доступно, и подсказывает, чего в интеграции обычно не хватает.
| Группа | Точки | Назначение |
|---|---|---|
| Агенты | POST /v1/agents, GET /v1/agents, GET /v1/agents/{id} | Создание с первым запуском, список, метаданные |
| Запуски | POST и GET /v1/agents/{id}/runs, GET .../runs/{runId} | Продолжение работы и состояние конкретного запуска |
| Поток и отмена | GET .../runs/{runId}/stream, POST .../runs/{runId}/cancel | События по мере работы и остановка активного запуска |
| Артефакты и расход | GET .../artifacts, GET .../artifacts/download, GET .../usage | Результаты работы и учтённая стоимость |
| Жизненный цикл | POST .../archive, POST .../unarchive, DELETE /v1/agents/{id} | Уборка: архивация, возврат и удаление |
| Токены | POST /v1/sub-tokens | Часовой токен от имени пользователя для своего исполнителя |
| Свои исполнители | GET /v0/private-workers и связанные точки |
| Состояние парка и очередь ожидающих запросов |
| Обнаружение | GET /v1/me, GET /v1/models, GET /v1/repositories | Сведения о ключе, доступные модели, подключённые репозитории |
|---|
Реальная интеграция складывается в узнаваемую последовательность. Создать агента вместе с первым запуском, подписаться на поток событий, показать происходящее пользователю, забрать артефакты, убрать за собой. Здесь есть тонкость, о которую спотыкаются: поток событий - это соединение, а соединения рвутся. Событие, пришедшее по потоку, - подсказка, а не запись в журнале; источник истины о состоянии запуска - точка, которая это состояние возвращает. Поэтому у потока всегда есть запасной путь: переподключение и опрос состояния, а не молчаливое зависание интерфейса.
Чаще всего в интеграции не хватает трёх вещей. Отмены - без неё длинный запуск невозможно остановить программно, и единственным способом остаётся ожидание. Учёта расхода - без него стоимость выясняется в конце месяца, когда влиять на неё уже поздно. И уборки: архивация, возврат из архива и удаление существуют не просто так, иначе долгоживущие агенты копятся, как копятся ветки в старом репозитории, и через полгода никто не может сказать, какие из них ещё нужны.
Отдельно стоит точка выпуска токенов. Она выдаёт часовой токен от имени пользователя, чтобы собственный исполнитель работал как активный участник команды; для выпуска нужен ключ служебной учётной записи с областью агентов, а сам токен себя не обновляет и других токенов не выпускает. Правило то же, что и в любой системе прав: выдавать столько, сколько нужно для конкретной работы, и на срок этой работы.
Точку сведений о ключе стоит запомнить отдельно: она отвечает, что это за ключ - имя, дата создания, владелец, - и по наличию полей владельца видно, пользовательский он или служебный. Это дешёвая диагностика для случая, когда интеграция получает отказ и непонятно, каким ключом она вообще ходит. Такой же смысл у списка моделей: он отвечает, что доступно вашему аккаунту сейчас, а не что было доступно в день написания кода, и потому зашитое в конфигурацию имя модели полезно сверять с ним при запуске.
Список подключённых репозиториев стоит особняком из-за жёсткого ограничения частоты. Это прямая подсказка архитектуры: список кэшируют. Интеграция, которая обращается к нему на каждое действие пользователя, спроектирована неверно и упрётся в предел на первом же всплеске нагрузки, причём упрётся не у себя, а у всех потребителей того же ключа.
Инженерный вывод простой: перед тем как писать интеграцию, полезно пройти глазами по группам и отметить, какие точки вам действительно нужны. Обычно набор оказывается небольшим - создание, поток событий, отмена, артефакты и уборка. Всё остальное добавляют по мере появления потребности, а не заранее: неиспользуемый код интеграции стареет быстрее любого другого.
Типичные провалы предсказуемы. Не реализовать отмену и остаться без способа остановить запуск. Считать поток событий источником истины и зависать при обрыве соединения. Игнорировать учёт расхода. Копить агентов, не архивируя и не удаляя. Выдавать своему исполнителю полный ключ вместо часового токена от имени пользователя. И ходить за списком репозиториев без кэша.