Extend agnet SK sources with repo_ref and snapshot display; add authenticated deployment sheet + API types; cockpit toolbar entry; locale strings; minor docs. Made-with: Cursor
490 lines
25 KiB
Markdown
490 lines
25 KiB
Markdown
# Agnet 平台 ↔ Heicode 集成接口设计(草案)
|
||
|
||
本文描述 **Agnet 平台**应向 **Heicode(Manager / 客户端 / 自动化服务)** 暴露的 **控制面、数据面隔离、权限模型与可视化/事件接口**。
|
||
路径、字段名为 **设计意图**;落地时可等价映射为 gRPC 或 GraphQL,但**语义与隔离边界**应保持一致。
|
||
|
||
**关联里程碑**:`[../milestones/](../milestones/README.md)` 中 M3~M5。
|
||
|
||
---
|
||
|
||
## 1. 设计目标
|
||
|
||
|
||
| 目标 | 说明 |
|
||
| ---------- | ----------------------------------------- |
|
||
| **权界清晰** | 调用方身份可解析为「谁、属于哪一租户、具备何种角色」 |
|
||
| **租户默认隔离** | 无显式授权则不可读他租户资源 |
|
||
| **有状态可观测** | 执行单元生命周期与运行态可通过 API + 事件流呈现 |
|
||
| **可演进** | 资源带 `api_version` / schema 版本;破坏性变更走新版本路径 |
|
||
|
||
|
||
### 1.1 Agnet 可视化:Heicode Manager 与 Heicode 客户端的职责划分
|
||
|
||
**使用方**:团队与个人都会使用 Heicode;下列划分依据的是 **信息类型与界面载体**,不是「只有某类用户才用某一端」。
|
||
|
||
|
||
| 载体 | 主要职责 | 典型内容 |
|
||
| ------------------- | ----------------------------------------------------------------------------------- | --------------------------------- |
|
||
| **Heicode Manager** | 呈现 **Agnet 平台回传的运行态与性能类字段**:编队/实例是否在跑、阶段(phase)、健康度、资源占用、队列与心跳、项目级聚合指标与近期错误摘要等。 | 控制台、Dashboard、与平台 SLA/运维相关的观测面。 |
|
||
| **Heicode(客户端)** | 在 **编码与工作会话过程中**,**实时或准实时展示 Agnet 平台内子 agent 产出的内容**(流式文本/结构化片段/工具结果等),与编辑、会话上下文同屏。 | 会话内输出面板、流式增量、与当前任务绑定的子 agent 交付物。 |
|
||
|
||
|
||
**边界**:Manager 侧重 **平台契约下的状态与指标**;Heicode 侧重 **工作流中的执行输出**。二者可调用同源底层 API,但 **不得**把「平台大盘」与「子代理会话输出」混为同一套 UI 假设——后者通常带更强会话/项目上下文与更细粒度流式协议。
|
||
|
||
---
|
||
|
||
## 2. 身份与调用方式
|
||
|
||
### 2.1 服务间(推荐生产)
|
||
|
||
- **Heicode Manager** 使用 **服务账号** 调用 Agnet:`Authorization: Bearer <m2m_jwt>`。
|
||
- JWT 声明至少包含:`sub`(服务主体)、`tenant_id`(若适用)、`scope`(见 §3)、`exp`。
|
||
- Agnet **校验Issuer**(Manager 签发的委托令牌 **或** Agnet 签发的服务令牌,二选一应文档化)。
|
||
|
||
### 2.2 用户委派(可选)
|
||
|
||
- 终端用户经 Heicode OAuth 后,Manager 代发 **用户委派令牌** 访问 Agnet 只读/受限写接口;Claims 含 `user_id`、`org_id`、`roles`。
|
||
|
||
### 2.3 必需传递的上下文头(建议)
|
||
|
||
|
||
| Header | 必填 | 说明 |
|
||
| -------------------------- | ----------- | --------------------------------- |
|
||
| `Authorization` | 是 | Bearer Token |
|
||
| `X-Request-Id` | 强建议 | 全链路追踪 |
|
||
| `X-Tenant-Id` | 多租户时必填 | 顶层隔离键;与 Token 声明互相校验,不一致则 **401** |
|
||
| `X-Org-Id` | 视模型 | 组织内子划分 |
|
||
| `X-Project-Id` | 编排相关 API 建议 | 资源挂载点 |
|
||
| `X-Environment` | 可选 | `dev` / `staging` / `prod` |
|
||
| `X-Heicode-Correlation-Id` | 强建议 | 与 Manager 审计日志关联 |
|
||
|
||
|
||
---
|
||
|
||
## 3. 权限模型(RBAC 概要)
|
||
|
||
### 3.1 角色(示例命名,可映射贵司 IAM)
|
||
|
||
|
||
| 角色 | 典型 scope | 说明 |
|
||
| ------------------------- | -------------- | ---- |
|
||
| `agnet:platform_admin` | 全租户元数据、调试接口 | 极少人数 |
|
||
| `agnet:org_admin` | 本租户内项目、编队、凭据绑定 | |
|
||
| `agnet:project_editor` | 指定项目下部署/停止/读状态 | |
|
||
| `agnet:operator_readonly` | 读状态、读事件、读审计 | |
|
||
| `agnet:auditor` | 仅审计与导出 | |
|
||
|
||
|
||
### 3.2 权限分离原则
|
||
|
||
- **控制面**(部署/改策略)与 **观测面**(读指标)可分角色授予。
|
||
- **凭据类写操作**(绑定 Git Token、云 SA)单独 scope:`agnet:credential:write`。
|
||
- **SK 正文写入**:仅允许经 **Heicode 客户端**身份或专用 `**heicode:sk:write`**(示例名)路径;**Agnet / Manager 控制台接口不得授予 SK 正文写权限**(与 §5.0「SK 仅在 Heicode 编辑」一致)。
|
||
- **拒绝隐式升级**:只读 Token **不得**通过查询参数绕过 body 校验升格为写操作。
|
||
|
||
---
|
||
|
||
## 4. 多租户与数据隔离
|
||
|
||
### 4.1 隔离键层级
|
||
|
||
```
|
||
Tenant(租户)
|
||
└── Organization(可选)
|
||
└── Project(项目)
|
||
└── Deployment(一次编队部署)
|
||
└── AgentInstance(执行单元实例)
|
||
```
|
||
|
||
- 所有持久化资源 **必须**带 `tenant_id`;API 默认按 Token + Header 解析租户并 **强制过滤**。
|
||
- **跨租户引用**:禁止在 URL 中使用「全局唯一但不带租户前缀」的裸 ID;推荐 `tenant_scoped_id` 或 `(tenant_id, local_id)` 复合。
|
||
|
||
### 4.2 数据面实现选项(择一或组合)
|
||
|
||
|
||
| 方案 | 适用 | Agnet 侧责任 |
|
||
| --------------- | ------- | ------------------------------ |
|
||
| **逻辑隔离** | 快速迭代 | 每张业务表 `tenant_id` + RLS 或统一拦截器 |
|
||
| **Schema 分库** | 强合规 | 每租户独立 schema / database |
|
||
| **命名空间隔离(K8s)** | 执行单元运行时 | 编排器按租户分配 NS 与网络策略 |
|
||
|
||
|
||
### 4.3 负例测试(验收必备)
|
||
|
||
- 使用 Tenant A 的凭证访问 Tenant B 的 `deployment_id` → **403** 或 **404(对外不区分)**。
|
||
- 列表接口默认 **不得**返回其他租户资源,即使 ID 被猜到。
|
||
|
||
---
|
||
|
||
## 5. 编排与控制面 API(M3)
|
||
|
||
> 下列 REST 仅为示意;实际路径前缀可为 `/api/v1` 或 `/agnet/v1`。
|
||
|
||
### 5.0 Heicode Manager:一键部署 Agnet 团队与 SK 边界(产品契约)
|
||
|
||
下列条款为 **Heicode 与 Agnet 联合落地时必须写清** 的契约;API 形状可与 `**POST /deployments`** 合一或拆为 `**POST /teams/deployments`** 等聚合端点,但 **语义不得缩水**。
|
||
|
||
**启动参数与权限归属(与 Manager 的边界)**
|
||
|
||
- **Agnet 在拉起编队 / 子 agent 运行时**(进程或等价隔离单元)须获得完整部署参数:`sk_sources`、`runtime_execution`、`sk_access_policy`、成员与模型声明等;**不得在缺少参数时静默放宽为越权默认**。
|
||
- **权限与策略的可执行副本落在 Agnet**:Git 连接、`cloud_principal_refs`、SK 允许/拒绝边界由 Agnet 控制面 **落账并在运行时强制执行**;Heicode Manager **只负责发起部署请求并展示 Agnet 回传的快照锚点与观测字段**,**不是**运行时的权限裁决引擎。
|
||
|
||
| 契约项 | 要求 |
|
||
| -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||
| **一键部署** | 在 **Heicode Manager** 控制台提供 **单次操作**(按钮或向导终点)完成:在 Agnet 上 **部署一支 Agnet 团队/编队**,并得到可追踪的 `deployment_id`、团队视图入口与后续观测衔接(见 §1.1、§6)。不得依赖用户在 Agnet 原生控制台重复手工编排才能跑通 Heicode 叙事。 |
|
||
| **团队成员** | 部署配置须 **显式包含团队成员**(至少:`user_id`、组织内角色、是否纳入该 Agnet 团队)。成员关系由 Manager/Agnet 持久化,供 **RBAC、配额与审计**;团队管理员经 **Manager 控制面**维护名单(增删改须审计)。 |
|
||
| **成员所用模型** | 须能声明 **各成员默认使用的模型/路由**(如 `default_model_id`、`provider_profile_id` 或与 Manager **模型策略**对齐的引用)。支持「团队缺省 + 成员覆盖」;未授权模型 **不得**在执行路径上静默生效。 |
|
||
| **子 agent(Agnet 平台内)与 SK** | 本文所称 **子 Agnet / 子 agent** 均指 **Agnet 平台内部的子智能体/子执行单元**(由 Agnet 编排与实例化),非 Heicode 自研运行时。部署配置须支持为 **指定子 agent** 绑定 **SK 输入源**;运行态下该子 agent **只读**白名单内的 SK 内容。 |
|
||
| **云上 / 运行时权限(须随部署传参)** | 用户在 **Heicode Manager** 中为子 agent 配置的 **执行环境绑定**(例如专用虚拟机池、云 identity / 服务账号引用、网络或资源配额策略 ID)**必须**出现在 **部署请求体**(或等价的平台编排参数)中,由 **Agnet 调度与强制执行**;不得假设「仅在控制台勾选、不传平台即可生效」。缺省值与继承规则(编队级 → 子 agent 覆盖)须在联合 RFC 中写死。 |
|
||
| **SK 访问策略(允许 / 禁止,须随部署传参)** | 除 **`sk_sources` 解析出的快照正文**外,须支持显式声明 **SK 工具/技能命名空间或路径的允许集与拒绝集**(或引用租户级策略模板 ID)。部署完成后,平台将 **物化**各子 agent 的 **有效 SK 策略**:快照内容 ∩ 允许规则 − 拒绝规则;子 agent 运行时 **不得**调用策略外的 SK 工具入口(与 §12 校验一致)。 |
|
||
| **SK 与 Git / 上传 MD** | **SK 正文资产以 Git 仓库为统一事实源**(用户指定的远端/连接与分支、路径规则由集成约定)。同时允许用户 **上传 Markdown 等文件** 作为 **补充 SK 源**(租户内对象存储/制品 ID)。Agnet 执行前将两类来源 **解析为不可变快照**(commit SHA / upload version),再注入子 agent 上下文。 |
|
||
| **SK 文件仅在 Heicode 中编辑** | Git 侧 SK 的 **创建、修改、删除** 经 **Heicode 客户端**提交到仓库(或 Heicode 发起变更后再同步);**上传类 SK** 的 **新增/替换** 仅通过 **Heicode 提供的入口**(Manager 可做登记与透传,**不提供 SK 正文在线编辑器**)。**Agnet 平台与子 agent 对 SK 均只读**;若 Agnet 控制台出现可直接改 SK 正文的 API/UI,视为 **违背产品边界**。 |
|
||
|
||
|
||
**部署请求体扩展(示意,可与 §5.1 合并)**
|
||
|
||
```json
|
||
{
|
||
"project_id": "prj_xxx",
|
||
"template": "agnet_team_default",
|
||
"correlation_id": "mgr_cor_abc",
|
||
"members": [
|
||
{
|
||
"user_id": "usr_alice",
|
||
"role_in_team": "lead",
|
||
"default_model_id": "mdl_claude_sonnet",
|
||
"provider_profile_id": "pp_org_default"
|
||
},
|
||
{
|
||
"user_id": "usr_bob",
|
||
"role_in_team": "member",
|
||
"default_model_id": "mdl_claude_haiku"
|
||
}
|
||
],
|
||
"sub_agents": [
|
||
{
|
||
"role_template": "sub_reviewer",
|
||
"sk_file_refs": ["sk_review_policy.md", "sk_api_bar.yaml"],
|
||
"runtime_execution": {
|
||
"profile_id": "exec_profile_vm_dedicated",
|
||
"cloud_principal_refs": ["cp_az_mi_ci_readonly"],
|
||
"network_policy_ref": "net_tenant_isolated"
|
||
},
|
||
"sk_access_policy": {
|
||
"policy_ref": "tenant_sk_policy_default",
|
||
"deny_skill_ids": ["sk_admin_dest_env"],
|
||
"inherit_deployment_defaults": true
|
||
}
|
||
}
|
||
],
|
||
"parameters": { "unit_overrides": {} }
|
||
}
|
||
```
|
||
|
||
- `**runtime_execution`(推荐)**:承载 **子 agent 云上执行绑定**(VM/池、云 SA/MI、网络策略等);字段名可映射为 Agnet 内部模型,但 **语义不得省略**——Manager 收集的配置必须可达 Agnet。
|
||
- `**sk_access_policy`(推荐)**:与 **`sk_sources` 快照**配合,声明 **允许/拒绝** 的技能 ID、路径前缀或租户策略引用;平台在部署落账时计算 **effective policy** 并下发给运行时。
|
||
- `**sk_sources`(推荐显式建模)**:替代或细化纯路径数组 `sk_file_refs`; 每个元素标明来源类型,便于 Agnet 实现拉取与快照。
|
||
|
||
**部署请求体中 SK 绑定扩展示意**
|
||
|
||
```json
|
||
"sub_agents": [
|
||
{
|
||
"role_template": "sub_reviewer",
|
||
"sk_sources": [
|
||
{
|
||
"type": "git",
|
||
"repo_ref": { "connection_id": "gitconn_1", "repo_url": "https://example.com/org/sk-repo.git", "ref": "main", "paths": ["policy/review.md"] }
|
||
},
|
||
{
|
||
"type": "upload",
|
||
"artifact_id": "sk_upl_9f3a",
|
||
"mime": "text/markdown"
|
||
}
|
||
]
|
||
}
|
||
]
|
||
```
|
||
|
||
#### 5.0.1 对 Agnet 平台的接口与语义要求(含 SK)
|
||
|
||
下列为 **Agnet 应向 Heicode/Manager 提供或可观测** 的最小要求;路径可为等价 gRPC。
|
||
|
||
|
||
| 类别 | 要求 |
|
||
| ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||
| **部署与编队** | 实现 `**POST /deployments`**(或 `**POST /teams/deployments`**)可接收 **成员、成员模型、子 agent 模板、`sk_sources`、`runtime_execution`、`sk_access_policy`**(字段名可等价映射);返回 `**deployment_id**`、实例/子 agent 标识,供 Callback 与观测关联。 |
|
||
| **SK 快照只读** | 对每个 `deployment_id` / `sub_agent_id`,Agnet 须能记录 **已解析的 SK 快照**(Git:`commit_sha` + 路径哈希;Upload:`artifact_id` + 版本)。运行注入 **仅此快照**,不得在执行中「瞒报版本」拉未授权路径。 |
|
||
| **运行时绑定落账** | 部署请求中的 **`runtime_execution`(或等价字段)** 必须持久化,并在 **实例化子 agent** 时绑定到实际执行环境(VM、identity、网络隔离等);观测 API 能回答「该实例使用了哪套运行时绑定」。 |
|
||
| **SK 策略物化** | 部署接受后,Agnet 必须能输出 **每个子 agent 的生效 SK 策略**(快照哈希 + `sk_access_policy` 解析结果),供 Manager **Git 来源 / 审计**页展示「允许 / 禁止 SK」结论与追溯。 |
|
||
| **Git 拉取** | Agnet 须支持 **按租户注册 Git 凭据/连接**(`connection_id` 或等价),由用户在 **Heicode/Manager 流程**中授权;**Agnet 不提供 Git 写接口用于改 SK**——写操作发生在 Git 远端或经 Heicode 提交后,Agnet 仅 **fetch + checkout 指定 ref**。 |
|
||
| **上传制品** | 若支持 `type: "upload"`:Agnet(或与 Manager 分工)须提供 `**artifact_id`** 的只读获取(如 `GET /sk-artifacts/{artifact_id}/content` 或预签名 URL),**无 `PUT` 修改正文**于 Agnet 控制台;上传入口 **仅** Heicode 侧发起、Agnet 存只读副本。 |
|
||
| **刷新策略** | 约定 **何时重新解析 SK**(如新 commit、用户触发刷新、部署新版本);须可通过 API 或事件暴露 `**sk_snapshot_refreshed`**,便于 Heicode 提示「已用新版本 SK」。 |
|
||
| **禁止项** | **不得**提供面向 SK 正文的 **通用写 API**(与 §3.2 一致);子 agent **只读**绑定列表内的快照。 |
|
||
|
||
|
||
- `**sk_file_refs`**(若保留简化字段):视为 **相对某默认 Git 根**或 **由 Manager 展开为 `sk_sources`** 前的简写;联合 RFC 须声明展开规则。
|
||
- **验收**:部署完成后,Manager 可展示「团队成员—模型—**Agnet 子 agent**—SK 源(Git ref / 上传件)—快照版本—**运行时绑定**—**生效 SK 策略**」;Git 更新或 Heicode 重新上传后,按刷新策略在后续运行使用新快照。
|
||
|
||
### 5.1 部署编队
|
||
|
||
`POST /deployments`
|
||
|
||
**请求体(示意)**
|
||
|
||
```json
|
||
{
|
||
"project_id": "prj_xxx",
|
||
"template": "agile_min",
|
||
"correlation_id": "mgr_cor_abc",
|
||
"members": [],
|
||
"sub_agents": [],
|
||
"parameters": {
|
||
"unit_overrides": {}
|
||
}
|
||
}
|
||
```
|
||
|
||
**响应**
|
||
|
||
```json
|
||
{
|
||
"deployment_id": "dep_yyy",
|
||
"status": "accepted",
|
||
"agent_instances": [
|
||
{ "instance_id": "agi_1", "role": "AG-PO", "phase": "pending" }
|
||
]
|
||
}
|
||
```
|
||
|
||
### 5.2 查询部署
|
||
|
||
- `GET /deployments/{deployment_id}` —— 含租户校验。
|
||
- `POST /deployments/{deployment_id}:stop` —— 优雅停止。
|
||
|
||
### 5.3 Webhook / 回调(Agnet → Heicode)
|
||
|
||
- Manager 注册 URL:`POST /integration/heicode/callback-config`(或由 Agnet 控制台配置)。
|
||
- 负载含:`deployment_id`、`instance_id`、`event_type`、`payload`、`occurred_at`、`signature`。
|
||
|
||
**签名**:HMAC-SHA256(共享密钥或 JWKS);拒绝无签名请求。
|
||
|
||
---
|
||
|
||
## 6. 运行态与可视化 API(M5)
|
||
|
||
**与产品分工的对应关系**:本章 **§6.1~§6.3** 主要支撑 **Heicode Manager** 上的平台运行态与聚合视图;**§6.4** 支撑 **Heicode 客户端**在编码过程中展示 **子 Agnet 输出**。总则见 **§1.1**。
|
||
|
||
### 6.1 实例快照
|
||
|
||
`GET /agent-instances/{instance_id}`
|
||
|
||
**响应字段(示意)**
|
||
|
||
```json
|
||
{
|
||
"instance_id": "agi_1",
|
||
"deployment_id": "dep_yyy",
|
||
"tenant_id": "ten_1",
|
||
"role": "AG-PO",
|
||
"phase": "running",
|
||
"health": "ok",
|
||
"last_heartbeat_at": "2026-04-30T12:00:00Z",
|
||
"queue_depth": 2,
|
||
"current_task": { "id": "task_7", "summary": "Review API draft" },
|
||
"resource": { "cpu_pct": 12, "mem_mb": 512 },
|
||
"errors_recent": [{ "at": "...", "code": "UPSTREAM_TIMEOUT", "message": "..." }]
|
||
}
|
||
```
|
||
|
||
### 6.2 项目级聚合
|
||
|
||
`GET /projects/{project_id}/dashboard-snapshot`
|
||
|
||
返回:活跃实例数、按 phase 分布、近 1h 失败率、平均任务耗时等 **JSON 聚合**(供 Heicode 控制台图表)。
|
||
|
||
### 6.3 指标导出(可选)
|
||
|
||
- `GET /metrics` —— Prometheus 文本;或
|
||
- `GET /projects/{project_id}/metrics.json` —— 简化 JSON。
|
||
|
||
### 6.4 子 Agnet 输出流(Heicode 编码侧)
|
||
|
||
面向 **Heicode 客户端**在会话内展示 **Agnet 平台子 agent** 的产出(与 §6.1 的「实例心跳/资源占用」互补:此处强调 **内容增量**,而非仅状态字段)。
|
||
|
||
**设计意图**(路径可等价映射):
|
||
|
||
- `GET /sessions/{session_id}/sub-agents/{sub_agent_id}/stream` —— **SSE**,或
|
||
- `WS /sessions/{session_id}/stream` —— 多路复用主题:`sub_agent.output`、`sub_agent.tool_result` 等。
|
||
|
||
**data 示例(输出增量)**
|
||
|
||
```json
|
||
{
|
||
"schema_version": 1,
|
||
"type": "output_delta",
|
||
"sub_agent_id": "sub_agi_1",
|
||
"parent_turn_id": "turn_42",
|
||
"content": { "mime": "text/markdown", "delta": "..." },
|
||
"finished": false
|
||
}
|
||
```
|
||
|
||
- 鉴权与租户隔离与 §2~§4 一致;**仅**授权用户可读本会话下的子代理流。
|
||
- 若实际实现将子代理输出 **嵌套在既有对话/Messages 协议**中,须在联合 RFC 中声明字段映射,语义与本节一致即可。
|
||
|
||
---
|
||
|
||
## 7. 事件流(SSE / WebSocket)
|
||
|
||
**两类订阅(勿混淆)**:
|
||
|
||
1. **平台/实例生命周期与运行态**(与 §6.1、§6.2 对照):阶段变更、健康、任务摘要等 —— 主要支撑 **Heicode Manager** 与状态面板。
|
||
2. **会话内子代理输出与工具结果**(与 §6.4 对照)—— 主要支撑 **Heicode 客户端**编码界面;实现上可与下述端点合并为多路事件,但 **事件 `type` 必须可区分**。
|
||
|
||
### 7.1 SSE(推荐易调试)
|
||
|
||
`GET /agent-instances/{instance_id}/events`
|
||
|
||
- Headers:`Accept: text/event-stream`
|
||
- 事件:`id`、`event`、`data`(JSON)
|
||
|
||
**data 示例**
|
||
|
||
```json
|
||
{
|
||
"schema_version": 1,
|
||
"type": "phase_changed",
|
||
"from": "pending",
|
||
"to": "running",
|
||
"at": "2026-04-30T12:00:01Z"
|
||
}
|
||
```
|
||
|
||
### 7.2 WebSocket(高吞吐)
|
||
|
||
`WS /projects/{project_id}/stream`
|
||
|
||
- 首帧 **鉴权**(query token 或子协议);订阅主题:`deployment.`*、`instance.`*。
|
||
|
||
### 7.3 重连与顺序
|
||
|
||
- 支持 `Last-Event-ID`;服务端保留短期 **环形缓冲**(如 15 分钟)以便断线续传。
|
||
|
||
---
|
||
|
||
## 8. 审计与合规(跨 M4/M5)
|
||
|
||
- `GET /audit-logs?tenant_id=&from=&to=` —— 仅 `auditor` / `org_admin`。
|
||
- 每条:`actor`、`action`、`resource`、`tenant_id`、`request_id`、`correlation_id`、`result`。
|
||
|
||
---
|
||
|
||
## 9. 错误模型
|
||
|
||
|
||
| HTTP | 含义 | 客户端行为 |
|
||
| ---- | ------------ | --------- |
|
||
| 400 | 参数错误 | 展示校验细节 |
|
||
| 401 | 未认证 | 刷新令牌 |
|
||
| 403 | 权限不足 | 引导申请角色 |
|
||
| 404 | 不存在或无权(对外统一) | 不泄漏存在性 |
|
||
| 409 | 状态冲突(重复部署) | 幂等重试策略 |
|
||
| 429 | 限流 | 退避 |
|
||
| 503 | 编排背压 | 重试 + 降级文案 |
|
||
|
||
|
||
**响应体**统一 envelope:
|
||
|
||
```json
|
||
{ "error": { "code": "FORBIDDEN_CROSS_TENANT", "message": "...", "request_id": "..." } }
|
||
```
|
||
|
||
---
|
||
|
||
## 10. 版本与演进
|
||
|
||
- URL 前缀:`/api/v1`;破坏性变更引入 `/api/v2`。
|
||
- 事件 `schema_version` 递增;客户端忽略未知字段。
|
||
|
||
---
|
||
|
||
## 11. OpenAPI / 交付物建议
|
||
|
||
- Agnet 侧维护 **OpenAPI 3.1** 与 **异步 API(SSE/WS)说明**;
|
||
- 提供 **Postman Collection** + **租户穿越测试集合**。
|
||
|
||
---
|
||
|
||
## 12. 编排决策权模型(新增约束)
|
||
|
||
为避免“模型直接执行导致越权/失控”,本项目明确采用:
|
||
|
||
- **模型提案**:模型基于 SK 产出 `orchestration_plan`
|
||
- **平台裁决**:Agnet 对提案执行权限、租户、预算、模型授权校验后决定执行
|
||
- **Manager 入口**:Heicode Manager 仅作为调用入口与状态展示,不绕过裁决链路
|
||
|
||
详见:`[./orchestration-plan-contract.md](./orchestration-plan-contract.md)`。
|
||
|
||
最低校验项(平台必须执行):
|
||
|
||
1. `tenant_id` / `project_id` 与令牌一致
|
||
2. 成员与角色具备部署权限
|
||
3. `default_model_id` 在组织策略允许范围
|
||
4. `sk_sources` 可解析且无越权路径
|
||
5. 预算上限(tokens / cost / duration)未超策略阈值
|
||
6. 若请求包含 **`runtime_execution`**:`profile_id` / `cloud_principal_refs` 等引用 **属于本租户且已授权**,否则 **拒绝部署**(错误码建议 `RUNTIME_BINDING_INVALID`)。
|
||
7. 若请求包含 **`sk_access_policy`**:须与租户默认策略合并并 **物化为可执行的生效边界**;非法组合(例如引用禁止的技能 ID、与快照路径冲突)返回 **403** / `SK_POLICY_REJECTED`。
|
||
|
||
---
|
||
|
||
## 13. 事件字典(建议最小集)
|
||
|
||
建议固定以下事件名,避免前后端各自命名造成协议漂移:
|
||
|
||
|
||
| event | 用途 |
|
||
| ------------------------- | -------------- |
|
||
| `deployment.accepted` | 部署请求被接受,进入编排队列 |
|
||
| `deployment.rejected` | 部署被策略拒绝 |
|
||
| `instance.phase_changed` | 执行单元阶段变化 |
|
||
| `instance.health_changed` | 执行单元健康状态变化 |
|
||
| `sub_agent.output_delta` | 子 agent 流式输出增量 |
|
||
| `sk_snapshot_refreshed` | SK 快照刷新完成 |
|
||
|
||
|
||
每个事件最小字段建议:
|
||
|
||
- `event_id`
|
||
- `schema_version`
|
||
- `tenant_id`
|
||
- `project_id`
|
||
- `deployment_id`
|
||
- `correlation_id`
|
||
- `occurred_at`
|
||
|
||
---
|
||
|
||
## 14. 业务错误码字典(补充)
|
||
|
||
除 HTTP 状态码外,建议统一错误码最小集合:
|
||
|
||
|
||
| code | 说明 |
|
||
| ---------------------------- | ------------ |
|
||
| `POLICY_REJECTED` | 平台策略拒绝执行提案 |
|
||
| `MODEL_NOT_ALLOWED` | 模型未授权 |
|
||
| `SK_SOURCE_UNRESOLVABLE` | SK 源不可解析或不可读 |
|
||
| `RUNTIME_BINDING_INVALID` | 云上 / 运行时绑定引用无效或未授权 |
|
||
| `SK_POLICY_REJECTED` | SK 允许 / 拒绝策略与快照或租户策略冲突 |
|
||
| `BUDGET_EXCEEDED` | 超预算 |
|
||
| `FORBIDDEN_CROSS_TENANT` | 跨租户访问拒绝 |
|
||
| `DEPLOYMENT_CONFLICT` | 幂等或状态冲突 |
|
||
| `CALLBACK_SIGNATURE_INVALID` | 回调签名校验失败 |
|
||
|
||
|
||
验收用例集合见:`[./acceptance-matrix.md](./acceptance-matrix.md)`。
|
||
|
||
---
|
||
|
||
*本文档随里程碑评审更新;实现细节以 Agnet 与 Heicode 联合 RFC 为准。* |