WP07:External API、能力自省与类型生成
状态:完成(2026-10-17)。阶段:M0。主责:Backend / API 契约。 上层工作项:B05(External/生成类型)、C01;详见模块计划。本包是该工作项的实施拆分,不是另一份配置契约。
前置与输入
前置完成:WP03、WP04、WP05。 字段与行为以统一契约为准;所有依赖编号见执行清单。
修改范围与交付
- 修改范围:外部项目创建/PATCH/configuration/route-tree,幂等指纹、capabilities.slideshow、OpenAPI 和 Editor 生成类型。
- 交付物:内部与外部一致的配置接口、M0 能力声明、真实 Gateway 样例和生成模型。
- 提交边界:源码 standards 不复制放映 Schema;不实现 CLI/MCP 命令,也不提前声明 timer/media_end 已可执行。
完成标准
- [x] 实现及评审覆盖上述修改范围,未超出提交边界。
- [x] 行为验收:幂等区分省略/null;configuration 顶层字段位置正确;M0 只声明动画和 manual;无权访问失败。
- [x] 验证范围:External API/幂等测试;codegen:editor-api 后 test:contracts:generated;按技能补真实 Gateway 契约。
- [x] 关联验收:A03、A05、A06;见联调与验收计划。
- [x] 记录代码版本、实际测试命令/结果、未运行项及原因,产物保存到任务专属临时目录。
- [x] 回填本卡状态与证据;阶段能力是否开放由对应阶段出口包决定,单包完成不等于整阶段交付。
建议提交标题:WP07:External API、能力自省与类型生成。通常按一个可评审 PR 实施;若实际改动仍过大,先按输入/输出再拆子包,保留父编号和依赖。
测试环境与命令选择遵循 dev-start-test,不因执行本卡重复启动服务或重置开发数据。
实施记录
- External DTO:创建请求新增顶层
slideshow(省略取默认);PATCH 复用ProjectUpdateRequest;PUT /configuration新增顶层slideshow(不塞进configuration.presentation,嵌套传入 422);GET /configuration返回并列slideshow。仅更新 slideshow 时不再构造空展示配置补丁。 - 幂等:创建、PATCH、configuration PUT、route-tree PUT 的指纹改用
model_dump(exclude_unset=True),区分“省略”和“显式 null”;相同键配合不同放映参数或路由覆盖写回语义时返回 409IDEMPOTENCY_KEY_REUSE_WITH_DIFFERENT_PAYLOAD。 - 能力自省:
GET /api/v1/workspaces/{id}/capabilities新增严格类型slideshow;M0 声明none/fade/push+manual,三个 auto_play 能力均 false,范围 100–2000ms / 1000–3600000ms。 - 生成类型:运行
pnpm run codegen:editor-api→ 351 schemas;test:contracts:generated一致。 - 验证:
pytest tests/api/test_external_project_slideshow.py→ 5 passed;pytest tests/api/test_external_api_v1.py tests/api/test_external_contract_gaps.py→ 25 passed(含既有扁平配置兼容)。 - 未运行:
pnpm run test:contracts:gateway(需要真实 Gateway 运行环境);未实现 CLI/MCP 命令(WP19/WP20)。