Архитектура ИС "Платформа ИИ"
ООО "ГК "Иннотех", домен Искусственный интеллект, 2026 г.
1. Глоссарий
| Термин | Описание |
|---|---|
| Agent | Программный исполнитель, который с помощью модели, правил и инструментов решает пользовательскую или системную задачу. |
| AgentVersion | Конкретная неизменяемая версия Agent. В Agent Registry получает непрозрачный UUIDv7 и связана с неизменяемой версией SemVer. |
| Agent Registry (Реестр агентов) | Централизованный каталог карточек агентов и MCP-серверов, автоматически обнаруживающий развернутых агентов в кластере Kubernetes |
| AES (Agent Execution Service) | Сервис исполнения агентов; системный потребитель реестра для подбора агента под запрос пользователя |
| Low-code Runtime (Рантайм low-code) | Универсальный контейнерный образ на базе lfx, исполняющий один опубликованный Поток агента |
| Platform Agent Gateway | Публичный шлюз маршрутизации вызовов агентов; проверяет тождество вызывающей стороны и права через SpiceDB |
| Agent Publisher | Целевой компонент проверки и публикации AgentVersion. В поставке 11.08 отсутствует; отдельная версионированная спецификация отсутствует. |
| PDP | Точка принятия решения о политике доступа (Policy Decision Point). Недоступность PDP приводит к запрету доступа (fail-closed). |
| Рабочее пространство | Доверенная область каталога и прав. Для наблюдения Registry определяется точным соответствием (cluster_id, namespace) → workspace_id. |
| OIDC | OpenID Connect; базовый стандарт аутентификации платформы. |
| OTel | OpenTelemetry — средства метрик, трассировки и распространения контекста. |
| SLO | Измеримая цель качества сервиса. |
| RTO / RPO | Целевое время восстановления / допустимая потеря данных при восстановлении. |
| R1 / R2 / R3 | Горизонты поставки: обязательный первый выпуск / последующее развитие / отложенные возможности. |
| A2A (Agent-to-Agent) | Протокол взаимодействия между агентами, версия 1.0.0, HTTP+JSON |
| MCP (Model Context Protocol) | Протокол предоставления инструментов, версия 2025-11-25, Streamable HTTP |
| Agent Card | Публичная карточка агента (.well-known/agent-card.json), описывающая его возможности, версию, владельца и endpoint |
| SpiceDB | Система ресурсной авторизации; хранит отношения между субъектами и агентами, выдаёт решения agent#invoke |
| Low-code Конструктор (IDE) | Визуальная среда создания и проверки Потока. Отделена от Runtime. |
| PlatformLLM | Платформенная нода (в low-code конструкторе) для вызова языковых моделей через AI Gateway |
| PlatformRAG | Платформенная нода (в low-code конструкторе) для гибридного поиска по знаниям через RAG Service (отложено до R2) |
| PlatformMemory | Платформенная нода (в low-code конструкторе) для краткосрочной и долгосрочной памяти через Memory Service (отложено до R2) |
| PlatformTool | Платформенная нода (в low-code конструкторе) для вызова внешних информационных систем через Tools Hub (отложено до R2) |
| PlatformAgent | Платформенная нода (в low-code конструкторе) для вызова других агентов платформы по A2A (отложено до R2) |
| Platform Memory (Memory Service) | Единый управляемый слой памяти платформы; принимает ход диалога, извлекает факты вне критического пути, отдаёт релевантные факты в пределах бюджета токенов; HTTP API порт 8091 |
| Memory API | Stateless HTTP-сервис (platform-memory-api); пути /v1/memories, /v1/memories/search, /v1/events, /health; порт 8091, ClusterIP |
| Worker (Memory) | Процесс platform-memory-worker: извлечение фактов из очереди memory.add, вызов пайплайна mem0, индексация в OpenSearch и запись истории в PostgreSQL |
| Fact / запись памяти | Атомарный факт о пользователе, агенте или задаче (поле memory); сохраняется в OpenSearch (текст + вектор) и PostgreSQL (события, история) |
| Скоуп (Scope) | Граница изоляции памяти: user_id (из идентичности), agent_id, run_id; для add/list обязателен минимум один из agent_id/run_id; поиск требует фильтров со скоупом |
| Workspace (Memory) | Рабочая область платформы (X-Workspace-Id); факты разных workspace не смешиваются |
| Event store (Memory) | Таблица platform_memory.memory_event в PostgreSQL — источник истины по async add (статусы: PENDING → RUNNING → SUCCEEDED/FAILED) |
| Search (Memory) | Синхронный гибридный поиск Memory: эмбеддинг запроса через AI Gateway + OpenSearch (семантика + BM25), упаковка в token_budget |
| AI Gateway | Единственный разрешённый путь к LLM-извлечению и эмбеддингу для Memory; профили задаются конфигурацией (embedding.model, ai_gateway.llm_model) |
| OpenSearch | Поисковая система; хранит гибридные индексы: agent-catalog (семантический поиск агентов), rag-kb-<env> (коллекции RAG), mem-facts-<env> (факты памяти, kNN + BM25); размерность эмбеддинга по умолчанию 1024 |
| RabbitMQ | Брокер уведомлений о заданиях add: exchange memory.add, очередь memory.add.jobs, DLX memory.add.dlx, DLQ memory.add.dlq; источник истины — PostgreSQL, а не RabbitMQ |
| Fail-closed | Принцип отказа в сторону запрета: при недоступности критической зависимости (PDP/SpiceDB, очередь) сервис не «прощает» запрос — запись не принимается (событие FAILED, 503 queue_unavailable) либо данные не выдаются (503 authz_unavailable) |
| lfx | Ядро исполнения потоков; stateless-исполнитель, загружающий Поток из JSON (форк LangFlow — только источник исходного кода) |
| Flow (Поток) | Визуально собираемый агент из платформенных нод; сохраняется как JSON-артефакт |
| Манифест публикации | Неизменяемое описание исходного Потока, образа Runtime, режима исполнения, версии политики компонентов и заявленных возможностей. |
| Рабочая нагрузка | Развёрнутый в Kubernetes экземпляр SDK- или Low-code-агента либо MCP-сервера. |
| Согласование состояния | Повторяемое приведение записей Registry, прав и поисковых проекций к наблюдаемому состоянию Kubernetes. |
| Проекция | Производное представление исходных данных для конкретной задачи: API, поиска или маршрутизации. Проекция может быть пересоздана из источника истины. |
| Outbox (исходящий ящик) | Механизм надёжной доставки событий каталога через транзакционный механизм в PostgreSQL и Redpanda |
| Redpanda | Распределённый журнал сообщений (durable change stream); обеспечивает гарантированную (at-least-once) доставку событий |
| RAG (Retrieval-Augmented Generation) | Метод генерации с предварительным извлечением контекста из хранилища знаний |
| RAG Service (Platform RAG) | Платформенный сервис уровня COMMON: реестр коллекций, приём нормализованных документов, гибридный поиск с обязательной фильтрацией по правам доступа и выдача фрагментов с цитатами; HTTP API, порт 8090 |
| Коллекция | Управляемый индекс знаний: профиль эмбеддинга, модель ACL, стратегия чанкинга, параметры поиска; создаётся через POST /v1/collections, owner определяется через SpiceDB |
| Канонический документ | Нормализованный документ приёма: content/content_ref, acl, content_hash, idempotency_key; сохраняется в S3 staging на время задания |
| Ingest | Асинхронный конвейер приёма: регистрация задания -> чанкинг -> эмбеддинг через AI Gateway -> bulk-индексация в OpenSearch; источник истины — PostgreSQL |
| Job store | Таблица platform_rag.ingest_job в PostgreSQL — источник истины по заданиям ingest (статусы: PENDING -> RUNNING -> DONE/FAILED/DEDUPLICATED) |
| Retrieval | Синхронный поиск: гибридный kNN+BM25, слияние RRF (Reciprocal Rank Fusion), обязательная фильтрация по tenant_id и ACL вызывающего, выдача фрагментов с цитатами (doc_id, chunk_id, оценка) |
| RAG API | Stateless HTTP-сервис (platform-rag-api); поверхности: collections, ingest, query, /health; порт 8090, ClusterIP |
| Worker | Процесс platform-rag-worker, обрабатывающий задания ingest из RabbitMQ; масштабируется независимо, в т.ч. через KEDA по числу PENDING в PostgreSQL; параллелизм app.worker_concurrency |
| ACL | Список групп и субъектов на документе; перепроверяется в момент retrieval, отзыв прав действует на следующем запросе без переиндексации |
| RRF | Reciprocal Rank Fusion — слияние ранжированных списков vector и BM25 с весами, нормализацией min-max и арифметическим средним |
| KEDA | Автомасштабирование воркеров по SQL-запросу SELECT COUNT(*) FROM platform_rag.ingest_job WHERE status = 'PENDING' с целевым значением на реплику (по умолчанию 4) |
| Guardrails | Система проверки входных и выходных текстов (запросов и ответов модели) на запрещённое содержимое и персональные данные; выносит вердикт pass/deny/mask — отклонить текст или замаскировать чувствительные данные до попадания в модель или возврата клиенту. Два слоя: Control Plane (версии политик, доставка, привязка к модели) и Guardrails Runtime (проверка текста) |
| Guardrails Runtime | Отдельный stateless-процесс проверки текста: при старте загружает неизменяемый набор политик, выполняет секции request/response и возвращает вердикт pass/deny/mask; не пишет в RAG/Memory/Kubernetes и не обращается к Control Plane на каждый запрос; HTTP API: POST /request, POST /response, GET /readyz, GET /metrics |
| Политика Guardrails (Guardrail Policy) | Версионируемое описание проверки: две стадии request (вход) и response (выход), каждая с бюджетом deadlineMs, обязательными правилами baseline (всегда enforce, до 64) и дополнительными additional (до 64), плюс список одобренных providers; модель Policy → Stage → Rule[] |
| Правило Guardrails (Rule) | Конкретная проверка текста внутри стадии: типы regex (RE2), stop_list (стоп-список), external_pipeline (внешний детектор, всегда deny), llm_classifier (проверка LLM-моделью); параметры mode (enforce/observe), onMatch (deny/redact), timeoutMs |
| Bundle (набор политик) | Неизменяемый артефакт доставки политик в Guardrails Runtime; schemaVersion: agent-platform.guardrail-runtime.bundle/v1; целостность — SHA-256 канонического JSON (RFC 8785) bundleDigest; без hot-reload — смена требует нового процесса/поколения |
| FileRef | Платформенная ссылка на файл с проверкой владельца, TTL, цели и подписи |
| Trace ID | Сквозной идентификатор трассировки по стандарту W3C Trace Context / OpenTelemetry |
| Control Plane | Управляющая подсистема платформы: владеет desired state и длительными операциями, управляет моделями, виртуальными ключами LLM и публикацией агентов. Вне путей инференса LLM и A2A-вызова |
Platform API Gateway (api-gw) | Общий южно-северный шлюз управления и каталога; маршрутизирует Control Plane API (/control-plane) и Agent Registry API (/agent-registry) под одним origin. Не владеет бизнес-логикой и не смешивается с Platform Agent Gateway |
| Agent Publication | Capability Control Plane: публикация low-code агентов; выделяет идентификаторы, создаёт Kubernetes-ресурсы и ждёт фидбэка Registry. Не отдельный сервис или bounded context |
| cpctl | Тонкий CLI-клиент Control Plane API (Go, static binary); не обращается к БД, Kubernetes и worker-очерям напрямую |
| Tier | Профиль обслуживания ключа LLM: лимит запросов в минуту и квота токенов в минуту; без членов и унаследованных прав |
| Provider (LLM) | Конфигурация внешнего LLM-провайдера: адаптер openai_compatible, HTTPS-конечная точка, зашифрованные учётные данные |
| Model | Конкретная модель с именем для шлюза (gatewayName), привязкой к провайдеру и профилем internal/external |
| ApiKey (виртуальный ключ LLM) | Виртуальный ключ доступа к LLM: один владелец (principal/service/agent), один Tier, явный набор моделей (до 256); сырой ключ не хранится, только fingerprint |
| KeyShard | Внутреннее byte-bounded размещение render-политики ключей в ConfigMap (лимит менее 1 MiB); не создаёт grouping или права |
| Publication | Привязка агента к выбранной версии в окружении; состояния active/degraded/suspended/unpublished |
| PublishJob | Устойчивая (durable) попытка выполнения публикации: validate/apply/verify/select/unpublish |
| Operation (durable) | Устойчивое намерение мутации в PostgreSQL; переживает перезапуск, повторяется до завершения или компенсации |
| Gate (гейт публикации) | Независимое наблюдаемое условие валидации публикации: pending/passed/failed/not_applicable |
| Reconciler (CP) | Фоновый воркер, детерминированно применяющий desired state во внешних системах (Kubernetes, LLM Gateway) |
2. Описание архитектуры
2.1. Функциональная архитектура
2.1.1. Бизнес-данные
В периметре платформы определяются следующие сущности данных:
| № | Наименование сущности данных | Источник данных | Источник — мастер-система? | Кешируется? |
|---|---|---|---|---|
| 1 | Карточка агента (Agent Card) | Публичный endpoint A2A/MCP workload (.well-known/agent-card.json или tools/list) | Нет — мастером является Kubernetes (существование workload) | Нет — загружается при реконсиляции |
| 2 | Запись реестра (RegistryResource / ResourceVersion) | PostgreSQL — committed state реестра | Да — мастер для API-запросов get / list | Нет |
| 3 | Проекция поиска (SearchProjectionState) | OpenSearch agent-catalog | Нет — производная от committed-состояния PostgreSQL | Нет |
| 4 | Отношения авторизации (SpiceDB relationships) | SpiceDB | Да — мастер для решений agent#invoke | Нет — каждый защищённый запрос выполняет live check |
| 5 | Артефакт Потока (Flow source + manifest) | Object Storage | Нет — immutable артефакт публикации | Нет |
| 6 | Коллекция знаний (Collection) | PostgreSQL platform_rag.collections | Да — мастер для API-запросов get/list/delete | Нет — создаётся через API, owner в SpiceDB |
| 7 | Задание ingest (IngestJob) | PostgreSQL platform_rag.ingest_job | Да — источник истины по статусам ingest | Нет — цепочка статусов: PENDING → RUNNING → DONE/FAILED/DEDUPLICATED |
| 8 | Канонический документ и чанки (CanonicalDoc + Chunk) | S3 (staging) + OpenSearch rag-kb-{env} | Нет — пересоздаваема из PostgreSQL | Нет — чанки хранятся в OpenSearch с tenant_id, acl, version |
| 9 | Проекция поиска RAG (SearchProjectionStateRAG) | OpenSearch rag-kb-{env} | Нет — производная от PostgreSQL и S3 | Нет — пересоздаваема; вектор BGE-M3, 1024 dim, BM25 |
| 10 | Запись памяти (Fact / Memory record) | OpenSearch mem-facts-{env} + PostgreSQL platform_memory.memory_record | Да — мастер для API list/search | Нет — создаётся через async add, обновляется воркером |
| 11 | Событие async add (MemoryEvent) | PostgreSQL platform_memory.memory_event | Да — источник истины по статусам async add | Нет — цепочка статусов: PENDING → RUNNING → SUCCEEDED/FAILED |
| 12 | История изменений записи памяти | PostgreSQL platform_memory.memory_event | Нет — производная от событий | Нет — журнал ADD/UPDATE/DELETE |
| 13 | Вектор факта памяти | OpenSearch mem-facts-{env} (kNN vector) | Нет — производная от факта через AI Gateway | Нет — размерность 1024, BGE-M3 |
| 14 | Профиль обслуживания (Tier) | PostgreSQL control_plane.tier | Да — мастер для API get/list | Нет — неизменяемый технический профиль rate/quota |
| 15 | Конфигурация провайдера (Provider) | PostgreSQL control_plane.provider (учётные данные — application-encrypted) | Да — мастер; сырой credential не возвращается | Нет — сырой ключ только в зашифрованной строке, delivery через Kubernetes Secret |
| 16 | Модель (Model) | PostgreSQL control_plane.model | Да — мастер; привязка Provider → Model | Нет — gatewayName уникален в routing scope |
| 17 | Виртуальный ключ LLM (ApiKey) | PostgreSQL control_plane.api_key | Да — мастер; сырой secret не хранится, только fingerprint | Нет — один владелец, один Tier, до 256 моделей; key_id → shard_id |
| 18 | Публикация агента (Publication / AgentVersion) | PostgreSQL control_plane.agent, agent_version, publication | Да — источник истины desired state публикации | Нет — immutable AgentVersion, монотонная publication revision |
| 19 | Операция публикации (PublishJob / Operation) | PostgreSQL control_plane.publish_job, operation + Temporal Workflow | Да — источник истины по статусам операции | Нет — фазы: accepted → running → verifying → succeeded/failed/cancelled |
| 20 | Запись аудита управления (AuditRecord) | PostgreSQL control_plane.audit (append-only) | Да — источник истины audit-фактов | Нет — без секретного payload, с actor, action, decision, trace |
| 21 | Политика Guardrails (GuardrailPolicy) | PostgreSQL control_plane (версии политик, ревизии) | Да — мастер для API get/list/revisions | Нет — неизменяемые ревизии, definitionDigest |
| 22 | Привязка модели к политике (GuardrailBinding) | PostgreSQL control_plane (привязка модели) | Да — состояние применения: pending/applied/failed/disabled/unbound | Нет — policyId, policyRevision, generationId, bundleDigest |
| 23 | Набор политик Runtime (GuardrailBundle) | Файл на диске процесса Guardrails Runtime (AP_GUARDRAIL_RUNTIME_BUNDLE_FILE) | Да — источник политик для проверки | Нет — неизменяемый на время жизни процесса, bundleDigest (SHA-256 RFC 8785) |
2.1.2. Категории данных
| № | Категория | Тип ПнД | Количество субъектов ПнД | Постоянное хранение данных |
|---|---|---|---|---|
| 1 | Внутренняя информация (Internal) | — | — | Да — карточки агентов, метаданные, версии, статусы |
| 2 | Конфиденциальная информация (Confidential) | — | — | Да — отношения авторизации, данные владельцев, проекции поиска |
| 3 | Ограниченные временные данные (Restricted-transient) | — | — | Нет — пользовательские запросы, оригинальные bearer-токены, учётные данные, приватные endpoint; не сохраняются в PostgreSQL / OpenSearch / Redpanda / audit / telemetry |
Специальные и биометрические персональные данные в описанных сущностях отсутствуют.
Данные RAG Service (коллекции, задания ingest, канонические документы, чанки с ACL, проекты поиска) классифицируются по тем же категориям: метаданные коллекций и job store — Internal; ACL документов, отношения SpiceDB, проекты поиска — Confidential; пользовательские запросы и оригинальные bearer-токены — Restricted-transient (не сохраняются).
Данные Memory Service (факты памяти, события async add, история изменений, векторы фактов) классифицируются аналогично: факты, события и история — Internal (данные об агенте, сессии, задаче); скоупы user_id, agent_id, run_id и workspace_id — Confidential (идентификация субъектов); сообщения диалога (messages) и оригинальные bearer-токены — Restricted-transient (не сохраняются в долговременной памяти). Память не заменяет RAG: Platform RAG отвечает за корпус документов; Platform Memory — за знания о пользователе, агенте и сессии.
Данные Control Plane классифицируются по тем же категориям: метаданные Tier/Provider/Model, Publication и Operation — Internal; зашифрованные учётные данные провайдера и агента, fingerprint ключей, отношения авторизации управления и записи аудита — Confidential; сырой virtual-key secret, учётные данные провайдера и оригинальные bearer-токены — Restricted-transient (сырой ключ возвращается один раз в oneTimeSecret и не сохраняется в PostgreSQL / Kubernetes / audit / telemetry).
Данные Guardrails классифицируются по тем же категориям: версии политик, их ревизии и привязка к модели — Internal; сервисный токен Runtime и учётные данные внешних провайдеров/классификаторов — Confidential (хранятся в Kubernetes Secret/файлах, не попадают в политику или Git); проверяемый текст запроса/ответа, оригинальные bearer-токены и полный ответ классификатора — Restricted-transient (не сохраняются в БД, журнале или метриках процесса — метрики содержат только счётчики проверок, ошибок, срабатываний и длительности без текста и имён политик).
2.1.3. Функциональная диаграмма
Показывает сценарии работы Платформы ИИ: от создания агента до его вызова, а также сопутствующие потоки (аутентификация, вызов модели, наблюдение).

Таблица потоков
| № | Источник | Получатель | Протокол | Описание |
|---|---|---|---|---|
| Ф1 | Low-code Конструктор | Control Plane API | HTTP (REST) | Экспорт неизменяемой версии flow в виде команды публикации. |
| Ф2 | Control Plane | Kubernetes, OCI-реестр артефактов | Kubernetes API, OCI | Развёртывание workload'а и публикации артефакта. |
| Ф3 | Agent Registry | Registry PostgreSQL | SQL (PostgreSQL) | Регистрация агента в каталоге по наблюдению за кластером. |
| Ф4 | Пользователь | Agent Registry API | HTTP (REST) | Поиск и просмотр доступных агентов. |
| Ф5 | Вызывающий | Агентский шлюз | HTTP (A2A) | Запрос к опубликованному агенту. |
| Ф6 | Агентский шлюз | Low-code Runtime | HTTP (A2A/MCP) | Передача запроса в исполняющий агент после проверки. |
| Ф7 | Control Plane | Kubernetes | Kubernetes API | Снятие агента с публикации (route-first unpublish). |
| Ф8 | Вызывающий, пользователь | Platform IdP, шлюзы | OIDC | Получение и проверка access-токена. |
| Ф9 | Low-code Runtime | LLM Gateway | HTTP (REST) | Вызов модели с ключом агента. |
| Ф10 | Все компоненты | OpenTelemetry | OTLP | Сбор метрик, логов и трассировок. |
| Ф11 | Low-code Конструктор | Platform RAG API | HTTP (REST) | Извлечение знаний при проектировании flow. |
| Ф12 | Low-code Конструктор | Platform Memory API | HTTP (REST) | Работа с памятью при проектировании flow. |
| Ф13 | Low-code Runtime | Platform RAG API | HTTP (REST) | Извлечение знаний при исполнении агента. |
| Ф14 | Low-code Runtime | Platform Memory API | HTTP (REST) | Работа с памятью при исполнении агента. |
| Ф15 | Владелец политик (Control Plane) | Guardrails Runtime | HTTP (REST) | Доставка неизменяемого набора политик; привязка политики к модели через шлюз (webhook promptGuard). |
| Ф16 | LLM Gateway | Guardrails Runtime | HTTP (REST) | Проверка запроса модели (POST /request) до отправки в модель. |
| Ф17 | Guardrails Runtime | LLM Gateway | HTTP (REST) | Проверка ответа модели (POST /response) перед возвратом клиенту. |
| Ф18 | RAG/Memory-адаптер | Guardrails Runtime | HTTP (REST) | Прямая проверка текста перед индексацией/записью (request) и выдачей (response). |
3. Принятые ключевые архитектурные решения
| № | Раздел | Описание |
|---|---|---|
| 1 | Agent Registry §1.2 | Кластер Kubernetes — единственный источник истины о существовании workload. Registry сходится к состоянию кластера (reconcile loop), а не наоборот. Расхождение всегда разрешается в пользу кластера. |
| 2 | Agent Registry §1.2, AR-D-02 | Публичный ручной API для создания и удаления агентов запрещён. Publisher (или оператор в поставке 11.08) создаёт workload в Kubernetes, а Registry только наблюдает его через Service/EndpointSlice. |
| 3 | Agent Registry §1.2, AR-D-12 | Публичный вызов агента проходит только через Platform Agent Gateway. Исходные Pod/Service адреса агентов наружу не публикуются. |
| 4 | Agent Registry §1.2, AR-D-06 | GitOps не является обязательной стратегией деплоя текущих релизов. Registry не принимает команды публикации. |
| 5 | Agent Registry §1.2, AR-D-14 | Redis отсутствует в R1. Каждый защищённый запрос выполняет live SpiceDB check; при недоступности PDP — fail-closed (503), без кеширования allow/deny. |
| 6 | Agent Registry §1.2, AR-D-17 | SpiceDB выполняет все проверки в режиме fully_consistent. Workspace-видимость не означает invoke-право. Owner проверяется через trusted Owner Directory. |
| 7 | Agent Registry §1.2, AR-D-16 | Гибридный поиск: BM25 (лексический) + k-NN (векторный, BGE-M3, 1024 измерения), веса 0.70/0.30, нормализация min-max + арифметическое среднее. Порог релевантности — не ниже 0.30. |
| 8 | Agent Registry §4, AR-D-07 | События изменения каталога доставляются через транзакционный outbox в PostgreSQL и Redpanda (at-least-once). Search Indexer и ReindexJob используют отдельные consumer groups, оба обработчика идемпотентны. |
| 9 | Low-code PRD §1.2 | Один образ рантайма на базе lfx для всех low-code агентов. Публикация создаёт новый Deployment с флоу-артефактом, а не собирает образ под каждого агента. |
| 10 | Low-code PRD §1.2 | Low-code агент неотличим от SDK-агента: тот же A2A-интерфейс, agent-card, авторизация через SpiceDB, наблюдаемость по единому trace_id. |
| 11 | Low-code PRD §3.2, NODE-4 | Из форка LangFlow удалены все внешние LLM-провайдеры, облачные vector-store и внешние memory-backend. Только платформенные ноды (PlatformLLM, PlatformRAG, PlatformMemory, PlatformTool, PlatformAgent). |
| 12 | Low-code Runtime §Architecture | Object Storage — нормативный источник артефактов Потока в production. |
| 13 | Low-code Runtime §Architecture | Runtime не подключается к базе Конструктора и не обновляет конфигурацию Потока. |
| 14 | Low-code Runtime §Architecture, LC-RT-D-01 | Поставка 11.08 не включает Agent Publisher. Runtime разворачивается вручную typed Kubernetes-манифестами, артефакт Потока выкладывается вручную в Object Storage. |
| 15 | Low-code Runtime §Requirements, LC-RT-D-11 | PlatformRAG и PlatformMemory отложены до R2 — сервисы ещё не готовы как platform-контракты. Flow с такими нодами отклоняется с component_not_allowed. |
| 16 | Agent Registry §Architecture | PostgreSQL — записи реестра и источник для API; OpenSearch — пересоздаваемый индекс для поиска. |
| 17 | RAG Service §1.2, RAG-D-01 | Platform RAG — сервис уровня COMMON; consumers обращаются только через SDK (platform-rag) или low-code компонент; построение собственного retrieval не допускается. |
| 18 | RAG Service §1.3, RAG-D-02 | Разделение ответственности: интеграционные сервисы приводят данные к каноническому виду; Platform RAG выполняет чанкинг, эмбеддинг, индексацию, авторизацию и поиск. Прямая запись интеграций в OpenSearch/S3/RabbitMQ запрещена. |
| 19 | RAG Service §1.3, RAG-D-03 | Идентичность пользователя (а не агента) определяет видимость чанков: один и тот же агент для разных пользователей возвращает разный набор результатов (RET-2). |
| 20 | RAG Service §4.2, RAG-D-04 | SpiceDB — fail-closed: при недоступности сервис отвечает 503 authz_unavailable, не «прощая» запросы. |
| 21 | RAG Service §1.4, RAG-D-05 | Автомасштабирование воркеров через KEDA по SQL-запросу SELECT COUNT(*) FROM platform_rag.ingest_job WHERE status = 'PENDING'; источник истины — PostgreSQL, а не глубина очереди RabbitMQ. |
| 22 | RAG Service §3, RAG-D-06 | Эмбеддинг и реранк — только через AI Gateway; профили задаются конфигурацией (text-default-v1, rerank-default-v1), не хардкодом; смена профиля без переиндексации делает векторный поиск несовместимым. |
| 23 | RAG Service §1.4, RAG-D-07 | Гибридный поиск RAG: BM25 (лексический) + k-NN (векторный, BGE-M3, 1024 измерения), слияние RRF (Reciprocal Rank Fusion). |
| 24 | Memory Service §1.2, MEM-D-01 | Platform Memory — единый управляемый слой памяти платформы. Память не заменяет RAG: RAG отвечает за корпус документов, Memory — за знания о пользователе, агенте и сессии. Сборка промпта комбинирует оба источника. |
| 25 | Memory Service §1.2, MEM-D-02 | Разделение ответственности: API (синхронное чтение и приём записи) и воркер извлечения (асинхронный write-path). Агент не проектирует хранилище и пайплайн извлечения. |
| 26 | Memory Service §1.3, MEM-D-03 | Запись async: API создаёт событие PENDING в PostgreSQL, публикует в RabbitMQ, отвечает 202; воркер захватывает, вызывает mem0 пайплайн (LLM через AI Gateway при infer: true), пишет в OpenSearch и историю PostgreSQL, статус SUCCEEDED/FAILED. |
| 27 | Memory Service §1.3, MEM-D-04 | Поиск синхронный: эмбеддинг запроса через AI Gateway, гибридный поиск в OpenSearch (семантика + BM25), упаковка в token_budget. Обязательны фильтры со скоупом. |
| 28 | Memory Service §2.5, MEM-D-05 | Воркер в Kubernetes: текущий чарт создаёт Deployment API; воркер запускается отдельным Deployment с командой platform-memory-worker и тем же ConfigMap/Secret (уточняется при внедрении). Без воркера add остаётся в PENDING. |
| 29 | Memory Service §4.1, MEM-D-06 | Идентичность передаётся заголовками X-Workspace-Id / X-User-Id; поля в теле запроса не доверяются. Целевой контракт (JWT + SpiceDB check) — R1 по PRD, в текущем API не включён. |
| 30 | Memory Service §4.2, MEM-D-07 | Факты изолируются по комбинации workspace, user_id, agent_id, run_id. Удаление по фильтру не позволяет указать чужой user_id (403 Wrong user ID). |
| 31 | Memory Service §3, MEM-D-08 | Все вызовы эмбеддинга и LLM-извлечения — только через AI Gateway. Ключи инференса хранятся у шлюза. infer: false позволяет записать факт без LLM (дешевле, предсказуемее). |
| 32 | Memory Service §5.2, MEM-D-09 | Fail-closed: при недоступности RabbitMQ запись не принимается — событие помечается FAILED, клиент получает 503 queue_unavailable. Источник истины — PostgreSQL, а не RabbitMQ. |
| 33 | Memory Service §8.1, MEM-D-10 | Масштабирование воркеров: параллелизм worker.concurrency (по умолчанию 4), prefetch rabbitmq.prefetch (16), DLQ после rabbitmq.delivery_limit (5). Горизонтальное масштабирование независимо от API. |
| 34 | Memory Service §2.3, MEM-D-11 | Размерность эмбеддинга (embedding.dimension и opensearch.embedding_dimension) закрепляется за индексом. Смена модели/размерности без переиндексации делает векторный поиск несовместимым. |
| 35 | ADR-0004, CP-G-01/CP-API-01 | Control Plane — единый management owner: один versioned API, один UI и cpctl как тонкий клиент. Platform API Gateway (api-gw) маршрутизирует Control Plane API (/control-plane) и Agent Registry API (/agent-registry) под одним origin, без слияния bounded contexts. |
| 36 | ADR-0004, CP-REC-01/CP-PUB-02 | Agent Publication — capability Control Plane, а не отдельный сервис/Publisher API. Первый и единственный source adapter R2 — low-code: клиент передаёт immutable артефакт (URI + digest), не Kubernetes-манифест, namespace или ServiceAccount. |
| 37 | ADR-0004, CP-PUB-04/CP-PUB-10 | Publisher выделяет стабильные UUIDv7 agent_id/agent_version_id до Kubernetes apply; Registry независимо наблюдает Kubernetes и никогда не пишется Control Plane (нет ручных create/delete в Registry). |
| 38 | ADR-0004, CP-KEY-04/CP-KEY-06/CP-NFR-08 | Сырой virtual-key secret возвращается один раз (one-time oneTimeSecret) только после Gateway-верификации; в PostgreSQL хранится только fingerprint (SHA-256), сам ключ не сохраняется. Agent-owned key доставляется runtime через immutable Kubernetes Secret, а не Studio/Registry/Поток. |
| 39 | ADR-0004, CP-SH-01…08 | Размещение политик ключей — sequential byte-bounded allocator (не hash mod N): shard существует только из-за лимита ConfigMap менее 1 MiB, не создаёт owner/права/quota; batch-изменение выполняет ≤1 apply на затронутый shard. |
| 40 | ADR-0002/0003/0004, CP-NFR-06/CP-REC-08 | Control Plane и его воркер вне LLM-инференса и A2A-вызова: недоступность останавливает новые операции управления, но не становится синхронной зависимостью уже допущенного data-plane трафика. Reconcile fail-closed, после восстановления догоняет durable desired state без client replay. |
| 41 | Guardrails: разделение слоёв | Control Plane владеет версиями политик и доставкой, но не вызывается на каждый запрос: он один раз доставляет неизменяемый набор в отдельный процесс Guardrails Runtime, который на лету проверяет текст. Недоступность управления не останавливает уже работающие проверки. |
| 42 | Guardrails: FailClosed | Таймаут правила или стадии, недоступность внешнего провайдера и неопределённый ответ LLM-классификатора трактуются как запрет, а не как пропуск. Все три результата (pass/deny/mask) возвращаются с HTTP 200; проверка по HTTP-статусу недостаточна. |
| 43 | Guardrails: два способа применения | Через шлюз (Agentgateway): политика привязывается к модели в Control Plane, шлюз вызывает Runtime как webhook promptGuard с failureMode: FailClosed. Прямой HTTP-вызов: RAG/Memory-адаптер сам вызывает Runtime перед индексацией/записью/выдачей. Автоматической привязки «политика → коллекция/память» нет. |
| 44 | Guardrails: нет hot-reload и встроенного аудита | Смена политики требует нового процесса/поколения; управляющего метода перезагрузки нет. Встроенного журнала решений нет — только метрики процесса (счётчики проверок, ошибок, срабатываний, длительности), сбрасываемые при перезапуске, без текста и имён политик. |
| 45 | Guardrails: передача ПД внешним моделям | Текст уходит во внешний детектор/классификатор только для правил external_pipeline/llm_classifier; локальные regex/stop_list внешних моделей не используют. Порядок правил не скрывает исходник: все правила видят исходный текст, поэтому маскирование от модели требует отдельной предварительной проверки. |
3.1. Компонентная диаграмма

3.1.1. Перечень компонентов
| Компонент | Технология | Назначение |
|---|---|---|
| API-шлюз платформы | HTTP-ингресс (Gateway API) | Единая точка входа для управления и обнаружения; маршрутизирует Control Plane API и Registry API. |
| Агентский шлюз | HTTP-ингресс (Gateway API) | Граница A2A-вызова: проверка OIDC, привязка маршрута, удаление identity. |
| Control Plane API | Python (FastAPI) | Управление ресурсами и командами публикации. |
| Publisher worker | Python (worker) | Разворачивает workload агента в кластер. |
| Reconcilers | Python | Поддержание desired state ресурсов Control Plane. |
| Control Plane DB | PostgreSQL | Хранилище ресурсов Control Plane. |
| Registry API | Python (FastAPI) | Обслуживание get/list/search каталога. |
| Registry Kubernetes Reconciler | Python | Read-only наблюдение за кластером. |
| Outbox Relay | Python | Доставка событий из outbox в шину. |
| Search Indexer | Python | Формирование индекса поиска. |
| Registry PostgreSQL | PostgreSQL | Хранилище проекции каталога. |
| Low-code Конструктор | (внешний, источник исходного кода) | Авторing flow и фиксация FlowVersion. |
| Low-code Runtime | Python | Исполнение неизменяемого flow-артефакта. |
| Kubernetes | Kubernetes API | Развёртывание и наблюдение workload'ов. |
| OCI artifact registry | OCI | Хранение неизменяемых артефактов. |
| OpenSearch | OpenSearch | Индекс поиска. |
| Redpanda | Redpanda (совместимо с Kafka) | Шина событий. |
| Authzed / SpiceDB | SpiceDB | Модель доступа (permissions). |
| LLM Gateway | HTTP (REST) | Прокидка запросов к моделям. |
| Platform IdP | OIDC (Keycloak) | Выпуск и проверка access-токенов. |
| RAG API | Python (FastAPI) | Общеплатформенный сервис извлечения знаний. |
| RAG Worker | Python (worker) | Асинхронная обработка: чанкинг, эмбеддинги, запись в индекс. |
| Memory API | Python (FastAPI) | Общеплатформенный сервис персистентной памяти. |
| Memory Worker | Python (worker) | Асинхронная обработка записей памяти. |
| Guardrails Runtime | Python | Проверка входных/выходных текстов: pass/deny/mask; stateless, загружает неизменяемый набор политик при старте. |
3.1.2. Пояснение компонентов
- API-шлюз платформы — единая точка входа для управления и обнаружения: маршрутизирует Control Plane API и Agent Registry API. Не владеет их данными.
- Control Plane — управление платформенными ресурсами (модели, провайдеры,
API-ключи) и публикацией агентов.
Publisher workerразворачивает workload в кластер; reconcilers поддерживают desired state. - Agent Registry — независимый каталог. Read-only наблюдает кластер, хранит проекцию каталога и обслуживает поиск. Ручного CRUD агентов нет.
- Low-code Конструктор — создание flow и фиксация неизменяемой версии. Провайдер экспортирует версию в Control Plane, но сам workload не разворачивает.
- Low-code Runtime — исполняет неизменяемый flow-артефакт. Личности вызывающего не получает.
- Агентский шлюз — единственная граница A2A-вызова: проверяет OIDC, связывает маршрут, удаляет bearer и личность вызывающего перед runtime.
- Guardrails Runtime — отдельный stateless-процесс проверки текста:
загружает неизменяемый набор политик при старте, выполняет секции
request/responseи выдаёт вердиктpass/deny/mask. Не пишет в RAG, Memory или Kubernetes и не обращается к Control Plane на каждый запрос. Подключается двумя способами: как webhook шлюза (через привязку политики к модели) и прямым HTTP-вызовом из RAG/Memory-адаптера.
3.1.3. Таблица связей
| № | Источник | Получатель | Протокол | Описание |
|---|---|---|---|---|
| C1 | Low-code Конструктор | API-шлюз платформы | HTTP (REST) | Экспорт версии flow для публикации. |
| C2 | API-шлюз платформы | Control Plane API | HTTP (REST) | Маршрутизация команд управления. |
| C3 | API-шлюз платформы | Registry API | HTTP (REST) | Маршрутизация запросов каталога. |
| C4 | Control Plane API | Control Plane DB | SQL (PostgreSQL) | Запись ресурсов и операций. |
| C5 | Control Plane DB | Reconcilers | SQL (PostgreSQL) | Чтение desired state для сопоставления. |
| C6 | Control Plane DB | Publisher worker | SQL (PostgreSQL) | Забрать (claim) опубликованную ревизию. |
| C7 | Publisher worker | OCI artifact registry | OCI | Публикация неизменяемого артефакта. |
| C8 | Reconcilers | Kubernetes | Kubernetes API | Применение desired state ресурсов. |
| C9 | Publisher worker | Kubernetes | Kubernetes API | Развёртывание workload'а агента. |
| C10 | Kubernetes | Low-code Runtime | Kubernetes API | Запуск и управление runtime-контейнером. |
| C11 | Kubernetes | Registry Kubernetes Reconciler | Kubernetes API | Read-only наблюдение (LIST/WATCH). |
| C12 | Registry Kubernetes Reconciler | Registry PostgreSQL | SQL (PostgreSQL) | Запись проекции каталога. |
| C13 | Registry API | Registry PostgreSQL | SQL (PostgreSQL) | Чтение данных каталога. |
| C14 | Registry PostgreSQL | Outbox Relay | SQL (PostgreSQL) | Чтение событий из outbox-таблицы. |
| C15 | Outbox Relay | Redpanda | Kafka-совместимый протокол | Публикация событий в шину. |
| C16 | Redpanda | Search Indexer | Kafka-совместимый протокол | Получение событий для индексации. |
| C17 | Registry PostgreSQL | Search Indexer | SQL (PostgreSQL) | Чтение данных для формирования индекса. |
| C18 | Search Indexer | OpenSearch | HTTP (REST) | Запись записей в индекс. |
| C19 | Registry API | OpenSearch | HTTP (REST) | Выполнение поиска. |
| C20 | Registry API | Authzed / SpiceDB | gRPC (SpiceDB API) | Проверка прав доступа (permissions). |
| C21 | Platform IdP | Агентский шлюз | OIDC | Выпуск и проверка access-токенов. |
| C22 | Агентский шлюз | Low-code Runtime | HTTP (A2A/MCP) | Передача запроса в исполняющий агент. |
| C23 | Low-code Runtime | LLM Gateway | HTTP (REST) | Вызов модели с ключом агента. |
| C24 | Low-code Конструктор | RAG API | HTTP (REST) | Извлечение знаний при проектировании flow. |
| C25 | Low-code Конструктор | Memory API | HTTP (REST) | Работа с памятью при проектировании flow. |
| C26 | Low-code Runtime | RAG API | HTTP (REST) | Извлечение знаний при исполнении агента. |
| C27 | Low-code Runtime | Memory API | HTTP (REST) | Работа с памятью при исполнении агента. |
| C28 | RAG API | RAG Worker | асинхронная очередь | Передача задач извлечения на асинхронную обработку. |
| C29 | Memory API | Memory Worker | асинхронная очередь | Передача задач записи памяти на асинхронную обработку. |
| C30 | Control Plane API | Guardrails Runtime | HTTP (REST) | Доставка неизменяемого набора политик и привязка политики к модели. |
| C31 | LLM Gateway (Agentgateway) | Guardrails Runtime | HTTP (REST) | Проверка запроса (/request) и ответа (/response) модели через webhook promptGuard. |
| C32 | RAG API | Guardrails Runtime | HTTP (REST) | Прямая проверка текста перед индексацией (request) и выдачей (response). |
| C33 | Memory API | Guardrails Runtime | HTTP (REST) | Прямая проверка диалога/фактов перед записью (request) и выдачей (response). |
| C34 | Guardrails Runtime | Одобренный провайдер / LLM-классификатор | HTTPS (REST) | Вызов внешнего детектора (external_pipeline) и LLM-классификатора; TLS, без редиректов. |
4. Информационная архитектура
4.1. Диаграмма информационных потоков
Диаграмма отражает потоки данных и событий между компонентами платформы. Потоки классифицированы по типам: HTTP/API, OIDC/JWT, Message Queue, Event Stream, File/Artifact, Observation.

4.2. Таблица информационных потоков
| № | Откуда | Куда | Тип потока | Протокол | Описание |
|---|---|---|---|---|---|
| F1 | Пользователь (Low-code IDE) | Агентский шлюз (A2A invocation) | HTTP | HTTPS | Вход в Low-code IDE, аутентификация через SSO |
| F2 | Пользователь (Каталог) | Агентский шлюз (A2A invocation) | HTTP | HTTPS | Запросы к каталогу агентов: GET /agent-registry, POST /search |
| F3 | Потребитель агента | Агентский шлюз (A2A invocation) | HTTP | HTTPS | Вызов агента: POST /a2a/... (A2A/JSON, SSE streaming) |
| F4 | Агентский шлюз (A2A invocation) | Keycloak | HTTP | HTTPS | OIDC-эндпоинты: /.well-known/openid-configuration, /token, /realms/... |
| F5 | Пользователи | Keycloak | OIDC | HTTPS | Аутентификация: Authorization Code Flow (PKCE), Resource Owner Password Credentials |
| F6 | Keycloak | Пользователи | JWT | JSON | Access Token / ID Token / Refresh Token (Bearer) |
| F7 | Агентский шлюз (A2A invocation) | Agent Registry API | HTTP | HTTP(S) | REST API: /api/v1/agents, /api/v1/agents/search, /health |
| F8 | Agent Registry API | PostgreSQL | SQL CRUD | asyncpg | CRUD метаданных агентов, версий, workspace-контекста; транзакционная блокировка |
| F9 | Agent Registry API | SpiceDB | AuthZ | gRPC / HTTP | Рекурсивная проверка прав (ReBAC): agent#view, agent#invoke, agent#manage |
| F10 | Agent Registry API | OpenSearch | HTTP | HTTP(S) | Поиск агентов: семантическое + лексическое совпадение, фильтрация по правам |
| F11 | Agent Registry API | Redpanda | Event Stream | Kafka protocol | Event-driven интеграции: Outbox-паттерн, события создания/обновления/удаления агентов |
| F12 | Kubernetes Reconciler | K8s API | Watch | Kubernetes API | Наблюдение за Service, EndpointSlice, HTTPRoute; периодический full resync (>300 с) |
| F13 | Outbox Relay | Redpanda | Event Relay | Kafka protocol | Публикация зафиксированных событий из PostgreSQL в Redpanda; retry + DLQ |
| F14 | Search Indexer | OpenSearch | HTTP | HTTP(S) | Индексация документов агентов; создание нового поколения индекса; переключение псевдонима |
| F15 | Search Indexer | SpiceDB | HTTP | HTTP(S) | Обновление разрешений в SpiceDB по событиям; cleanup при потере EndpointSlice |
| F16 | Автор Low-code агента | Low-code Конструктор | HTTP | HTTPS | Визуальное редактирование Потока: создание, сохранение, проверка схемы |
| F17 | Low-code Конструктор | Keycloak | SSO / OIDC | HTTPS | Единый вход: login → callback → token refresh → logout; Web Origin валидация |
| F18 | Low-code Конструктор | Low-code Runtime | File / Artifact | HTTPS / Storage | Передача артефактов: source.json (Поток, SHA-256), manifest.json (platform.low-code.publish-manifest/v1) |
| F19 | Low-code Runtime | Kubernetes | K8s Resource | Kubernetes API | Публикация Service с регистрационными метками (registrable: true, protocol: a2a, workspace, agent-name, version) |
| F20 | Kubernetes API | Agent Registry API | Auto-discovery | Kubernetes API | Reconciler обнаруживает Service, проверяет метки, ждёт EndpointSlice, загружает agent-card.json |
| F21 | Low-code Runtime | Агентский шлюз (A2A invocation) | HTTP | HTTPS | A2A 1.0 вызовы: POST /message, POST /message:stream (SSE); MCP интерфейсы |
| F22 | Low-code Runtime | AI Gateway | HTTP | HTTPS | Вызов LLM и эмбеддинга: /v1/chat/completions, /v1/embeddings |
| F23 | Low-code Runtime | SpiceDB | AuthZ | gRPC / HTTP | Проверка прав до Guardrails и FileRef; fail-closed при недоступности |
| F24 | Агентский шлюз (A2A invocation) | Low-code Конструктор (Frontend) | HTTP | HTTPS | Маршрутизация к визуальному редактору: GET /ide/* |
| F25 | Low-code Конструктор (Backend) | Keycloak | OIDC | HTTPS | Client scope openid profile email, admin role admin |
| F26 | Low-code Конструктор (Backend) | AI Gateway | HTTP | HTTPS | LLM вызовы через LiteLLM |
| F27 | Low-code Конструктор | RAG API | SDK | HTTP(S) | RagClient.query(), RagClient.retrieve_and_pack() — поиск по коллекциям, упаковка контекста |
| F28 | Low-code Runtime | RAG API | SDK | HTTP(S) | RagClient.query(), RagClient.retrieve_and_pack() — агент извлекает контекст перед ответом |
| F29 | RAG API | PostgreSQL | SQL CRUD | asyncpg | Реестр коллекций, job store (ingest_job), история операций; схема platform_rag |
| F30 | RAG API | RabbitMQ | AMQP | AMQP 0-9-1 | Уведомления о заданиях ingest: exchange rag.ingest, queue rag.ingest.jobs, DLX/DLQ |
| F31 | RAG API | OpenSearch | HTTP | HTTP(S) | Гибридный поиск: kNN (vector) + BM25 (text), слияние RRF, фильтрация по tenant_id + ACL |
| F32 | RAG API | AI Gateway | HTTP | HTTPS | Эмбеддинг запросов и реранк: bge-m3, text-default-v1, rerank-default-v1 |
| F33 | RAG API | SpiceDB | AuthZ | gRPC | Права на коллекцию: collection.owner, collection.reader, collection.writer; fail-closed |
| F34 | RAG Worker | RabbitMQ | AMQP | AMQP 0-9-1 | Claim заданий: PENDING → RUNNING; prefetch=16, delivery_limit=5 |
| F35 | RAG Worker | OpenSearch | HTTP | HTTP(S) | Bulk-индексация чанков: embedding (kNN), text (BM25), tenant_id, acl, version |
| F36 | RAG Worker | AI Gateway | HTTP | HTTPS | Эмбеддинг документов: bge-m3, dimension=1024, normalize=true |
| F37 | RAG Worker | S3 / MinIO | HTTP | HTTPS | Staging канонического JSON: payload_uri, content_hash, idempotency_key |
| F38 | Low-code Конструктор | Memory API | SDK | HTTP(S) | MemoryClient.add(), MemoryClient.search(), MemoryClient.get_all(), MemoryClient.delete() |
| F39 | Low-code Runtime | Memory API | SDK | HTTP(S) | MemoryClient.add(), MemoryClient.search() — агент запоминает и извлекает факты |
| F40 | Memory API | PostgreSQL | SQL CRUD | asyncpg | Event store (memory_event), история изменений записей; схема platform_memory |
| F41 | Memory API | RabbitMQ | AMQP | AMQP 0-9-1 | Уведомления о заданиях add: exchange memory.add, queue memory.add.jobs, DLX/DLQ |
| F42 | Memory API | OpenSearch | HTTP | HTTP(S) | Гибридный поиск фактов: kNN (vector) + BM25 (text), фильтрация по скоупу (user_id, agent_id, run_id) |
| F43 | Memory API | AI Gateway | HTTP | HTTPS | Эмбеддинг запросов: bge-m3, dimension=1024 |
| F44 | Memory Worker | RabbitMQ | AMQP | AMQP 0-9-1 | Claim заданий: PENDING → RUNNING; concurrency=4 (worker.concurrency) |
| F45 | Memory Worker | OpenSearch | HTTP | HTTP(S) | Индексация фактов: текст + вектор; алиас mem-facts-<env> |
| F46 | Memory Worker | AI Gateway | HTTP | HTTPS | LLM-извлечение фактов: infer: true через AI Gateway; дедупликация по mem0 |
| F47 | Agent Registry API | Fixtures | Auto-discovery | Kubernetes API | Обнаружение Smoke Agent (sdk-smoke-v1) и Low-code Fixture (lowcode-linguist-v1) через Service метки |
| F48 | Администратор / cpctl | API-шлюз платформы (management/discovery) | HTTP | HTTPS | Management-запросы Control Plane: GET /control-plane/api/v1/*, POST /control-plane/api/v1/*; OIDC Bearer, Idempotency-Key |
| F49 | Low-code Конструктор | API-шлюз платформы (management/discovery) | HTTP | HTTPS | Публикация low-code агента: POST /control-plane/api/v1/agents с LowCodeSource (uri S3/OCI + sourceSha256) |
| F50 | API-шлюз платформы (management/discovery) | Control Plane API | HTTP | HTTP(S) | Маршрутизация под prefix /control-plane; OIDC/аудит; не владеет бизнес-логикой |
| F51 | Control Plane API | PostgreSQL | SQL CRUD | asyncpg | Desired state, идентичности, операции, аудит; схема control_plane; application-encrypted значения |
| F52 | Control Plane API | SpiceDB | AuthZ | gRPC | Прямые функциональные права control_plane#publish/#administer/#observe, agent#view/#manage/#diagnose; fail-closed |
| F53 | Control Plane API | Temporal | gRPC | gRPC | Запуск durable Operation: одна операция = одна конечная Workflow; порядок, таймеры, retry/cancel |
| F54 | Model/Key reconciler (CP) | Kubernetes API | K8s Resource | Kubernetes API | Render/apply Tier/Provider/Model и шардов политик ключей; derived immutable Secrets; read-only верификация |
| F55 | Publisher worker (CP) | Kubernetes API | K8s Resource | Kubernetes API | Создание allowlisted workload, Service, HTTPRoute, AgentgatewayPolicy; dedicated Publisher ServiceAccount |
| F56 | Publisher worker (CP) | AI Gateway / LLM Gateway | HTTP | HTTPS | Верификация кандидатского virtual key (accept/reject probe) в фазе публикации |
| F57 | Publisher worker (CP) | Agent Registry | Read-only | HTTP(S) | Наблюдение фидбэка candidate_validated/withheld и agent.active.v2; запись в Registry не выполняется |
| F58 | Publisher worker (CP) | Object Storage | File / Artifact | S3/OCI | Чтение low-code артефакта по uri для гейта artifactIntegrity; проверка соответствия sourceSha256 |
| F59 | Key reconciler (CP) | AI Gateway / LLM Gateway | HTTP | HTTPS | Верификация selected-revision выданных виртуальных ключей (Gateway probe); жизненный цикл Agent secret |
| F60 | Control Plane API | Guardrails Runtime | HTTP | HTTPS | Доставка неизменяемого набора политик и привязка политики к модели; Runtime загружает набор при старте, hot-reload отсутствует |
| F61 | AI Gateway (Agentgateway) | Guardrails Runtime | HTTP | HTTPS | Webhook promptGuard: проверка запроса модели (/request) до отправки; failureMode: FailClosed; политика задаётся заголовками (policy-id, revision, bundle-digest, content-profile) |
| F62 | Guardrails Runtime | AI Gateway (Agentgateway) | HTTP | HTTPS | Проверка ответа модели (/response) перед возвратом клиенту; вердикт pass / deny / mask |
| F63 | RAG API | Guardrails Runtime | HTTP | HTTPS | Прямая проверка текста перед индексацией (/request) и выдачей (/response) |
| F64 | Memory API | Guardrails Runtime | HTTP | HTTPS | Прямая проверка диалога/фактов перед записью (/request) и выдачей (/response) |
| F65 | Guardrails Runtime | Одобренный детектор / LLM-классификатор | HTTPS | HTTPS | Правила external_pipeline (протокол detector/v1, всегда deny) и llm_classifier (вердикт allow/deny/uncertain); TLS, без редиректов |
4.3. Классификация потоков
| Тип | Протоколы | Примеры | Характер |
|---|---|---|---|
| HTTP / REST | HTTPS, HTTP(S) | F1, F2, F3, F7, F10, F21, F24, F31, F42, F48, F49, F50, F57, F60, F61, F62, F63, F64, F65 | Синхронный запрос-ответ |
| OIDC / JWT | HTTPS, Bearer Token | F5, F6, F17, F25, F48 | Аутентификация и авторизация |
| SQL / CRUD | asyncpg | F8, F29, F40, F51 | Транзакционная работа с БД |
| AMQP / Queue | AMQP 0-9-1 | F30, F34, F41, F44 | Асинхронная обработка заданий |
| Event Stream | Kafka protocol | F11, F13 | Event-driven интеграции |
| AuthZ / ACL | gRPC, HTTP | F9, F15, F23, F33, F52 | Рекурсивная проверка прав |
| Vector Search | HTTP (kNN+BM25) | F10, F31, F42 | Гибридный поиск с RRF |
| Artifact Transfer | HTTPS, Storage | F18, F58 | Передача/чтение source.json + manifest.json (F58 — чтение low-code артефакта Publisher worker) |
| K8s Watch / Resource | Kubernetes API | F12, F19, F20, F54, F55 | Наблюдение и application |
| LLM / Embedding | HTTPS (OpenAI-compatible) | F22, F26, F32, F36, F43, F46, F56, F59 | Вызов моделей и верификация ключей через AI Gateway |
| Durable Workflow | gRPC (Temporal) | F53 | Устойчивые операции управления (Control Plane) |
| Guardrails Check | HTTPS | F61, F62, F63, F64, F65 | Проверка текста: вердикт pass / deny / mask; доставка политик (F60) — разовая, не на каждый запрос |
5. Техническая архитектура
5.1. Сетевое взаимодействие
| № | Инициатор | Сегмент инициатора | Получатель | Сегмент получателя | Порт и протокол | Межсетевой экран | Описание |
|---|---|---|---|---|---|---|---|
| 1 | Пользователь / AES / Control Plane | Нет данных | Registry API через Gateway | Нет данных | HTTPS/TLS, TCP-порт — нет данных | GET/LIST/SEARCH, OIDC/delegation, ограничение размера и частоты | |
| 2 | Пользователь / AES | Нет данных | Platform Agent Gateway | Нет данных | HTTPS/TLS, A2A HTTP+JSON или MCP Streamable HTTP; TCP-порт — нет данных | Единственная целевая публичная граница вызова | |
| 3 | Platform Agent Gateway | Нет данных | Адаптер авторизации вызова | Нет данных | Протокол extAuth и TCP-порт — нет данных | Передаёт проверенную идентичность и привязанный к маршруту AgentVersion | |
| 4 | Адаптер авторизации / Registry API | Нет данных | SpiceDB | Нет данных | Authzed API; транспорт и TCP-порт — нет данных | Актуальные проверки view, invoke, diagnose, manage | |
| 5 | Platform Agent Gateway | Нет данных | A2A/MCP Runtime | Нет данных | A2A HTTP+JSON или MCP Streamable HTTP поверх принятого mTLS-профиля; TCP-порт — нет данных | Передаётся краткоживущая идентичность, привязанная к цели | |
| 6 | Registry API / Reconciler / Relay / Indexer | Нет данных | PostgreSQL | Нет данных | Протокол PostgreSQL; TCP-порт — нет данных | Каноническое состояние каталога, аудит, outbox и задания | |
| 7 | Registry API / Indexer / Reindex | Нет данных | OpenSearch | Нет данных | Протокол и TCP-порт — нет данных | Поиск и запись пересоздаваемой проекции | |
| 8 | Reconciler | Нет данных | Kubernetes API | Нет данных | Native Kubernetes API TLS; TCP-порт — нет данных | get/list/watch Service и EndpointSlice, отдельное чтение HTTPRoute | |
| 9 | Reconciler | Нет данных | Рабочая нагрузка A2A/MCP | Нет данных | HTTP для Agent Card; MCP Streamable HTTP; TCP-порт выбирается из проверенного Service | Получение только ограниченного описания протокола | |
| 10 | Outbox Relay | Нет данных | Redpanda | Нет данных | Kafka-совместимый протокол, mTLS либо SCRAM+TLS; TCP-порт — нет данных | Публикация CloudEvents, acks=all в промышленном профиле | |
| 11 | Search Indexer / Reindex | Нет данных | Redpanda | Нет данных | Kafka-совместимый протокол; TCP-порт — нет данных | Чтение изменений независимыми группами/позициями | |
| 12 | Registry API / Search Indexer / Reindex | Нет данных | AI Gateway | Нет данных | Протокол и TCP-порт — нет данных | Эмбеддинги запроса и описаний агента | |
| 13 | Low-code Runtime | Нет данных | Object Storage | Нет данных | S3-совместимый либо OCI-профиль; транспорт и TCP-порт — нет данных | Загрузка неизменяемого Потока и манифеста | |
| 14 | Low-code Runtime | Нет данных | Vault | Нет данных | Протокол и TCP-порт — нет данных | Получение секретов без записи в Поток | |
| 15 | Low-code Runtime | Нет данных | AI Gateway / Guardrails | Нет данных | HTTP/типизированный клиент; TCP-порт — нет данных | Вызов модели и обязательные проверки | |
| 16 | Low-code Runtime | Нет данных | RAG Service / Memory Service | Нет данных | Нет данных | Связь целевая и отложена; в поставке 11.08 отсутствует | |
| 17 | Компоненты платформы | Нет данных | OTel-коллектор | Нет данных | OTLP; транспорт и TCP-порт — нет данных | Экспорт метрик и трасс без чувствительных данных | |
| 18 | Low-code Runtime | Нет данных | RAG API | Нет данных | HTTP/HTTPS, порт 8090; TCP-порт — нет данных | Вызов RAG API: POST /v1/documents:submit, POST /v1/query, POST /v1/collections (отложено до R2; в 11.08 запрещено) | |
| 19 | Worker / Search Indexer | Нет данных | AI Gateway | Нет данных | Протокол и TCP-порт — нет данных | Эмбеддинг документов (worker) и описаний агентов (Search Indexer) через AI Gateway; профили задаются конфигурацией | |
| 20 | Worker | Нет данных | RabbitMQ | Нет данных | AMQP; TCP-порт — нет данных | Подписка на exchange rag.ingest, очередь rag.ingest.jobs, DLX/DLQ для повторной доставки | |
| 21 | Worker | Нет данных | OpenSearch | Нет данных | Протокол и TCP-порт — нет данных | Bulk-индексация чанков в индекс rag-kb-{env}; mapping: knn_vector (BGE-M3, 1024 dim) + BM25 | |
| 22 | Worker / API | Нет данных | S3 / MinIO | Нет данных | S3-совместимый протокол; TCP-порт — нет данных | Staging канонического JSON (payload_uri) на время ingest-задания; в локальном Compose допускается s3.dry_run: true | |
| 23 | API / Worker | Нет данных | PostgreSQL | Нет данных | Протокол PostgreSQL; TCP-порт — нет данных | Реестр коллекций, job store platform_rag.ingest_job (источник истины), миграции схемы | |
| 24 | API | Нет данных | SpiceDB | Нет данных | gRPC; TCP-порт — нет данных | Проверка прав на коллекцию: read/write/owner; fail-closed при недоступности (503) | |
| 25 | API | Нет данных | OpenSearch | Нет данных | Протокол и TCP-порт — нет данных | Гибридный поиск (kNN + BM25) со слиянием RRF, фильтрация по tenant_id и ACL | |
| 26 | Memory API / Consumer | Нет данных | Memory API | Нет данных | HTTP/HTTPS, порт 8091; TCP-порт — нет данных | Вызов Memory API: POST /v1/memories, POST /v1/memories/search, GET /v1/memories, DELETE /v1/memories, GET /v1/events/{id}, /health (заголовки X-Workspace-Id, X-User-Id) | |
| 27 | Memory API | Нет данных | PostgreSQL | Нет данных | Протокол PostgreSQL; TCP-порт — нет данных | Event store platform_memory.memory_event, история записей, schema platform_memory | |
| 28 | Memory API | Нет данных | RabbitMQ | Нет данных | AMQP; TCP-порт — нет данных | Публикация уведомлений: exchange memory.add, очередь memory.add.jobs, DLX memory.add.dlx, DLQ memory.add.dlq | |
| 29 | Memory API | Нет данных | AI Gateway | Нет данных | Протокол и TCP-порт — нет данных | Эмбеддинг запросов (search) и LLM-извлечение (infer: true) | |
| 30 | Memory Worker | Нет данных | RabbitMQ | Нет данных | AMQP; TCP-порт — нет данных | Подписка на memory.add.jobs, claim события; DLQ memory.add.dlq после delivery_limit неудач | |
| 31 | Memory Worker | Нет данных | AI Gateway | Нет данных | Протокол и TCP-порт — нет данных | LLM-извлечение фактов (при infer: true) и эмбеддинг | |
| 32 | Memory Worker / API | Нет данных | OpenSearch | Нет данных | Протокол и TCP-порт — нет данных | Гибридный поиск (kNN + BM25) и индексация фактов в алиас mem-facts-{env}; размерность 1024 | |
| 33 | Memory Worker | Нет данных | PostgreSQL | Нет данных | Протокол PostgreSQL; TCP-порт — нет данных | Обновление статуса события (RUNNING → SUCCEEDED/FAILED), запись истории ADD/UPDATE/DELETE | |
| 34 | Администратор / cpctl / Конструктор | Нет данных | Platform API Gateway (api-gw) | Нет данных | HTTPS/TLS; TCP-порт — нет данных | Management-запросы Control Plane под prefix /control-plane/api/v1; OIDC Bearer, Idempotency-Key | |
| 35 | Platform API Gateway (api-gw) | Нет данных | Control Plane API | Нет данных | HTTP/HTTPS; TCP-порт — нет данных | Маршрутизация под prefix /control-plane; общий транспорт/аутентификация; бизнес-логика не выполняется в шлюзе | |
| 36 | Control Plane API | Нет данных | PostgreSQL | Нет данных | Протокол PostgreSQL; TCP-порт — нет данных | Desired state, идентичности, операции, аудит, application-encrypted значения; схема control_plane | |
| 37 | Control Plane API | Нет данных | SpiceDB | Нет данных | gRPC; TCP-порт — нет данных | Прямые функциональные права control_plane#publish/#administer/#observe, agent#view/#manage/#diagnose; fail-closed при недоступности (503) | |
| 38 | Control Plane API | Нет данных | Temporal | Нет данных | gRPC; TCP-порт — нет данных | Запуск durable Operation: порядок Workflow, таймеры, retry/cancel; одна операция = одна конечная Workflow | |
| 39 | Model/Key reconciler (CP) | Нет данных | Kubernetes API | Нет данных | Native Kubernetes API TLS; TCP-порт — нет данных | Render/apply Tier/Provider/Model и шардов политик ключей; derived immutable Secrets; dedicated ServiceAccount, least-privilege RBAC | |
| 40 | Publisher worker (CP) | Нет данных | Kubernetes API | Нет данных | Native Kubernetes API TLS; TCP-порт — нет данных | Создание allowlisted workload, Service, HTTPRoute, AgentgatewayPolicy; dedicated Publisher ServiceAccount; fail-closed admission | |
| 41 | Publisher worker (CP) | Нет данных | AI Gateway / Agent Registry | Нет данных | HTTP/HTTPS; TCP-порт — нет данных | Верификация кандидатского virtual key (accept/reject probe) в фазе публикации; read-only наблюдение фидбэка Registry candidate_validated/withheld/agent.active.v2 | |
| 42 | Publisher worker (CP) | Нет данных | Object Storage | Нет данных | S3-совместимый либо OCI-профиль; TCP-порт — нет данных | Чтение low-code артефакта по uri для гейта artifactIntegrity; проверка соответствия sourceSha256 | |
| 43 | Key reconciler (CP) | Нет данных | AI Gateway / LLM Gateway | Нет данных | HTTP/HTTPS; TCP-порт — нет данных | Верификация selected-revision выданных виртуальных ключей (Gateway probe); жизненный цикл Agent secret | |
| 44 | Control Plane API | Нет данных | Guardrails Runtime | Нет данных | HTTP/HTTPS; TCP-порт — нет данных | Доставка неизменяемого набора политик (bundle, bundleDigest), привязка политики к модели; content-profile agentgateway-1.5.0-text-webhook-v1 | |
| 45 | LLM Gateway (Agentgateway) | Нет данных | Guardrails Runtime | Нет данных | HTTP/HTTPS; TCP-порт — нет данных | Проверка запроса модели POST /request (webhook promptGuard, failureMode: FailClosed); заголовки x-ap-gr-*, сервисный токен | |
| 46 | Guardrails Runtime | Нет данных | LLM Gateway (Agentgateway) | Нет данных | HTTP/HTTPS; TCP-порт — нет данных | Проверка ответа модели POST /response; вердикт pass/deny/mask, маска применяется к тексту целиком | |
| 47 | RAG/Memory-адаптер | Нет данных | Guardrails Runtime | Нет данных | HTTP/HTTPS; TCP-порт — нет данных | Прямая проверка текста перед индексацией/записью (request) и выдачей (response); решение применяет вызывающий сервис | |
| 48 | Guardrails Runtime | Нет данных | Одобренный провайдер/классификатор | Нет данных | HTTPS; TCP-порт — нет данных | Вызов внешнего детектора (detector/v1) и LLM-классификатора; проверка TLS, без редиректов, согласованный прямой адрес |
5.2. Инфраструктурные сервисы
| № | Сервис | Назначение | Подтверждённый профиль |
|---|---|---|---|
| 1 | Kubernetes | Развёртывание Runtime, наблюдение Service/EndpointSlice, маршруты HTTPRoute и выбор ведущего Registry Reconciler | Промышленная базовая версия v1.36.2; поддерживаемый диапазон Registry >=1.27; один кластер, до 100 пространств имён |
| 2 | PostgreSQL | Канонический каталог Registry, наблюдения, аудит, outbox, фазы и задания | 18.4.0; промышленный внешний управляемый PostgreSQL >=18; резервные копии/PITR 35 дней |
| 3 | OpenSearch | Гибридный поиск и пересоздаваемая векторная проекция | 3.7.0; BGE-M3, 1024 измерения, HNSW/cosine |
| 4 | RAG Service (Platform RAG) | Реестр коллекций, приём документов (ingest), гибридный поиск с ACL-фильтрацией, статус заданий; HTTP API порт 8090, внешние зависимости: PostgreSQL, RabbitMQ, OpenSearch, S3/MinIO, AI Gateway, SpiceDB | platform-rag-api (port 8090) + platform-rag-worker; Helm chart helm/platform-rag; PostgreSQL platform_rag схема; OpenSearch алиас rag-kb-{env}; AI Gateway для эмбеддинга/реранка; SpiceDB для прав на коллекции и ACL документов; S3 для staging канонических документов |
| 5 | Memory Service (Platform Memory) | Единый управляемый слой памяти платформы; async add через RabbitMQ, гибридный поиск памяти в OpenSearch, event store и история в PostgreSQL; HTTP API порт 8091, внешние зависимости: PostgreSQL, RabbitMQ, OpenSearch, AI Gateway | platform-memory-api (port 8091) + platform-memory-worker; Helm chart helm/platform-memory; PostgreSQL platform_memory схема; OpenSearch алиас mem-facts-{env}; RabbitMQ exchange memory.add, queue memory.add.jobs; AI Gateway для эмбеддинга и LLM-извлечения; публичный контракт совместим с mem0 |
| 6 | SpiceDB | Решения авторизации и отношения | v1.54.0, fully_consistent для защищённых проверок |
| 6 | Redpanda Community | Надёжный поток изменений каталога | Broker v26.1.13, chart 26.1.9; 3 раздела, replication factor 3, min.insync.replicas=2, хранение 14 дней |
| 7 | AI Gateway | Эмбеддинги Registry и вызовы PlatformLLM | Для поиска принят псевдоним agent-platform.agent-registry.embedding.bge-m3-v1 |
| 8 | Object Storage | Неизменяемые flow и манифесты по хешу | Шифрование при хранении, запрет перезаписи, S3- и дополнительный OCI-профиль |
| 9 | Vault | Секреты Runtime и привязка идентичности рабочей нагрузки | Секреты не включаются во flow/журналы |
| 10 | OTel-коллектор / платформа наблюдаемости | Метрики и распределённая трассировка | W3C Trace Context, OpenTelemetry/OTLP |
| 11 | Temporal | Порядок Workflow, таймеры, retry/cancellation, история выполнения; восстановление после сбоя без потери операций; одна конечная Workflow = одна асинхронная Operation | Версия не зафиксирована — нет данных; namespace control-plane |
| 12 | Guardrails Runtime | Stateless-процесс проверки входных/выходных текстов: POST /request, POST /response, GET /readyz, GET /metrics; загружает неизменяемый набор политик при старте, выдаёт pass/deny/mask; fail-closed; внешние вызовы — одобренный детектор/классификатор | agent-platform.guardrail-runtime.bundle/v1; API проверки 0.1.0; Python; один входящий сервисный токен; без внутренней очереди (queueSize: 0), при превышении maxConcurrency — 503 overloaded; без hot-reload и встроенного журнала решений |
5.3. Аппаратная часть
5.3.1. Серверы и параметры
Примечание: раздел не применяется — все компоненты решения развертываются в кластере Kubernetes. Отдельные серверы и ВМ не требуются.
5.3.2. Платформа контейнеризации
| № | Контур | Платформа | Ядра CPU | ОЗУ (Гб) |
|---|---|---|---|---|
| 1 | QA | Kubernetes 1.36.x (shared ai-dev) | 2–4 | 4–8 |
| 2 | RC | Kubernetes 1.36.x (shared ai-dev) | 2–4 | 4–8 |
| 3 | UAT | Kubernetes 1.36.x | в зависимости от ожидаемой нагрузки | в зависимости от ожидаемой нагрузки |
| 4 | PreProd | Kubernetes 1.36.x | в зависимости от ожидаемой нагрузки | в зависимости от ожидаемой нагрузки |
| 5 | Prod | Kubernetes 1.36.x | в зависимости от ожидаемой нагрузки | в зависимости от ожидаемой нагрузки |
5.4. Системное и прикладное программное обеспечение
| № | ПО | Версия | Комментарий |
|---|---|---|---|
| 1 | Python | ~=3.14.0 | Язык исполнения low-code Runtime |
| 2 | lfx | 1.11.1 | Ядро исполнения потоков; pinned by digest (форк LangFlow — источник исходного кода) |
| 3 | OpenTelemetry / OTLP | latest pinned | Трассировка и наблюдаемость |
| 4 | OIDC Core | 1.0 + errata | Аутентификация |
| 5 | agentgateway | 1.3.1 | Платформенный шлюз агентов |
| 6 | Gateway API | 1.5.0 | Kubernetes Gateway API |
| 7 | BGE-M3 | — | Модель эмбеддингов (1024 dim) |
| 8 | cpctl | нет данных | Тонкий CLI-клиент Control Plane API (Go, static binary); не обращается к БД, Kubernetes и worker-очерям напрямую |
| 9 | Temporal | нет данных | Оркестрация durable-операций Control Plane; namespace control-plane |
5.5. Лицензирование ПО
5.5.1. Python-зависимости (Agent Registry, Control Plane)
| Компонент | Лицензионная политика | Примечание |
|---|---|---|
| aiokafka | Apache-2.0 | Клиент Kafka (asynchronous) |
| alembic | MIT | Миграции БД |
| asyncpg | Apache-2.0 | Асинхронный драйвер PostgreSQL |
| cryptography | Apache-2.0 / BSD-3-Clause | Криптография (двойная лицензия) |
| fastapi | MIT | HTTP-фреймворк |
| httpx | BSD-3-Clause | HTTP-клиент |
| jsonschema | MIT | Проверка схем |
| kubernetes-asyncio | Apache-2.0 | Клиент Kubernetes (asynchronous) |
| opentelemetry-exporter-otlp-proto-grpc | Apache-2.0 | Экспорт телеметрии OTLP |
| opentelemetry-instrumentation-fastapi | Apache-2.0 | Инструментация FastAPI |
| opentelemetry-instrumentation-httpx | Apache-2.0 | Инструментация httpx |
| opentelemetry-sdk | Apache-2.0 | SDK OpenTelemetry |
| pydantic-settings | MIT | Настройки |
| pyjwt | MIT | JWT-токены |
| prometheus-client | Apache-2.0 | Метрики Prometheus |
| sqlmodel | MIT | ORM поверх SQLAlchemy |
| uvicorn | BSD-3-Clause | ASGI-сервер |
| temporalio | MIT | SDK Temporal |
5.5.2. Python-зависимости (Low-code Runtime)
| Компонент | Лицензионная политика | Примечание |
|---|---|---|
| a2a-sdk | Apache-2.0 | A2A-протокол (server-side) |
| lfx | MIT | Исполнитель потока Low-code Конструктора; код происходит из исходников Langflow, используется как библиотека |
| mcp | MIT | MCP SDK (Streamable HTTP) |
| langchain-openai | MIT | OpenAI-интеграция LangChain |
| python-docx | MIT | Чтение .docx |
| jq | MIT | Язык запросов JQ |
| starlette | BSD-3-Clause | ASGI-фреймворк |
| uvicorn[standard] | BSD-3-Clause | ASGI-сервер |
| pydantic-settings | MIT | Настройки |
| python-dotenv | BSD-3-Clause | Загрузка .env |
| httpx | BSD-3-Clause | HTTP-клиент |
5.5.3. Frontend (Control Plane UI)
| Компонент | Лицензионная политика | Примечание |
|---|---|---|
| @radix-ui/* (react-avatar, react-dialog, react-dropdown-menu, react-label, react-select, react-separator, react-slot, react-switch, react-tooltip) | MIT | UI-примитивы |
| @tanstack/react-query | MIT | Кэширование запросов |
| class-variance-authority | MIT | Варианты классов |
| clsx | MIT | Конкатенация классов |
| lucide-react | ISC | Иконки |
| oidc-client-ts | MIT | OIDC-клиент |
| react, react-dom | MIT | React |
| react-hook-form | MIT | Формы |
| react-router-dom | MIT | Маршрутизация |
| sonner | MIT | Уведомления |
| tailwind-merge | MIT | Слияние Tailwind-классов |
| zod | MIT | Схема валидации |
| @tailwindcss/vite, tailwindcss | MIT | CSS-фреймворк (dev) |
| @vitejs/plugin-react, vite | MIT | Сборщик (dev) |
| typescript, @types/node, @types/react, @types/react-dom | Apache-2.0 / MIT | Типизация (dev) |
5.5.4. Документация (team-docs, внутренний сайт)
| Компонент | Лицензионная политика | Примечание |
|---|---|---|
| fumadocs-core, fumadocs-mdx, fumadocs-ui | MIT | Фреймворк документации |
| @tanstack/react-router, @tanstack/react-start | MIT | Маршрутизация (React Start) |
| @drawio/mcp | Apache-2.0 | Экспорт draw.io-диаграмм |
| @fontsource/ibm-plex-sans | OFL-1.1 (Open Font License) | Шрифт IBM Plex Sans |
| @orama/tokenizers | Apache-2.0 | Токенизация для поиска |
| @orama/orama | Основная библиотека поиска; тип лицензии не определён | |
| beautiful-mermaid | MIT | Рендеринг Mermaid-диаграмм |
| lucide-react | ISC | Иконки |
| react, react-dom, vite | MIT | Базовый стек |
| @biomejs/biome | Apache-2.0 | Линтер/форматтер (dev) |
| @tailwindcss/vite, tailwindcss | MIT | CSS (dev) |
| pdfjs-dist | Apache-2.0 | Рендеринг PDF (dev) |
| puppeteer-core | Apache-2.0 | Экспорт PDF (dev) |
| typescript, @types/* | Apache-2.0 / MIT | Типизация (dev) |
5.5.5. Образы (Dockerfile, базовые)
| Компонент | Лицензионная политика | Примечание |
|---|---|---|
| python:3.14-slim | PSF-2.0 + отдельные условия (Debian) | Базовый образ Python |
| node:22-alpine | MIT (Node.js) + Apache-2.0 (Alpine) | Сборка фронтенда |
| nginxinc/nginx-unprivileged:1.29-alpine | BSD-2-Clause (nginx) + Apache-2.0 (Alpine) | Раздача статического фронта |
| ghcr.io/astral-sh/uv | MIT | Инструмент сборки Python-окружения |
5.5.6. Внешние сервисы и платформы (развертывание, Helm-чарт)
Эти компоненты подключаются как внешние зависимости или развертываются
вместе с платформой. Лицензии приведены по версии, зафиксированной в
charts/agent-platform/values.yaml.
| Компонент | Лицензионная политика | Примечание |
|---|---|---|
| agentgateway (v1.4.1) | Apache-2.0 | LLM/MCP/A2A-шлюз (Linux Foundation) |
| envoyproxy/ratelimit (b8d893f3) | Apache-2.0 | Ограничение скорости (RLS) |
| redpandadata/redpanda (v26.1.13) | BSL-1.1 | Брокер потоков; Community Edition под Business Source License |
| Valkey (ключи/счётчики RLS) | BSD-3-Clause | Хранилище счётчиков, режим Sentinel |
| Keycloak | Apache-2.0 | OIDC-провайдер (внешний) |
| SpiceDB | Apache-2.0 | Система авторизации (внешний) |
| PostgreSQL | PostgreSQL License | Основной БД (внешний, провижинируется средой) |
| OpenSearch | Apache-2.0 | Поиск по каталогу (внешний) |
5.5.7. Go-зависимости (cpctl)
| Компонент | Лицензионная политика | Примечание |
|---|---|---|
| go (1.24.0) | BSD-3-Clause | Язык сборки CLI; внешних Go-библиотек в go.mod нет |
5.6. Мониторинг
Наблюдаемость платформы реализована через OpenTelemetry SDK без sidecar.
| Компонент | Покрытие трассировки | Примечание |
|---|---|---|
| Registry API | API-запросы, get/list/search | Server/application spans |
| Kubernetes Reconciler | Reconciliation loop | Lifecycle phases |
| Platform Agent Gateway | OIDC validation, extAuth→SpiceDB, routing | Transport/application spans |
| Invocation authz adapter | Live SpiceDB agent#invoke | Downstream spans |
| Outbox Relay | Claim/retry/publish | Application spans |
| Search Indexer | Embedding, OpenSearch upsert | Application spans |
| Low-code Agent Pod | Transport → use case → lfx graph → platform nodes | Server/application/downstream spans |
| Control Plane API | Management-запросы (Tier/Provider/Model/ApiKey/agents) | Покрытие spans — нет данных в спецификации Control Plane |
| Control Plane workers | Model/Key reconciler, Publisher worker, Recovery/operator worker | Покрытие spans — нет данных в спецификации Control Plane |
Промпт, вывод, извлечённый текст, память, JWT, содержимое файлов и presigned URL по умолчанию не записываются в telemetry.
5.7. Средства журналирования
| № | Объект | Событие | Формат протокола | Средство хранения | Доступ к журналу | Глубина хранения |
|---|---|---|---|---|---|---|
| 1 | Agent Registry | Регистрация, дерегистрация, деградация, удаление, синхронизация прав | AuditRecord (actor, action, resource, decision, trace_id, timestamp) | Append-only в PostgreSQL | Через agent#diagnose (требуется permission) | По AR-D-18 retention policy |
| 2 | Platform Agent Gateway | Аутентификация, авторизация, маршрутизация | OTel spans + structured log | OpenSearch / centralized logging | Через Trace ID | По AR-D-18 retention policy |
| 3 | Low-code Agent Pod | Старт, readiness, invocation, ошибка ноды | OTel spans + structured log | OpenSearch / centralized logging | Через Trace ID | По AR-D-18 retention policy |
| 4 | Kubernetes Reconciler | Discovery, validation, phase transition | Registry audit + metrics | PostgreSQL audit + Prometheus metrics | Через Registry API | По AR-D-18 retention policy |
| 5 | Control Plane | Изменение Tier/Provider/Model/ApiKey, публикация/откат/скрытие агентов, операции | AuditRecord (actor, action, decision, trace); без секретного payload | Append-only в PostgreSQL, схема control_plane.audit | Через control_plane#observe (требуется permission) | Retention policy — нет данных |
6. Решения по информационной безопасности
6.1. Перечень объектов защиты системы
| № | Объект | Описание |
|---|---|---|
| 1 | Карточки агентов и метаданные | Внутренняя информация: имя, версия, capabilities, endpoint, владелец |
| 2 | Отношения авторизации (SpiceDB) | Конфиденциальная информация: связи principal/service/team ↔ agent |
| 3 | Флоу-артефакты | Внутренняя информация: JSON-поток агента, структура нод |
| 4 | Пользовательские запросы | Ограниченные временные данные: не сохраняются |
| 5 | Bearer-токены (original user JWT) | Ограниченные временные данные: не передаются upstream, не сохраняются |
| 6 | Секреты и учётные данные | Ограниченные временные данные: только через Vault/workload identity |
| 7 | Приватные endpoint workload | Ограниченные временные данные: не публикуются, не сохраняются |
| 8 | Аудит-записи | Конфиденциальная информация: actor, action, resource, decision |
| 9 | Связь кластер–пространство имён | Конфиденциальная информация: deployment configuration |
| 10 | Учётные данные LLM-провайдеров (Control Plane) | Конфиденциальная информация: AES-256-GCM в PostgreSQL, доставка через immutable Kubernetes Secret; сырые креды не покидают зашифрованное хранилище |
| 11 | Виртуальные ключи LLM (Control Plane) | Конфиденциальная информация: в БД только fingerprint (SHA-256); сырой ключ возвращается один раз (oneTimeSecret) и не сохраняется |
| 12 | Ключ шифрования установки (Control Plane) | Конфиденциальная информация: отдельный защищённый Kubernetes Secret; монтируется только в воркерах с правом на учётные данные |
6.2. Перечень и политика хранения журналов аудита
6.2.1. События
| № | Событие | Решение | Код события в логе |
|---|---|---|---|
| 1 | Регистрация агента | agent-registry.created | Успешная валидация Card, commit в PostgreSQL, создание отношений в SpiceDB |
| 2 | Отказ регистрации | agent-registry.rejected | Невалидная Card, identity mismatch, unsupported version |
| 3 | Деградация агента | agent-registry.degraded | Потеря usable endpoint, stale projection |
| 4 | Удаление агента | agent-registry.removed | Удаление Service, scope revoked |
| 5 | Синхронизация прав | agent-registry.permissions_synced / permissions_sync_failed | Result SpiceDB relationship write |
| 6 | Прямой вызов через Gateway | gateway.invocation | Allow / deny / unavailable (typed 401/403/503) |
| 7 | Проверка авторизации поиска | search.authz_check | BulkCheckPermission result per candidate |
| 8 | Управление моделями/ключами (Control Plane) | нет данных в спецификации | Создание/обновление/удаление Tier, Provider, Model, ApiKey; ротация и отзыв ключей; без секретного payload |
| 9 | Публикация агента (Control Plane) | нет данных в спецификации | Публикация/откат/скрытие/повторная валидация; статусы Publication и PublishJob, результат гейтов, trace |
6.2.2. Структура лога
| № | Поля | View log | Правила |
|---|---|---|---|
| 1 | actor/caller | Через Registry API / Trace ID | Safe IDs; JWT и credentials запрещены |
| 2 | action | Через Registry API / Trace ID | create, reject, degrade, remove, sync, invoke |
| 3 | resource | Через Registry API / Trace ID | Непрозрачный UUID, тип ресурса (resource kind) |
| 4 | decision | Через Registry API / Trace ID | allow, deny, unavailable |
| 5 | trace_id | Через OTel / Trace ID | W3C Trace Context |
| 6 | timestamp | Через Registry API | UTC, ISO 8601 |
| 7 | safe metadata | Через Registry API | Environment, time; unbounded external текст запрещён |
7. Ролевая модель и права доступа пользователей
7.1. Пользовательская ролевая структура
Модель основана на отношениях SpiceDB, а не на единственном поле роли в JWT.
Субъектами могут быть principal, service и team#member. Роли рабочего
пространства и конкретного агента назначаются независимо. Право видеть каталог
не даёт права вызывать агента, а владение агентом не даёт права вызова или
полного управления. Приведённые разрешения относятся к принятой схеме
Agent Registry и к модели «ресурс — право» Control Plane; отдельная ролевая
модель Low-code IDE не определена.
7.2. Роли
| № | Роль | Описание доступных действий и полномочий |
|---|---|---|
| 1 | Участник рабочего пространства (workspace#member) | Просмотр каталога своего рабочего пространства; не получает invoke, manage или view_drift автоматически |
| 2 | Администратор рабочего пространства (workspace#admin) | Просмотр и управление каталогом, диагностика агентов и просмотр отчёта о расхождениях; вызов агента требует отдельного назначения invoker |
| 3 | Аудитор рабочего пространства (workspace#auditor) | Просмотр R2-отчёта о текущих расхождениях; доступ к каталогу возникает только при отдельном отношении member/admin |
| 4 | Владелец агента (agent#owner) | Просмотр и диагностика конкретного агента; не получает manage или invoke автоматически. Идентификатор команды проверяется через Platform Owner Directory |
| 5 | Наблюдатель агента (agent#viewer) | Просмотр конкретного агента |
| 6 | Пользователь агента (agent#invoker) | Вызов конкретного агента; это единственный источник разрешения agent#invoke |
| 7 | Администратор агента (agent#administrator) | Просмотр, диагностика и управление конкретным агентом; вызов требует отдельного отношения invoker |
| 8 | Участник команды (team#member) | Наследует только те отношения рабочего пространства или агента, в которых команда явно указана субъектом |
| 9 | Администратор Control Plane (control_plane#administer) | Администрирование политик, профилей обслуживания (Tier), провайдеров, моделей и ключей (ресурс control_plane:control-plane); прямое функциональное отношение, не наследуется из workspace |
| 10 | Издатель агентов (control_plane#publish) | Публикация low-code агентов и управление их версиями (ресурс control_plane:control-plane) |
| 11 | Наблюдатель Control Plane (control_plane#observe) | Наблюдение за статусом операций и публикаций (ресурс control_plane:control-plane) |
| 12 | Просмотр/управление/диагностика агента (CP: agent#view / agent#manage / agent#diagnose) | Доступы к конкретному агенту (agent:{agentId}) в контексте Control Plane; не совпадают с разрешениями вызова в Agent Registry |
Соответствие продуктовых персон — Low-code разработчик, платформенный администратор, DevOps и сотрудник службы ИБ — перечисленным отношениям не определено.
7.3. Описание модели служебных ролей
| № | Роль | Описание | Права |
|---|---|---|---|
| 1 | Служебный субъект SpiceDB (service) | Сервис или агент как субъект авторизации | Может быть участником команды/рабочего пространства и получить viewer/invoker/administrator только через явное отношение |
| 2 | ServiceAccount Kubernetes Reconciler | Наблюдение Registry в одном кластере | get/list/watch для Service и EndpointSlice только через RoleBinding в целевых пространствах имён; без Secret, Pod, logs, exec и write |
| 3 | Роль координатора Reconciler | Выбор ведущей реплики | get/create/update/patch только для именованного Lease в платформенном пространстве имён |
| 4 | Search Indexer | Поддержание поисковой проекции | Чтение своей группы потребителей и PostgreSQL, вызов AI Gateway, запись в OpenSearch; |
| 5 | Search Reindex | Построение нового поколения индекса | Чтение снимка PostgreSQL и собственных позиций Redpanda, вызов AI Gateway, запись и переключение псевдонима OpenSearch; |
| 6 | Agent Publisher / оператор Runtime | Создание Kubernetes-ресурсов и размещение артефакта | Точные служебные учётные записи и права не определены; |
| 7 | Publisher ServiceAccount (CP) | Создание allowlisted workload, Service, HTTPRoute, AgentgatewayPolicy | Dedicated ServiceAccount Publisher worker; права Kubernetes API — least-privilege, точный набор RBAC в спецификации не детализирован |
| 8 | Model/Key reconciler ServiceAccount (CP) | Render/apply Tier/Provider/Model и шардов политик ключей; derived immutable Secrets | Dedicated ServiceAccount, least-privilege RBAC; точный набор прав в спецификации не детализирован |
8. Библиотека API
| № | Метод / интерфейс | Наименование | Описание |
|---|---|---|---|
| 1 | GET /api/v1/agents/{agentId} | Получение агента | R1 Registry API; требует view, а поле интерфейса вызова дополнительно требует invoke |
| 2 | GET /api/v1/agents | Список агентов | R1 Registry API; фильтры workspace, protocol, implementationType, status, owner; серверная фильтрация view, без числа скрытых объектов |
| 3 | POST /api/v1/agents/search | Гибридный поиск | R1 Registry API; фильтрация кандидатов по invoke; пустой результат — 200 и matches=[] |
| 4 | GET /health/live | Проверка процесса Registry/Runtime | Проверка работоспособности процесса (liveness); не проверяет ресурсоёмкие зависимости |
| 5 | GET /health/ready | Проверка готовности Registry/Runtime | Registry проверяет конфигурацию и критические зависимости; Runtime — артефакт, политику, точку входа, Agent Card и клиентов |
| 6 | GET /api/v1/drift | Отчёт о расхождениях | R2, принят только смысл; конечная точка отсутствует в R1 OpenAPI и Runtime |
| 7 | GET /.well-known/agent-card.json | Agent Card Runtime | Проверенное описание A2A-интерфейса и фактических возможностей |
| 8 | POST /message:send | Синхронный A2A-вызов | Поддерживается Low-code Runtime; вызывает выбранный граф lfx и возвращает итоговое Message |
| 9 | POST /message:stream | Потоковый A2A-вызов | SSE при streaming=true: Task, упорядоченные статусы/артефакты и закрытие после итогового статуса |
| 10 | A2A task get/list | Снимки задач | Только память процесса одной реплики; после перезапуска задача может отсутствовать |
| 11 | A2A SubscribeToTask | Подписка на текущую задачу | Сначала текущее Task, затем обновления; для завершённой задачи — UnsupportedOperationError |
| 12 | MCP initialize + notifications/initialized | Установление MCP-сессии | Версия 2025-11-25 |
| 13 | MCP tools/list | Получение инструментов | Runtime возвращает один неизменяемый flow tool; Registry импортирует ограниченный неизменяемый снимок |
| 14 | MCP tools/call | Вызов инструмента | Поддерживается Runtime; Registry никогда не вызывает его при обнаружении |
| 15 | POST /control-plane/api/v1/tiers | Создать профиль обслуживания (Tier) | Control Plane; право control_plane#administer; мутации асинхронные — 202 Accepted + Operation, применение — через verifiedState |
| 16 | GET /control-plane/api/v1/models | Список моделей | Control Plane; право control_plane#administer; модель привязана к провайдеру, gatewayName неизменяем |
| 17 | POST /control-plane/api/v1/keys | Выдать ключ LLM (администратор) | Control Plane; право control_plane#administer; один владелец, один Tier, до 256 моделей; oneTimeSecret возвращается один раз |
| 18 | POST /control-plane/api/v1/keys/{keyId}:revoke | Отзыв ключа LLM | Control Plane; верификация через Gateway; при тайм-ауте — 504 VerificationTimeout |
| 19 | PATCH /control-plane/api/v1/key-issuance-policy | Обновить политику выдачи ключей | Control Plane; singleton; при enabled=true требуются ≥1 Tier и ≥1 Model |
| 20 | POST /control-plane/api/v1/agents | Создать агента с начальной версией | Control Plane (Agent Publication); право control_plane#publish; 202 Accepted → Operation |
| 21 | POST /control-plane/api/v1/agents/{agentId}/versions | Создать версию агента | Control Plane; 202 Accepted → Operation; llmRequired/modelIds/tierId выводятся сервером |
| 22 | POST /control-plane/api/v1/agents/{agentId}:rollback / :unpublish / :revalidate | Откат / скрытие / повторная валидация | Control Plane; асинхронные; предыдущие наблюдения не наследуются |
| 23 | GET /control-plane/api/v1/agents/{agentId}/status | Статус публикации | Control Plane; состояние, ревизия, гейты, наблюдения Registry; без сырых ключей и учётных данных |
| 24 | GET /control-plane/api/v1/operations/{operationId} | Статус операции | Control Plane; статус durable-операции (succeeded/failed/cancelled и фазы) |
| 25 | GET /control-plane/api/v1/guardrail-policies | Список политик Guardrails | Control Plane; право control_plane#administer; курсорная пагинация limit 1–50, cursor |
| 26 | POST /control-plane/api/v1/guardrail-policies | Создать политику Guardrails | Control Plane; право control_plane#administer; Idempotency-Key; создаёт первую версию; 202 Accepted → Operation |
| 27 | GET /control-plane/api/v1/guardrail-policies/{id} | Чтение последней версии | Control Plane; право control_plane#administer; определение + ETag, definitionDigest, ruleCount |
| 28 | PUT /control-plane/api/v1/guardrail-policies/{id} | Заменить (новая ревизия) | Control Plane; право control_plane#administer; полный текст, If-Match, Idempotency-Key; status: draft/archived; 202 Accepted → Operation |
| 29 | GET /control-plane/api/v1/guardrail-policies/{id}/revisions[/{rev}] | История ревизий | Control Plane; право control_plane#administer; неизменяемые версии; limit 1–50, beforeRevision |
| 30 | GET /control-plane/api/v1/guardrail-providers | Каталог одобренных провайдеров | Control Plane; право control_plane#administer; конфигурации внешних проверок в текущей среде |
| 31 | GET/PUT /control-plane/api/v1/models/{id}/guardrail-binding | Привязка политики к модели | Control Plane; право control_plane#administer; If-Match к модели; состояние pending/applied/failed/disabled/unbound; 202 Accepted → Operation |
| 32 | POST /request / POST /response | Проверка входа / выхода | Guardrails Runtime; сервисный токен + заголовки x-ap-gr-*; вердикт pass/deny/mask возвращается с HTTP 200; техническая ошибка — плоский {code, message, traceId} |
| 33 | GET /readyz / GET /metrics | Готовность / метрики | Guardrails Runtime; readyz — загрузка набора (без аутентификации); metrics — Prometheus-счётчики (сервисный токен); без журнала решений |