SDK и интеграции¶
Раздел для разработчиков, которые пишут код поверх платформы: собственный
resource service, исполнителя (агента), скилл или код интеграции пакета. Здесь
описаны канонические библиотеки платформы и правила их подключения. Все
библиотеки — Python 3.12+. Сам пакет — вертикаль или интеграция — собирается
инструментом package-sdk, см. раздел Пакеты.
Библиотеки¶
| Библиотека | Пакет Python | Для чего | Зависимости |
|---|---|---|---|
| platform-auth-sdk | platform_auth |
проверка токенов IAM и Policy Enforcement Point в resource service: identity → revocation → entitlement → policy → гейты сервиса | pyjwt[crypto], httpx |
| control-plane-client | control_plane_client |
клиент REST API Control Plane, разрешение credential, обмен PAT на access token | httpx |
| platform-memory-client | platform_memory_client |
клиент memory-service (/api/brain/*, /api/memory/*) |
httpx, pydantic |
| skill-sdk | skill_sdk |
написать скилл кодом, хостить его по local/http/mcp и выгрузить YAML для пакета каталога |
pydantic, jsonschema, pyyaml; опционально platform-auth-sdk, platform-llm |
| platform-llm | platform_llm |
единый LLM-клиент со structured output, ретраями и ротацией моделей | httpx, pydantic |
| package-sdk | package_sdk |
инструмент автора пакетов (check, test, lock, plan, apply) и среда наблюдателя интеграции package_sdk.connector |
pyyaml, jsonschema, ruamel.yaml; дополнения sandbox, connector, skills, mcp |
Вертикаль — это пакет каталога без своего runtime: работа, процессы и правила
исполняет ядро, действия во внешнем мире — скиллы на skill-sdk, факты из
внешнего мира пишет наблюдатель на package_sdk.connector. Свой сервис с базой
нужен, только если у домена есть собственные данные, и тогда он выставляет
наружу HTTP-скиллы (см. Пакеты).
Правило канонических клиентов¶
Для логики, у которой в платформе уже есть канон, свой код не пишется (обоснование — TAI-ADR-0030):
| Задача | Канон | Чего не делать |
|---|---|---|
| Проверить токен IAM в своём сервисе | platform_auth.TokenVerifier + JwksCache |
разбирать JWT вручную, принимать audience «по вхождению» |
| Обменять PAT или client credentials на access token | control_plane_client.IamCredential, platform_auth.ServiceTokenProvider |
хранить access token дольше его TTL, слать PAT как Bearer в сервис |
| Вызвать Control Plane | control_plane_client.ControlPlaneClient |
писать свой HTTP-клиент по памяти о контракте |
| Прочитать или записать память из пакета: процесса, правила, скилла, наблюдателя, исполнителя | через ядро: шаги процесса memory, recall, remember; ctx.knowledge скилла; ctx.snapshot наблюдателя; контекст задачи и run'а |
ходить в memory-service напрямую, заводить пакету свой грант на namespace |
| Прочитать или записать память из приложения со своим грантом на namespace | platform_memory_client |
ходить в базу памяти напрямую |
| Вызвать LLM | platform_llm.OpenAICompatibleClient |
копировать ретраи и разбор JSON в каждый сервис |
Клиенты лежат рядом с сервером в его репозитории (services/control-plane/client,
services/memory-service/client) и версионируются вместе с серверным контрактом.
Память — только через ядро¶
Код пакета — процесс, правило, скилл, наблюдатель, исполнитель задач — к memory-service не обращается. Все его запросы к памяти идут в Control Plane, а ядро само ходит в память от своего имени, проверяя права вызывающего на пространство работы и включённые онтологии (TAI-ADR-0054):
| Кто | Как читает и пишет память |
|---|---|
| процесс | проекция дела memory, шаги recall и remember, контекст шагов (Процессы и база знаний) |
| скилл | ctx.knowledge: recall, query, preview и apply снимка, document (skill-sdk) |
| наблюдатель | ctx.snapshot — снимок внешней системы (Интеграции) |
| исполнитель задачи | контекст задачи и run'а (Контекст задачи и память) |
Прямой клиент памяти platform_memory_client — для приложений со своим грантом
на namespace, а не для пакетов (см. Клиенты сервисов).
Подключение¶
Библиотеки подключаются path-зависимостями соседними папками. Раскладка
суперпроекта плоская: компоненты лежат в корне рядом друг с другом, и
потребитель ссылается на ../platform-auth-sdk, ../control-plane/client и
т. п.
[project]
dependencies = [
"platform-auth-sdk>=0.1.0",
"control-plane-client",
"platform-memory-client",
]
[tool.uv.sources]
platform-auth-sdk = { path = "../platform-auth-sdk", editable = true }
control-plane-client = { path = "../control-plane/client", editable = true }
platform-memory-client = { path = "../memory-service/client", editable = true }
Контекст сборки образа — корень суперпроекта
Из-за path-зависимостей образ сервиса нельзя собрать из его каталога:
соседей там нет. Сервисы платформы, зависящие от SDK (control-plane,
сервисы пакетов),
собираются с контекстом . (корень) и dockerfile: <компонент>/Dockerfile; лишнее отсекает
.dockerignore в корне. Делайте так же для своего сервиса:
Runner-хост, который исполняет агентов в рабочих копиях, материализует соседей под теми же именами — поэтому раскладку нельзя менять.
Токены: кто что предъявляет¶
flowchart LR
subgraph Исполнитель
PAT[Platform Access Token] ==>|"IamCredential"| X1[POST /iam/api/v1/platform-access-tokens:exchange]
end
subgraph Сервис
CC[client_id + client_secret] ==>|"ServiceTokenProvider"| X2[POST /iam/api/v1/tokens/exchange]
end
X1 ==> AT1[access token audience control-plane]
X2 ==> AT2[access token audience memory-service / …]
AT1 ==> CP[Control Plane]
AT2 ==> RS[Resource service]
RS ==>|"TokenVerifier (platform-auth-sdk)"| V[проверка]
CP ==>|"TokenVerifier"| V
| Кто | Credential | Как получает access token | Библиотека |
|---|---|---|---|
| Агент, харнесс, CLI | PAT (из локального хранилища, файла или переменной) | обмен PAT → токен одного audience | control_plane_client.IamCredential |
| Сервис платформы | client credentials service account'а | обмен client credentials → токен audience | platform_auth.ServiceTokenProvider |
| Человек в браузере | вход во внешний OIDC IdP | federation:exchange в IAM (веб-клиент) |
— (см. Федерация identity) |
Правило «один токен — один audience»: resource service принимает только токен, выпущенный ровно для него. Если процессу нужны два сервиса, он делает два обмена одного и того же PAT (см. Токены, audiences, scopes).
Проверка и тесты¶
| Библиотека | Проверка |
|---|---|
| platform-auth-sdk | uv run pytest, uv run ruff check ., uv run mypy |
| skill-sdk | uv run pytest -q |
| platform-llm | uv run pytest -q, uv run ruff check . && uv run ruff format --check . |
| клиенты | тесты клиента запускаются вместе с тестами сервиса |
platform_auth.testing даёт генератор ключей, выпуск токенов с
произвольными claims и управляемые часы — используйте его в тестах своего
сервиса вместо самописных фикстур.
См. также¶
- platform-auth-sdk
- Клиенты сервисов
- skill-sdk
- platform-llm
- Пакеты — вертикаль как пакет, инструмент
package-sdk - Токены, audiences, scopes