Обзор платформы
Как устроена Adapstory — bounded contexts, plugin runtime и куда встраивается ваш код.
Adapstory построена вокруг минимального ядра из bounded contexts (BC) и plugin runtime, который хостит всё остальное.
Ядерные bounded contexts
| BC | Имя | Что принадлежит |
|---|---|---|
| BC-01 | Plugin Gateway | Реестр MCP-инструментов, маршрутизация LLM, агрегация OpenAPI |
| BC-02 | Plugin Lifecycle | Install / update / rollback манифестов плагинов |
| BC-10 | Identity | Пользователи, тенанты, SSO, RBAC (на базе Keycloak) |
| BC-15 | Data Model Engine | Динамические сущности, схемы, валидация, проекция событий |
| BC-16 | Identity Runtime | Выпуск JWT, introspection, per-tenant ключи |
| BC-19 | Multi-Tenant Runtime | Изоляция плагинов, per-tenant DB границы, sidecar-инъекция |
Всё что вне этого списка — плагин.
Двухплоскостная архитектура
Control plane (Java 25 + Spring Boot 4): BC выше, каждый — свой микросервис со своей PostgreSQL. jOOQ для доступа к данным, Kafka для событий, CloudEvents 1.0 на проводе.
Data plane (Python 3.12 + FastAPI): AI-микросервисы за Plugin Gateway. LangChain / LangGraph, vLLM или Ollama для инференса, PyTorch для кастомных моделей. Один сервис — одна capability.
Plugin runtime (BC-19): ваш плагин поставляется подписанным контейнером. На install runtime планирует его в namespace тенанта с правильными секретами, лимитами ресурсов и сетевыми политиками.
Как плагины встраиваются
Плагин декларирует точки интеграции в plugin.yaml:
apiVersion: adapstory.com/v1
kind: Plugin
metadata:
name: course-recommender
version: 1.4.0
spec:
mcpTools:
- name: recommend_next_course
description: Suggest the next course for a given learner
endpoint: /mcp/recommend
dataModels:
extends: [bc15.course, bc15.enrollment]
events:
produces: [course.recommended.v1]
consumes: [enrollment.completed.v1]
llm:
gatewayBudget: 500000 # tokens/day per tenant
defaultModel: claude-sonnet-4-6
guardrails:
content:
- no-pii
- education-safeВсе поля plugin.yaml версионируются и immutable после публикации. Чтобы изменить что-то важное — выпустите новую версию и дайте lifecycle-контроллеру мигрировать тенантов.
Границы данных
- Java ↔ Python — строго REST или Kafka. Shared-баз данных нет. Никогда.
- Plugin ↔ Core — MCP-инструменты (для вызовов от LLM) или Kafka (для асинхронных сценариев). Никаких прямых SQL в core-таблицы.
- Tenant ↔ tenant — изоляция на уровне схемы PostgreSQL и namespace Kubernetes. Runtime обеспечивает; вам это не нужно делать вручную.
Куда дальше
- Bounded contexts подробно — что каждый BC отдаёт и какие у него контракты.
- Архитектура runtime — как Multi-Tenant Runtime планирует и изолирует плагины.
- Quickstart по плагину — соберите первый плагин.