aps-agent/aps/docs/contract-draft.md

73 lines
5.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# APS 对平台的契约草案(B0.2 → B5 输入)
> 两侧唯一的界面就是这份契约:平台通过 `providers/aps` 的适配器调它,APS 不 import 平台代码。首版**只读优先**——写能力先列出来定形状,实现放在 A6/B6 之后。
>
> 能力描述七要素见 `docs/spec/capability-description.md`(平台侧同一份规范)。
## 1 传输形状
| 项 | 约定 |
| --- | --- |
| 端点 | `POST /api/capabilities/{capabilityId}` |
| 请求体 | `{ "params": {}, "executionId": "...", "idempotencyKey": "...", "deadlineAt": 0, "identity": { "accountId": "..." } }` |
| 响应体 | 与平台 `contracts/schemas/receipt.schema.json` 的 `ExecutionReceipt` 同形:`{ executionId, status, result?, errorKind?, approvalId? }` |
| 健康 | `GET /api/health` → `{ status: "ok"|"degraded"|"down", detail?, checkedAt }` |
| 清单 | `GET /api/manifest` → `ProviderManifest`(id / displayName / version / platformVersion / requiresIdentity / auth / capabilities) |
| 鉴权 | 服务间令牌 + 身份透传(`identity.accountId`)。**权限由 APS 自己校验**(D9:权限归业务系统),平台放行不代表 APS 放行 |
| 超时 | `deadlineAt` 由平台给,APS 尽力遵守;超时不等于失败,平台按「结果未知」处理 |
| 版本 | `platformVersion: 1`;能力 schema 只加不改,改语义换 capabilityId |
## 2 只读能力(B5 首批实现)
| capabilityId | 一句话用途(≤40 字) | effect | mode | 幂等 | 何时不用 | 同义词 |
| --- | --- | --- | --- | --- | --- | --- |
| `aps.master.query` | 查物料、工序、设备等主数据 | read | sync | none | 要改主数据请用主数据维护流程 | 主数据、基础资料、物料表 |
| `aps.orders.query` | 查订单与交期承诺状态 | read | sync | none | 要看排产结果用 `aps.schedule.query` | 订单、交期、承诺日期 |
| `aps.capacity.query` | 查产能池与负荷分布 | read | sync | none | 要看某版方案的负荷用 `aps.schedule.query` | 产能、负荷、能力池 |
| `aps.calendar.query` | 查工厂日历、班次与换型字典 | read | sync | none | 不用于查排产结果 | 日历、班次、换型、setup |
| `aps.routing.query` | 查工艺路线模板与工序顺序 | read | sync | none | 图纸解析在 `aps.drawing.parse` | 工艺路线、工序、路线模板 |
| `aps.schedule.query` | 查现有排产方案与执行结果 | read | sync | none | 要新算一版用 `aps.schedule.preview` | 排产结果、计划、方案 |
| `aps.exceptions.query` | 查缺料、冲突与超期等异常 | read | sync | none | 要看某个订单细节用 `aps.orders.query` | 异常、冲突、缺料、超期 |
参数 schema 一律:`{ "project": string(必填,默认当前项目), "filters": object(可选) }`,把枚举与单位写进描述;返回 `{ items: [], total: number, asOf: string }`(`asOf` 是数据时点,供界面显示"数据截至")。
## 3 草稿与写能力(形状先定,实现后置)
| capabilityId | 用途 | effect | mode | 幂等 | 说明 |
| --- | --- | --- | --- | --- | --- |
| `aps.schedule.preview` | 按当前数据试排一版,只出结果不发布 | draft | async | natural | 返回 `jobId`;结果进隔离草稿,不碰 APS 生产数据 |
| `aps.schedule.publish` | 把指定版本方案发布到 APS | write | async | key | 必须带 `revision`(目标数据版本);平台侧先出确认卡(A4.4) |
| `aps.orders.upsert` | 新增或修改订单 | write | sync | key | 需要业务系统的写权限;平台不代替它判断 |
| `aps.drawing.parse` | 把图纸解析成工艺信息 | draft | async | natural | 入参是平台上传后的文件引用,APS 不接收文件本身 |
`draft` 与 `write` 的关键区别:`draft` 只写隔离草稿、不碰生产数据,因此不走确认卡;`write` 一律走确认卡(平台策略层已实现)。
## 4 错误映射
| APS 侧情况 | errorKind |
| --- | --- |
| 参数缺失、类型错、枚举越界 | `invalid_argument` |
| 当前账号在该 APS 里没有这个权限 | `forbidden` |
| 版本冲突、并发修改 | `conflict` |
| 求解器等资源排队 | `rate_limited` |
| APS 不可用、依赖系统不可用 | `unavailable` |
| 超时、部分完成、无法判断 | `unknown_result` |
只有 `rate_limited` 与 `unavailable` 允许平台自动重试;其余一律不重试(平台 Core 已按此实现)。
## 5 与平台侧的对齐检查
| 检查 | 方式 |
| --- | --- |
| 清单形状 | `GET /api/manifest` 的返回能通过平台 `ProviderManifest` 类型校验 |
| 能力描述七要素 | 跑平台 `pnpm check:capabilities` 同一套规则(B5 时把规则提到契约里,两侧共用) |
| 契约测试 | 平台 `runProviderContract` 对 APS 适配器跑一遍(A2.4 已实现) |
| 只读验收 | A5.6 在真实 APS 上完成一次查询并留证 |
## 6 待定
| 项 | 说明 | 定的时机 |
| --- | --- | --- |
| 契约用 HTTP 还是进程内 | 首版 Provider 可跑在平台信任域内(实施设计 5),跨进程是外部团队接入的形态 | B5 实现时按部署形态定 |
| `aps.schedule.preview` 的结果存放 | 方案结果落 APS 库还是平台产物区 | B5 |
| 图纸文件引用形式 | 平台产物 id 还是 URL | 与 `drawing.parse` 一起定 |