3.7 KiB
3.7 KiB
TDD 实施计划(MVP)
日期:2026-05-13
设计结论
首版采用:
packs/openai-cn-pack/:真实可校验模型包internal/pack:pack 装载、checksum 校验、provider schema 校验internal/provision:导入编排服务internal/host/sub2api:宿主 admin/gateway 适配cmd/cli import-provider:一键导入入口
TDD 顺序
- 先写
internal/pack/loader_test.go- 成功装载 pack
- checksum mismatch 失败
- provider schema 非法失败
- 再写
internal/provision/import_service_test.go- subscription 模式成功导入
- strict 模式探测失败直接失败
- 参数非法拒绝
- 再补宿主适配器集成测试
CheckGatewayAccess()能校验/v1/models
- 最后补 CLI 测试
import-provider参数解析- 输出状态摘要
当前确认后的宿主契约
基于 sub2api-official-fresh 宿主源码二次核对,当前 CRM 需要明确依赖以下宿主实现逻辑:
- channel payload 不是扁平
model_mapping- 宿主管理接口实际接收:
map[string]map[string]string - CRM 仍可在内部保留
map[string]string,但序列化时必须按 platform 包成嵌套结构
- 宿主管理接口实际接收:
- channel
model_pricing[].platform不能留空- 宿主 create/update handler 会把空 platform 回退为
anthropic - 对 OpenAI-compatible provider,CRM 必须显式写入 provider platform;若调用方未给值,至少回退到
openai
- 宿主 create/update handler 会把空 platform 回退为
- channel 完整收口字段必须同时存在
model_mappingmodel_pricingrestrict_models=truebilling_model_source=channel_mapped
- subscription access 的最终 probe key 是 managed key
- 宿主 user
/api/v1/keys创建 key 时不要求携带group_id - group 绑定是后续管理员
PUT /api/v1/admin/api-keys/:id动作 - gateway
/v1/models鉴权/订阅校验走绑定后的 managed key,而不是外部传入原始 key
- 宿主 user
/v1/models与/v1/chat/completions不能混为同一层验收- 宿主 API key middleware 会先做 key/user/group/subscription/balance 校验
/v1/models通过只证明普通用户访问链路与 group/subscription 绑定成立,不自动证明 completion 可用
当前验证缺口
- 回滚删除链路尚未接入真实宿主 HTTP 路径,当前仅在服务层保留失败状态,不宣称真实宿主回滚已闭环
- completion 兼容性仍是独立层,不能由 account/channel 落库测试替代
- 需要把上面的宿主契约固化进单测,避免 future drift
追加测试设计
internal/host/sub2api/sub2api_test.goTestCreateChannelWithMock- 断言创建 channel 时下发完整
model_mapping/model_pricing/restrict_models/billing_model_source
- 断言创建 channel 时下发完整
TestUpdateChannelWithMock- 断言既有 channel 纠偏走
PUT /api/v1/admin/channels/:id
- 断言既有 channel 纠偏走
TestCreateChannelRequestMarshalJSONDefaultsPricingPlatform- 断言 pricing platform 空值时优先回退
request.Platform,再回退openai
- 断言 pricing platform 空值时优先回退
TestEnsureSubscriptionAccessWithMock- 断言 managed key 创建与 admin bind group 分两步完成
internal/access/closure_test.go- 断言 subscription closure 最终 probe 使用 managed key,而不是显式传入的 caller probe key
internal/provision/import_service_test.goTestImportCreatesChannelWithManifestModelMappingTestImportReconcilesExistingChannelConfiguration- 断言 buildChannelRequest 生成的 channel 配置能直接满足宿主 channel handler 的最小契约
完成标准
go test ./internal/host/sub2api ./internal/access ./internal/provision -count=1通过- 关键宿主契约均有单测覆盖
- CLI 能从真实 pack 读取 provider
- 导入报告明确输出 batch/provider/access 三种状态