AI Platform Docs
Администрирование

Control Plane

Руководство администратора компонента Control Plane

Назначение и область применения

Настоящее руководство определяет порядок настройки, сопровождения и проверки компонента Control Plane Платформы ИИ в контуре заказчика. Документ предназначен для администратора платформы и предполагает владение основами администрирования Linux, Kubernetes, Helm и HTTP API.

Control Plane — центральный управляющий компонент Платформы ИИ. Он предоставляет versioned management API для управления политиками моделей, виртуальными ключами LLM и публикацией low-code агентов. Компонент владеет desired state (желаемым состоянием) и длительными операциями (durable operations), но не участвует в путях инференса LLM и вызова агентов (A2A invocation).

Platform API Gateway (api-gw) монтирует Control Plane по пути /control-plane: публичное API доступно как /control-plane/api/v1, документация — как /control-plane/docs. Agent Registry смонтирован независимо — под /agent-registry.

Функция «Активность и потребление» добавляет аналитику LLM-запросов и HTTP-запросов к агентам. Доставка событий, отдельные права, постоянная очередь, сроки хранения и безопасный откат описаны в руководстве по эксплуатации активности и потребления. Её итоговая нагрузочная квалификация AU-I05 ещё не завершена.

Важно: Все изменяющие состояние операции асинхронные. Запрос возвращает 202 Accepted с ссылкой на Operation — это подтверждение принятия намерения, а не факта выполнения. Фактическое применение отслеживается через verifiedState ресурса и GET /api/v1/operations/{operationId}.

Термины и сокращения

ТерминОпределение
Desired stateЖелаемое состояние ресурса, зафиксированное в базе данных Control Plane
Durable operation (Operation)Длительная асинхронная операция: фиксируется в БД, переживает перезапуск и повторяется до завершения или компенсации
Tier (Уровень)Профиль качества обслуживания API ключа: лимит запросов в минуту и квота токенов в минуту
Provider (Поставщик)Конфигурация внешнего LLM-провайдера: адаптер, конечная точка, зашифрованные учётные данные
Model (Модель)Конкретная модель с именем для шлюза (gatewayName), привязкой к провайдеру и профилем internal/external
ApiKey (Ключ API)Виртуальный ключ доступа к LLM: один владелец, один Tier, непустой набор моделей
Verified state (verifiedState)Проверенное состояние ресурса после применения: pending, enabled, disabled, degraded
Publication (Публикация)Привязка агента к конкретной версии в окружении; владеет состоянием active / degraded / suspended / unpublished
Gate (Гейт)Независимое наблюдаемое условие валидации публикации: pending, passed, failed, not_applicable
Registry observation (Наблюдение Registry)Внешний факт от независимого Agent Registry: candidate_validated, withheld, активная проекция
ETag / If-MatchМеханизм оптимистичного контроля версий: "r<revision>"
Idempotency-KeyЗаголовок идемпотентности write-операций
ReconcilerФоновый воркер, детерминированно применяющий желаемое состояние во внешних системах
Fail-closedПри недоступности сервиса авторизации — отказ, а не частичный доступ

1. Архитектура

1.1. Общая схема

Control Plane состоит из прикладного API, фоновых воркеров оркестрации и транзакционной базы данных. Управление внешними ресурсами (Kubernetes, LLM Gateway, Agent Registry) выполняется асинхронно через детерминированных reconciler'ов.

control-plane-components.drawio.png

1.2. Состав компонентов

КомпонентНазначениеПримечание
Control Plane APIАутентификация, маппинг субъекта, прямая авторизация, валидация, идемпотентность, optimistic concurrency, durable intentStateless, масштабируется горизонтально. Не владеет credential'ами Kubernetes и не выполняет проксирование инференса
Model reconcilerДетерминированный render/apply Tier/Provider/Model, материализация зашифрованного материала провайдера в immutable Kubernetes SecretРаботает в Temporal namespace control-plane. Владеет AgentgatewayModel.secretRef
Key reconcilerВыделение hash-only шардов, render/apply, верификация selected-revision и Gateway probe, жизненный цикл Agent secretНе создаёт маршруты агентов. Сырой ключ не хранится
Publisher workerВалидация low-code источника, создание Agent/Version/Publication, workload/policy/route, ожидание фидбэка от RegistryПроходит фазы: Accept → Validate source → Identity → Freeze → Candidate credential → Render/apply → Provider gates → Registry gate → Atomic selection → Active projection → Retire previous → Complete
Recovery/operator workerОграниченный инвентаризационный охват, preview, observe-only классификация и approved continuationНе угадывает владельца, не выполняет автоматическое принятие
PostgreSQLDesired state, идентичности, назначения, операции, неизменяемый аудит, application-encrypted значения Provider/AgentИсточник истины. Схема control_plane
TemporalПорядок Workflow, таймеры, retry/cancellation, история выполненияВосстановление после сбоя без потери операций. Одна конечная Workflow = одна асинхронная Operation
Platform AuthZ (SpiceDB)Ресурсно-ориентированная авторизация: control_plane#publish, control_plane#administer, agent#view/#manage/#diagnoseFail-closed при недоступности

Kubernetes, LLM Gateway и Agent Registry — наблюдаемые внешние системы. Control Plane не является их синхронной зависимостью для LLM inference или A2A invocation.

1.3. Границы доверия

ГраницаПравило
Права управленияПрямые функциональные отношения для канонических субъектов principal/service. Заявления Workspace/Team/Group/Tenant, метки и пространства имён не создают владения, разрешений или квот
Результат авторизацииНедействительный или неизвестный результат — fail closed. Частичный результат или кэшированный allow не допускается
Конечные точки провайдераПринимаются только настроенные схемы и разрешённые адреса. Private/link-local/metadata цели и обход через redirect/rebinding отклоняются
Публикация агентовТолько ClusterIP-сервисы, default-deny NetworkPolicy, маршрут — только из Publisher. A2A Gateway принимает платформенный OIDC с TTL токена не более 300 секунд
Секреты Provider/AgentAES-256-GCM в PostgreSQL, доставка через immutable Kubernetes Secret. Выбранные вызывающим координаты Secret, ссылки между workload, inline/env-доставка, PVC и постоянные накопители запрещены

2. Бизнес-сущности

Сущности сгруппированы по логическим областям: управление моделями, управление ключами, публикация агентов. Все объекты создаются Администратором Платформы через management API, за исключением ресурсов самообслуживания (/api/v1/me/*).

2.1. Управление моделями

Tier (Уровень)

Профиль качества обслуживания для каждого API ключа. Определяет лимит скорости (запросы в минуту) и квоту (токены в минуту). Tier не имеет членов, владельцев или унаследованных прав.

АтрибутТипОписание
idUUIDv7Стабильный идентификатор уровня, генерируемый платформой
namestringУникальное имя. Формат: ^[a-z][a-z0-9._-]{0,127}$. Неизменяем — не входит в схему обновления
displayNamestring (1–128 символов)Отображаемое имя (необязательный)
requestsPerMinuteinteger (≥1)Лимит скорости: количество запросов в минуту
tokensPerMinuteinteger (≥1)Квота: количество токенов в минуту
desiredStateenumenabled — уровень активен, disabled — отключён
verifiedStateenumpending — ожидает проверки, enabled — проверен и активен, disabled — отключён, degraded — работает с ограничениями
revisioninteger (≥1)Монотонно возрастающая ревизия. ETag ресурса: "r<revision>"
createdAttimestampВременная метка создания
updatedAttimestampВременная метка последнего обновления

Важные особенности:

  • Все мутации (POST/PATCH/DELETE) асинхронные: возвращают 202 Accepted — это не подтверждённый успех; фактическое применение отслеживается через verifiedState и /api/v1/operations.
  • PATCH/DELETE требуют точный If-Match (формат "r<revision>"), иначе 412 PreconditionFailed.
  • Удаление возможно только для неиспользуемого уровня (проверка зависимостей: ключи, политики), иначе 409 Conflict.

Provider (Поставщик)

Конфигурация внешнего LLM-провайдера (например, OpenAI, Anthropic). Включает адаптер, конечную точку, привязку учётных данных и состояние. Сырые учётные данные хранятся только как зашифрованная строка в базе данных Control Plane; компонент не разворачивает вычислительные ресурсы провайдера.

Замечание: креды провайдера нельзя удалить. Провайдер может быть создан без связанных кредов; добавление кредов — v1/providers/{providerId}/credential.

Model (Модель)

Конкретная модель с глобально уникальным именем, привязкой к провайдеру и профилем (внутренний или внешний). Наличие модели не подразумевает автоматического права доступа; права выдаются только через явные привязки к API ключам.

АтрибутТипОписание
idUUIDv7Стабильный идентификатор модели, генерируемый платформой
gatewayNamestringИмя модели для Gateway. Формат: ^[a-z][a-z0-9._-]{0,127}$. Используется для маршрутизации. Неизменяем
providerIdUUIDv7Идентификатор провайдера, к которому привязана модель
upstreamModelstring (1–256 символов)Имя модели у внешнего провайдера (например, gpt-4o)
profileenuminternal — внутренняя модель платформы, external — модель внешнего провайдера
desiredStateenumenabled — модель активна, disabled — отключена
verifiedStateenumpending, enabled, disabled, degraded
revisioninteger (≥1)Монотонно возрастающая ревизия. ETag: "r<revision>"
createdAttimestampВременная метка создания
updatedAttimestampВременная метка последнего обновления

Важные особенности:

  • gatewayName и providerId неизменяемы: в схему обновления входят только upstreamModel, profile и desiredState. Сменить «внутреннее» имя модели нельзя — можно сменить модель, на которую ссылается запись (upstreamModel).
  • Удаление возможно только когда модель не требуется активными ключами или маршрутами, иначе 409 Conflict.
  • Массовое изменение состояния модели поддерживается через bulk-операции (set_model_state в /api/v1/bulk/previews → :execute).

Замечание: параметр displayName Tier может быть пустым, тогда как во многих местах интерфейса отображается не кодовое имя, а человекочитаемое. Рекомендуется всегда заполнять displayName при создании уровня.

2.2. Управление ключами

KeyIssuancePolicy (Политика выдачи ключей)

Настройка, определяющая условия самообслуживающейся выдачи ключей для людей и сервисов. Singleton — единичный объект на всю установку. Изменение политики влияет только на будущие выдачи и не изменяет ранее выданные ключи.

АтрибутОписание
enabledВключена/отключена выдача
allowedTierIdsСписок разрешённых уровней обслуживания
allowedModelIdsСписок разрешённых моделей
maxActiveKeysPerPrincipalОграничение на количество активных ключей на один субъект

Имеет состояния verifiedState: pending, enabled, disabled, degraded.

Методы:

МетодОписание
GET /api/v1/key-issuance-policyПолучение полной установки политики
PATCH /api/v1/key-issuance-policyОбновление политики для будущих выдач. PATCH объединяется с текущим синглтоном; при enabled=true требуются ≥1 Tier и ≥1 Model
GET /api/v1/me/key-issuance-policyСокращённая версия для самообслуживающегося пользователя: enabled, allowedTiers, allowedModels, maxActiveKeys, remainingActiveKeys, policyRevision

ApiKey (Ключ API)

Виртуальный ключ доступа к LLM. Имеет одного владельца (человек, сервис или агент), привязку к уровню и непустой набор разрешённых моделей. Ключ создаётся через защищённую транзакцию: идентификатор операции подтверждается сервисом авторизации (SpiceDB), а сам ключ верифицируется Gateway перед тем, как платформа вернёт секретный материал (возвращается один раз).

АтрибутТипОписание
idUUIDv7Стабильный идентификатор ключа
labelstring (1–128 символов)Читаемое название (необязательный)
ownerobjectВладелец: principal (человек), service (сервис) или agent (агент). Для человека/сервиса — поля type, issuer, subject; для агента — agentId
tierIdUUIDv7Идентификатор уровня
modelIdsarray of UUIDv7 (1–256)Набор разрешённых моделей. Все уникальны
statusenumpending — ожидает верификации Gateway, active — активен, revoking — в процессе отзыва, revoked — отозван, degraded — работает с ограничениями
generationinteger (≥1)Номер генерации. Инкрементируется при каждой ротации
fingerprintstring (SHA-256)Хэш ключа формата sha256:<64 hex chars>. Используется для проверки без раскрытия самого ключа
revisionintegerМонотонно возрастающая ревизия
operationIdUUIDv7Идентификатор операции, создавшей или обновившей ревизию
operationLinkstringСсылка на ресурс операции: /control-plane/api/v1/operations/{operationId}
createdAttimestampВременная метка создания
updatedAttimestampВременная метка последнего обновления
revokedAttimestamp (необязательный)Заполняется только при переходе в статус revoked

Важные особенности:

  • Секретный материал ключа (oneTimeSecret, формат cpk_<base64url>) возвращается только один раз при создании или ротации (статусы 201/200 с заголовком Idempotency-Replayed: false). При идемпотентной повторной отправке того же Idempotency-Key возвращается только метаданные.
  • Ключи, принадлежащие агенту (owner.type = "agent"), нельзя обновлять, ротировать или отзывать через административные методы — их жизненный цикл управляется публикацией агента (publish/unpublish/rollback/revalidate). Попытка приводит к 409 Conflict с кодом agent_key_lifecycle_owned_by_publication.
  • При отзыве (revoke) ключ верифицируется через Gateway — если Gateway не отвечает в течение таймаута, возвращается 504 VerificationTimeout.
  • Каждая операция создания/ротации/отзыва создаёт Operation, на которую ссылается operationLink.

2.3. Публикация агентов

Agent (Агент)

Сущность, представляющая low-code агента. Имеет стабильный идентификатор, выдаваемый издателем, и изменяемые метаданные (имя, отображаемое имя, описание). Может иметь ровно одного прямого владельца (человек или сервис) или не иметь владельца вовсе. Жёсткое удаление агентов не предусмотрено — удаление заменяется unpublish.

АтрибутТипОписание
idUUIDv7Стабильный идентификатор агента
namestringИмя агента. Pattern: ^[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?$
displayNamestring (1–256 символов)Отображаемое имя
descriptionstring (до 4096 символов)Описание
ownerDirectOwnerВладелец: PrincipalOwner или ServiceOwner (необязательный)
publicationStateenumactive, degraded, suspended, unpublished
selectedVersionIdUUIDv7Идентификатор выбранной версии
publicationRevisioninteger (≥1)Текущая ревизия публикации
revisioninteger (≥1)Ревизия ресурса для optimistic locking
createdAt / updatedAttimestampВременные метки создания и обновления

AgentVersion (Версия агента)

Неизменяемая версия агента с SemVer, исходным артефактом и хэшами политик. Любое изменение неизменяемых данных создаёт новую версию. Версия замораживает допустимый набор моделей, уровень и ревизию политики публикации.

АтрибутТипОписание
idUUIDv7Уникальный идентификатор версии
agentIdUUIDv7Ссылка на родительский Agent
semanticVersionstringВерсия в формате SemVer
protocolconstЗначение: "a2a"
sourceLowCodeSourceНизкоуровневый источник (адаптер low-code)
artifactDigestDigestSHA-256 хеш артефакта: sha256:[0-9a-f]{64}
llmRequiredbooleanТребуется ли LLM. Выводится из валидированного потока
modelIdsUUIDv7[]Модели, используемые версией. 0–256, уникальные. Обязательны, если llmRequired = true
tierIdUUIDv7Тариф, выведенный из AgentPublicationPolicy. Обязателен, если llmRequired = true
publicationPolicyRevisionintegerРевизия политики на момент создания
publicationPolicyDigestDigestДайджест политики на момент создания
createdAttimestampВремя создания

Важно: llmRequired, modelIds и tierId — выводимые, а не задаваемые поля. Их значение определяется сервером на основе AgentPublicationPolicy и low-code источника; передача их в запросе создания отклоняется с ошибкой 400 InvalidRequest.

LowCodeSource — ссылка на низкоуровневый источник агента:

ПолеТипОписание
adapterconstЗначение: "low-code" — единственный поддерживаемый адаптер
flowIdUUIDИдентификатор потока (flow)
revisionIdUUIDИдентификатор ревизии потока
revisionNumberinteger (≥1)Номер ревизии
uristringS3 или OCI URI: s3://... или oci://...@sha256:...
sourceSha256stringХеш источника: [0-9a-f]{64}. Проверяется на соответствие содержимому по uri
schemaVersionconstЗначение: "platform.low-code.flow/v1"

Источники Source не содержат секретов, ключей, путей к Kubernetes, токенов или внутренних адресов. Прямая загрузка в OCI, Kubernetes или Agent Registry запрещена.

AgentPublicationPolicy (Политика публикации агентов)

Единичный установочный синглтон, задающий допустимый уровень (Tier) и набор моделей (не более 256) для новых версий агентов. Замораживается при создании версии; последующие изменения не действуют задним числом.

АтрибутТипОписание
schemaVersionconst"agent-platform.control-plane.agent-publication-policy/v1"
policyIdUUIDv7Идентификатор политики
enabledbooleanВключена ли политика
tierIdUUIDv7Тариф по умолчанию для публикаций. Обязателен, если enabled
allowedModelIdsUUIDv7[]Разрешённые модели. 0–256, уникальные. Мин. 1, если enabled
policyDigestDigestДайджест политики
verifiedStateenumpending, enabled, disabled, degraded
revisioninteger (≥1)Ревизия

Выключенная или недоступная политика блокирует создание новых LLM-версий, но не влияет на уже активные версии.

Publication (Публикация)

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

АтрибутТипОписание
environment_idUUIDИдентификатор окружения из доверенной конфигурации
agent_idUUIDv7Стабильный идентификатор агента
publication_revisionintegerМонотонно возрастающее число. Инкрементируется при publish, rollback, unpublish или revalidate
selected_version_idUUIDv7Идентификатор выбранной версии
desired_stateenumpublish, rollback, unpublish, revalidate
actual_stateenumactive, degraded, suspended, unpublished
operation_idUUIDv7Идентификатор связанной задачи публикации
gate_observationsobjectНаблюдения фаз проверки
timestampsobjectacceptedAt, phaseStartedAt, phaseCompletedAt, terminalAt
candidate_version_idUUIDv7Версия кандидата при rollback или обновлении

PublishJob (Задача публикации)

Длительный рабочий процесс жизненного цикла публикации: фазы, наблюдения, повторные попытки, компенсации и терминальный результат. Каждая команда управления создаёт ровно одну задачу с уникальным operation_id.

Фазы publish: accepted → validating_source → allocating_identity → freezing_version → provisioning_candidate_credential → rendering_candidate → applying_candidate → verifying_workload → verifying_route → selecting_candidate → completed

Фазы unpublish: withdrawing_route → awaiting_registry_withheld → revoking_credential → deleting_workload

Состояния публикации:

СостояниеОписание
activeАгент активен, выбранная версия валидирована, маршрут настроен
degradedАгент работает с ограничениями (не все гейты прошли)
suspendedАгент приостановлен, недоступен для вызова; требует revalidate
unpublishedАгент скрыт, маршрут удалён, учётные данные отозваны

Состояния задачи (Job.state): queued (в очереди), running (выполняется), retry_wait (ожидание повтора), compensating (выполняется компенсация), succeeded, failed, cancelled.


3. Типовые сценарии администратора

3.1. Настройка провайдера и моделей

Роль: Администратор Платформы

ШагДействиеПримечание
1Создать Provider: указать адаптер (например, openai), конечную точку, привязать зашифрованные учётные данныеControl Plane хранит ключ провайдера зашифрованным; вычислительные ресурсы провайдера не разворачиваются
2Создать Tier: задать имя, лимиты requestsPerMinute/tokensPerMinute, установить состояние enabledНапример, standard (100 запросов/мин, 50K токенов/мин) и premium (500 запросов/мин, 200K токенов/мин)
3Создать Model: указать уникальное gatewayName, привязать к Provider, задать профильНапример, gpt-4o → Provider openai, профиль external
4Повторить шаги 2–3 для дополнительных уровней и моделейКаждая модель привязывается к одному провайдеру

Результат: Платформа готова к работе с подключёнными провайдерами.

3.2. Настройка политики выдачи ключей

Роль: Администратор Платформы

ШагДействиеПримечание
1PATCH /api/v1/key-issuance-policySingleton — редактируется единый объект
2Установить enabled: true, выбрать allowedTierIds и allowedModelIds, задать maxActiveKeysPerPrincipalПри enabled=true требуются ≥1 Tier и ≥1 Model
3СохранитьСистема проверяет условное ограничение, обновляет ревизию; состояние переходит в verifiedState: enabled

Результат: Пользователи и сервисы самостоятельно выпускают ключи в рамках заданных ограничений через POST /api/v1/me/keys. Выдача не затрагивает ранее выданные ключи.

3.3. Выдача ключа администратором

Роль: Администратор Платформы

ШагДействиеПримечание
1Принять запрос субъекта: требуемый Tier, модели, обоснованиеЗапрос — через тикет-систему или аналогичный канал
2POST /api/v1/keys: указать владельца (человек/сервис), Tier и разрешённые моделиКлюч создаётся администратором от имени субъекта
3Передать ключ субъекту через безопасный каналСырой ключ не хранится в открытом виде и возвращается только один раз при создании

Результат: Субъект получает ключ; полный аудит-трейл выдачи доступен администратору.

3.4. Управление ключами

Роль: Администратор Платформы

ДействиеМетодОписание
Просмотр спискаGET /api/v1/keysФильтрация по владельцу (ownerType, ownerIssuer, ownerSubject). Администратор видит все ключи
Получение ключаGET /api/v1/keys/{keyId}Метаданные без секрета
Обновление политикиPATCH /api/v1/keys/{keyId}Изменение tierId, modelIds, label
Ротация ключаPOST /api/v1/keys/{keyId}:rotateНовая генерация; новый секрет возвращается один раз
Отзыв ключаPOST /api/v1/keys/{keyId}:revokeПеревод в revoked с верификацией через Gateway

Ключи с владельцем-агентом не управляются через административные методы — их жизненный цикл принадлежит публикации агента.

3.5. Создание и публикация агента

Роль: Пользователь (человек или сервис) с правом control_plane#publish

Публикация инициируется из Low-code IDE: провайдер agent-platform экспортирует проверенную версию потока и вызывает Control Plane через api-gw от имени пользователя. Прямые вызовы Control Plane пользователем не предусмотрены.

ШагМетодРезультат
1. Создание агента с начальной версиейPOST /api/v1/agents202 Accepted → Operation
2. Создание новой версииPOST /api/v1/agents/{agentId}/versions202 Accepted → Operation
3. Проверка статуса публикацииGET /api/v1/agents/{agentId}/status200 OK → состояние, гейты, наблюдения Registry
4. Откат / скрытие / повторная валидацияPOST /api/v1/agents/{agentId}:rollback / :unpublish / :revalidate202 Accepted → Operation
5. Обновление метаданныхPATCH /api/v1/agents/{agentId}202 Accepted → Operation

Признаки успешной публикации:

  • 202 Accepted — операция принята, а не завершена;
  • финальная готовность — publicationState = active в статусе публикации;
  • статус операции в GET /api/v1/operations/{operationId} — succeeded.

3.6. Настройка политики публикации

Роль: Администратор Платформы

ШагДействиеПримечание
1PATCH /api/v1/agent-publication-policy: задать tierId и allowedModelIdsSingleton; при enabled=true требуются оба поля
2Создание версий агентов проверяется против политикиВерсия замораживает modelIds, tierId, ревизию и дайджест политики
3Изменения политики не действуют задним числомДля смены ограничений публикуется новая версия с новым SemVer

4. Жизненный цикл публикации

4.1. Команды

КомандаМетодПоведение
PublishPOST /api/v1/agents/{agentId}/versions + публикация версииНовая задача публикации; прохождение всех нормативных фаз; инкремент publication_revision; предыдущая версия атомарно отключается
RollbackPOST /api/v1/agents/{agentId}:rollbackОткат к ранее сохранённой неизменяемой версии. Создаёт новую ревизию, новое привязывание учётных данных (если версия требует LLM) и новые неиспользуемые имена объектов провайдера. Предыдущий Service UID, readiness и факты реестра не наследуются
UnpublishPOST /api/v1/agents/{agentId}:unpublishАтомарно фиксирует desired=unpublished и новую ревизию. Строго упорядоченные побочные эффекты: запись намерения отзыва, блокировка маршрута, ожидание Registry withheld, отзыв учётных данных, удаление управляемых ресурсов. После этого автоматический reconcile не вернёт маршрут без новой команды publish
RevalidatePOST /api/v1/agents/{agentId}:revalidateПовторная валидация приостановленного агента: все фазы повторяются с нуля (provenance, новый UID, readiness, credential, периметр Gateway, гейты Registry). Предыдущее наблюдение active не наследуется
СтатусGET /api/v1/agents/{agentId}/statusСостояние публикации, ревизия, гейты, наблюдения, временные метки. В ответ не включаются: исходные байты, сырой ключ, координаты Secret, bearer-токены, учётные данные провайдера, сырой манифест, внутренние адреса, стек-трейсы

Причина unpublish (reasonCode): user_requested, security_response, source_retired, operational. Триггер revalidate: scope_restored, operator_recovery, provider_recovered.

4.2. Гейты валидации

Статус публикации содержит 15 строго определённых гейтов. Гейт passed означает, что внешняя система (Registry, Gateway, Admission Controller) подтвердила факт, а не просто запись в базе данных. Статусы гейтов: pending, passed, failed, not_applicable. Агент становится active только после прохождения всех применимых гейтов.

№ГейтНазначение
1sourceValidationКорректность структуры и схемы LowCodeSource
2artifactIntegrityАртефакт по uri совпадает с sourceSha256
3identityProvenanceПроисхождение и аутентичность identity
4candidateCredentialВременный ключ кандидатской версии создан и валиден
5workloadAdmissionWorkload соответствует политикам безопасности и ресурсам
6workloadReadinessWorkload готов к обслуживанию
7gatewayRouteКорректность маршрутизации в Gateway
8gatewayPerimeterПериметр доступа (CORS, IP-фильтрация, отсечение токенов)
9registryCandidateValidationRegistry зафиксировал кандидата как валидный (candidate_validated)
10registryActiveProjectionRegistry обновил публичную проекцию активной версии (agent.active.v2)
11registryMetadataOwnerProjectionRegistry зафиксировал обновление метаданных владельца (metadata-owner-projection.confirmed.v2)
12routeWithdrawalОтключение маршрута (только unpublish)
13registryWithheldRegistry скрыл агента из публичного каталога (только unpublish)
14credentialRevocationОтзыв старого ключа (rollback, unpublish, revalidate)
15workloadDeletionУдаление устаревшего workload (только unpublish)

Состояния degraded и suspended возникают, если один или несколько гейтов failed или pending.

4.3. Наблюдения от Agent Registry

Agent Registry — независимая система; его состояние является источником истины для валидации гейтов публикации.

НаблюдениеСмысл
registryObservation.candidate_validated: trueRegistry подтвердил валидность кандидатской версии (при publish)
registryObservation.withheld: trueRegistry скрыл текущую версию из каталога (при unpublish)
activeProjectionObservationRegistry обновил публичную проекцию agent.active.v2: содержит agentId, versionId, publicationRevision, confirmedAt
metadataOwnerProjectionObservationRegistry атомарно применил обновление метаданных; все поля, включая canonicalDigest, должны точно совпадать с зафиксированным контекстом
withdrawalIntentНевозвратный контекст намерения unpublish: reasonCode и targetAgentVersionId

При отсутствии наблюдения операция ещё не завершена — ожидается ответ Registry.


5. Безопасность

5.1. Хранение секретов

СекретГде хранитсяГде используется
Ключи провайдеровAES-256-GCM в PostgreSQLModel reconciler → immutable Kubernetes Secret
Учётные данные агентовAES-256-GCM в PostgreSQLPublisher worker → Kubernetes Secret
Ключ шифрования установкиОтдельный защищённый Kubernetes SecretМонтируется только в воркерах с правом на учётные данные; недоступен обычным читателям API
Виртуальные ключи (человек/сервис)Генерируются; в БД — только хэш, сырой ключ — один раз вызывающемуВерификация Gateway, одноразовая доставка

Сырые учётные данные провайдеров никогда не покидают зашифрованное хранилище Control Plane.

Важно: Не помещайте значение токена, сырой ключ, учётные данные провайдера или внутренний адрес в запрос, лог или сообщение об ошибке.

5.2. Авторизация

Модель «ресурс — право» Control Plane:

ПравоРесурсОписание
control_plane#publishcontrol_plane:control-planeПубликация агентов
control_plane#administercontrol_plane:control-planeАдминистрирование (политики, уровни, провайдеры, модели, ключи)
control_plane#observecontrol_plane:control-planeНаблюдение за статусом
agent#viewagent:{agentId}Просмотр агента
agent#manageagent:{agentId}Управление агентом (метаданные, владелец)
agent#diagnoseagent:{agentId}Диагностика и статус публикации

Защитные гейты авторизации:

  • Operation requester gate — новая Operation скрыта и не может стартовать до подтверждения operation:{operationId}#requester через SpiceDB;
  • Owner transfer gate — при смене владельца Registry атомарно заменяет старый кортеж agent#owner;
  • Agent-owned key lifecycle — ключи агента не изменяются через административное API;
  • любой недействительный или неизвестный результат авторизации обрабатывается как отказ (fail-closed).

5.3. Идемпотентность и контроль версий

  • Заголовок Idempotency-Key (16–128 символов, ^[A-Za-z0-9._~-]+$) обязателен для всех write-операций.
  • Заголовок If-Match (ETag вида "r<revision>") обязателен для PATCH и DELETE.
  • Повтор с тем же ключом и тем же каноническим дайджестом возвращает оригинальный результат; другой дайджест — 409 Conflict (idempotency_conflict).

6. Мониторинг и диагностика

6.1. Проверка состояния

# Поды, развёртывания и сервисы
kubectl -n "$CP_NAMESPACE" get deploy,pod,svc

# Журналы API и воркеров
kubectl -n "$CP_NAMESPACE" logs deploy/ap-control-plane-api --all-pods --tail=200
kubectl -n "$CP_NAMESPACE" logs deploy/ap-control-plane-model-reconciler --all-pods --tail=200
kubectl -n "$CP_NAMESPACE" logs deploy/ap-control-plane-key-reconciler --all-pods --tail=200
kubectl -n "$CP_NAMESPACE" logs deploy/ap-control-plane-publisher --all-pods --tail=200

# События
kubectl -n "$CP_NAMESPACE" get events --sort-by=.lastTimestamp

Диагностику операции: GET /api/v1/operations/{operationId}; диагностику публикации: GET /api/v1/agents/{agentId}/status.

6.2. Типовые нарушения

ПризнакИсточникВероятная причина и действие
503 AuthorizationUnavailableAPISpiceDB недоступен — fail-closed. Проверить состояние SpiceDB
504 VerificationTimeoutAPIGateway не отвечает при верификации ключа. Проверить доступность LLM Gateway
412 PreconditionFailedAPIIf-Match не совпадает. Получить актуальный ETag через GET и повторить
409 ConflictAPIРесурс занят зависимостями или конфликт версий. Освободить зависимости либо повторить с новым ETag
Operation зависла в runningTemporalВоркер упал. Temporal автоматически перезапустит из истории. Проверить логи воркера
Operation зависла в queuedTemporalRequester gate не подтверждён через SpiceDB. Проверить разрешения
publicationState = degradedПубликацияНе все гейты прошли. Просмотреть gates в статусе публикации
publicationState = suspendedПубликацияКритический гейт упал. Устранить причину и выполнить revalidate
Воркер не создаёт объекты KubernetesВоркерНе хватает прав RBAC, ключ шифрования недоступен или адрес провайдера недоступен. Проверить логи и события

7. Восстановление

7.1. Цели восстановления

КомпонентRTORPO
Control Plane API30 минут5 минут
PostgreSQL30 минут5 минут
Temporal namespace15 минут0 (воспроизведение из истории)

Сопоставимые цели Agent Registry — RTO 60 минут, RPO 5 минут.

7.2. Восстановление после отказа

  1. Развернуть ту же версию компонента с прежними секретами и конфигурацией.
  2. Восстановить PostgreSQL из резервной копии (схема control_plane).
  3. Проверить доступность Temporal namespace control-plane.
  4. Запустить API и воркеры; проверить статус операций.
  5. Проверить публичное API или список ресурсов.

7.3. Крах воркера

Temporal автоматически перезапускает Workflow из истории. Ручное вмешательство не требуется:

  1. Проверить, что Temporal namespace доступен.
  2. Проверить логи воркера на повторяющиеся ошибки.
  3. Если Workflow завис — проверить права RBAC и доступ к внешним системам (Kubernetes, Gateway, Registry).
  4. Для согласованного ручного продолжения использовать preview → execute Recovery API.

7.4. Recovery API

Для согласованного ручного продолжения после дрейфа или отказа внешнего ресурса:

  1. Preview — получить ограниченный инвентарь и observe-only классификацию.
  2. Execute — выполнить согласованное продолжение с подтверждением области воздействия.

Recovery API не угадывает владельца, не выполняет автоматическое принятие и не допускает широкой очистки.

7.5. Миграции базы данных

Задание миграции и проверка при запуске используют транзакционную блокировку PostgreSQL. При ошибке:

  1. Остановить развёртывание версии.
  2. Сохранить номер миграции (Alembic) и ошибку базы.
  3. Вернуть совместимый образ приложения.
  4. Понижение версии схемы выполнять только после проверки сохранности данных.
  5. Не запускать разрушительный SQL из интерактивного контейнера.

8. Сводные таблицы API

Базовый путь: /control-plane/api/v1. Аутентификация — Bearer-токен.

Управление моделями и ключами

МетодПутьПравоОписание
GET/tierscontrol_plane#administerСписок уровней
POST/tierscontrol_plane#administerСоздать уровень
GET/tiers/{tierId}control_plane#administerПолучить уровень
PATCH/tiers/{tierId}control_plane#administerОбновить уровень
DELETE/tiers/{tierId}control_plane#administerУдалить уровень
GET/modelscontrol_plane#administerСписок моделей
POST/modelscontrol_plane#administerСоздать модель
GET/models/{modelId}control_plane#administerПолучить модель
PATCH/models/{modelId}control_plane#administerОбновить модель
DELETE/models/{modelId}control_plane#administerУдалить модель
GET/keyscontrol_plane#administerСписок всех ключей
POST/keyscontrol_plane#administerВыдать ключ (администратор)
GET/keys/{keyId}control_plane#administerПолучить ключ
PATCH/keys/{keyId}control_plane#administerОбновить политику ключа
POST/keys/{keyId}:rotatecontrol_plane#administerРотация ключа
POST/keys/{keyId}:revokecontrol_plane#administerОтзыв ключа
GET/key-issuance-policycontrol_plane#administerПолучить политику выдачи
PATCH/key-issuance-policycontrol_plane#administerОбновить политику выдачи

Самообслуживание (me)

МетодПутьОписание
GET/me/key-issuance-policyСокращённая политика выдачи
GET/me/keysСписок ключей текущего субъекта
POST/me/keysВыдать ключ (самообслуживание)
GET/me/keys/{keyId}Получить свой ключ
POST/me/keys/{keyId}:rotateРотация своего ключа
POST/me/keys/{keyId}:revokeОтзыв своего ключа

Публикация агентов

МетодПутьПравоОписание
GET/agentscontrol_plane#publishСписок агентов
POST/agentscontrol_plane#publishСоздать агента с начальной версией
GET/agents/{agentId}control_plane#publish / agent#viewПолучить агента
PATCH/agents/{agentId}agent#manageОбновить метаданные/владельца
GET/agents/{agentId}/versionscontrol_plane#publish / agent#diagnoseСписок версий
POST/agents/{agentId}/versionscontrol_plane#publishСоздать версию
GET/agents/{agentId}/versions/{versionId}control_plane#publish / agent#diagnoseПолучить версию
POST/agents/{agentId}:rollbackcontrol_plane#publishОткат к версии
POST/agents/{agentId}:unpublishcontrol_plane#publishСкрыть агента
POST/agents/{agentId}:revalidatecontrol_plane#publishПовторная валидация
GET/agents/{agentId}/statuscontrol_plane#publish / agent#diagnoseСтатус публикации
GET/agent-publication-policycontrol_plane#administerПолучить политику публикации
PATCH/agent-publication-policycontrol_plane#administerОбновить политику публикации

Операции

МетодПутьОписание
GET/operations/{operationId}Статус операции

Коды ответов

КодОписание
200Успешное чтение / идемпотентное воспроизведение
201Ключ создан и верифицирован
202Асинхронная операция принята
400Неверный запрос
401Неаутентифицирован
403Недостаточно прав
404Ресурс не найден
409Конфликт: идемпотентность, зависимости или состояние
410Предпросмотр истёк
412If-Match не совпадает
503Сервис авторизации недоступен
504Тайм-аут верификации ключа

Известные ограничения

  • Учётные данные провайдера нельзя удалить (провайдер может быть создан без них).
  • «Внутреннее» имя модели (gatewayName) неизменяемо — можно сменить только upstreamModel.
  • Пустое displayName уровня отображается пустым в интерфейсе — заполняйте его при создании.
  • Жёсткое удаление агентов не предусмотрено — используйте unpublish.
  • Изменяемые Flow.data не публикуются; неизвестный или изменённый компонент отклоняется с ошибкой.
  • Прямая загрузка в OCI, Kubernetes или Agent Registry запрещена.

На этой странице

Назначение и область примененияТермины и сокращения1. Архитектура1.1. Общая схема1.2. Состав компонентов1.3. Границы доверия2. Бизнес-сущности2.1. Управление моделямиTier (Уровень)Provider (Поставщик)Model (Модель)2.2. Управление ключамиKeyIssuancePolicy (Политика выдачи ключей)ApiKey (Ключ API)2.3. Публикация агентовAgent (Агент)AgentVersion (Версия агента)AgentPublicationPolicy (Политика публикации агентов)Publication (Публикация)PublishJob (Задача публикации)3. Типовые сценарии администратора3.1. Настройка провайдера и моделей3.2. Настройка политики выдачи ключей3.3. Выдача ключа администратором3.4. Управление ключами3.5. Создание и публикация агента3.6. Настройка политики публикации4. Жизненный цикл публикации4.1. Команды4.2. Гейты валидации4.3. Наблюдения от Agent Registry5. Безопасность5.1. Хранение секретов5.2. Авторизация5.3. Идемпотентность и контроль версий6. Мониторинг и диагностика6.1. Проверка состояния6.2. Типовые нарушения7. Восстановление7.1. Цели восстановления7.2. Восстановление после отказа7.3. Крах воркера7.4. Recovery API7.5. Миграции базы данных8. Сводные таблицы APIУправление моделями и ключамиСамообслуживание (me)Публикация агентовОперацииКоды ответовИзвестные ограничения