Files
supply-intelligence/specs/功能清单.md
2026-05-07 10:16:46 +08:00

17 KiB
Raw Permalink Blame History

Supply Intelligence 功能清单(按钮级任务版)

状态说明2026-05 收敛修订):本文件为旧版按钮级任务清单,已不再作为当前实施真源。 当前实施真源以“2026-05 新 PM 基线 + tech/BASELINE_TECHLEAD_V2.md + 首期消费闭环决议”为准。 下列旧任务类型已明确废止或降期,不得继续直接派发给 Engineer

  • gateway 管理接口热更新主路径
  • pricing / prediction / 向量检索 / SFI 仪表盘等超范围能力
  • 自动注册深链路作为本期硬门槛
  • 以 Temporal / 独立 worker / 独立平台骨架为默认落地前提

版本v1.0 日期2026-04-27 说明:每个任务 5 分钟可完成,可直接安排进任务管理


Phase 1模块 A探针+ 模块 E工作台只读观测

模块 A1探针管理基础

A1.1 供应商账号列表页

  • 任务:实现供应商账号列表页路由 /supply/dashboard/accounts
  • 任务在账号列表渲染数据表格每行显示账号ID / 供应商名称 / 账号标识(昵称) / 当前状态(徽章) / 风险评分 / 最近探针时间 / 操作
  • 任务账号状态徽章颜色active=绿色 / suspended=黄色 / disabled=红色
  • 任务账号行风险评分显示为进度条0-100>80 显示红色
  • 任务:账号行渲染"查看详情"按钮,点击展开显示最近 5 次探针结果
  • 任务:账号列表支持分页,每页 50 条
  • 任务:账号列表支持按供应商名称筛选(下拉框)
  • 任务:账号列表支持按状态筛选(全部 / active / suspended / disabled
  • 任务:账号列表支持按风险评分范围筛选(滑块)

A1.2 账号详情页

  • 任务:实现账号详情页路由 /supply/dashboard/accounts/{account_id}
  • 任务详情页渲染账号基本信息区块账号ID / 供应商 / 状态 / 创建时间 / 最近探针时间
  • 任务:详情页渲染探针历史时间线,每条显示:探针时间 / 结果(成功/失败/不可判定) / 延迟 / HTTP状态码 / 风险评分
  • 任务:详情页渲染"手动触发探针"按钮,点击后立即执行一次探针,显示加载状态,完成后刷新时间线
  • 任务:详情页渲染"暂停此账号探针"开关按钮(默认关闭),开启后该账号不参与自动探针
  • 任务:详情页渲染"查看历史状态变更"按钮,点击展开状态变更记录(时间 / 从 → 到 / 原因)

A1.3 探针后端核心

  • 任务:实现探针调度器(基于主仓既有调度能力或轻量本地调度器,每 5 分钟轮询所有 active/suspended 账号)
  • 任务:实现探针执行器,对单个账号发起 HTTP GET/POST 请求,记录响应码/延迟/返回体
  • 任务实现探针结果评估逻辑HTTP 200 = 成功 / 401/403 = 明确失败 / 429/5xx/超时/格式突变 = 不可判定
  • 任务:实现状态机:active 收到 1 次 explicit_failure → suspendedsuspended 连续 3 次 explicit_failure → disabled
  • 任务:实现 429/暂时性错误指数退避1min → 2min → 4min 重试,超 3 次则本次跳过并保留状态
  • 任务:实现探针结果写入 supply_intelligence_probe_logs 表,保留 30 天

模块 A2供应商适配层

A2.1 供应商适配器框架

  • 任务:定义 SupplierAdapter 接口:(Probe(ctx context.Context, account Account) ProbeResult, GetModels(ctx context.Context, account Account) ([]Model, error))
  • 任务:实现 SupplierAdapterRegistry map按供应商名称注册适配器实例
  • 任务:实现配置文件加载供应商适配器列表(suppliers[].name + suppliers[].adapter
  • 任务每个适配器实现health check端点探测发送测试请求验证连通性

A2.2 Phase 1 目标供应商适配2个

  • 任务:实现 OpenAI 供应商适配器Probe用 /v1/models 查询;获取模型列表:用 /v1/models
  • 任务:实现 Anthropic 供应商适配器Probe用 /v1/models 查询;获取模型列表:用 /v1/models
  • 任务适配器配置项API Base URL / API Key加密存储/ 是否允许受控自动补给 / Rate Limit 阈值

模块 E1运营工作台只读观测部分

E1.1 工作台首页

  • 任务:实现工作台首页路由 /supply/dashboard
  • 任务:首页渲染 4 个统计卡片:账号总数(按状态颜色分段) / 本小时新发现模型数 / 待处理候选模型数 / 受控自动补给任务队列长度
  • 任务:首页渲染候选处理与账号健康摘要(避免引入 SFI 仪表盘等超范围指标体系)
  • 任务:首页渲染"探针健康度"简表显示各供应商最后探针结果绿色OK/黄色不可判定/红色明确失败/灰色未探)

E1.2 待处理事项列表

  • 任务:在工作台首页渲染"待处理" Tab展示以下待办项
    • 风险评分 > 70 的账号(红色高亮)
    • 状态 = discovered 的候选模型(待准入测试)
    • 受控自动补给失败或待验证的任务(待人工介入)
    • 模型已下架告警(待确认)
  • 任务:每项待办渲染"处理"按钮,点击进入对应详情页
  • 任务:每项待办渲染"忽略"按钮点击后该项从待办列表暂时移除3小时后重现

Phase 2模块 B模型发现+ 模块 C准入测试

模块 B1模型发现

B1.1 模型列表页

  • 任务:实现模型列表页路由 /supply/dashboard/models
  • 任务模型列表每行显示模型ID / 所属供应商 / 当前状态(活跃/草稿/已下线/发现中/测试失败) / 发现时间 / 来源
  • 任务:状态筛选 Tab全部 / 发现中 / 待测试 / 活跃 / 已下线
  • 任务:模型列表支持按供应商筛选
  • 任务:模型列表支持按发现时间范围筛选
  • 任务:模型行点击"查看详情"进入模型详情页

B1.2 模型发现后端

  • 任务:实现模型发现调度任务(基于主仓既有调度能力或轻量本地调度器),每 1 小时触发一次扫描
  • 任务:实现模型列表抓取器:调用各供应商适配器的 GetModels() 方法
  • 任务:实现模型比对逻辑:将抓取的模型列表与 supply_packages 中 active/paused/draft 记录去重
  • 任务:发现新模型时,写入 supply_intelligence_model_candidatesstatus = discovered
  • 任务:发现模型下架时(供应商列表有、平台 active 记录也有但 ID 消失),写入运营告警,不改变 package 状态
  • 任务实现模型来源记录discovery_source 字段official_api / manual_import

模块 C1准入测试

C1.1 准入测试配置

  • 任务:实现测试用例管理页路由 /supply/dashboard/tests/cases
  • 任务测试用例列表每行显示用例ID / 所属模型类型 / 测试目标(endpoint) / 状态(启用/禁用)
  • 任务:渲染"新增用例"按钮点击弹出用例创建表单endpoint地址 / 请求方法 / 预期响应格式 / 超时时间)
  • 任务测试用例表单支持选择模板chat/completion/embedding
  • 任务:实现每个模型类型默认测试用例集(≥ 5 个用例)

C1.2 准入测试执行

  • 任务:实现准入测试任务流,接收 candidate_id 参数并由主仓既有调度能力或轻量任务执行器驱动
  • 任务AdmissionTestWorkflowmodel_candidates 加载 discovered 状态的候选模型
  • 任务:按顺序执行所有启用的测试用例,记录每条的 HTTP 状态/延迟/响应格式/Token 计数
  • 任务:所有用例返回 HTTP 200 + 格式正确 → 更新 candidate status = test_passed生成 supply_package 草稿
  • 任务:任意用例返回非 200 或格式错误 → 更新 candidate status = test_failed写入 failure_reason
  • 任务单个用例超时60 秒)→ 标记为 timeout整体判定失败
  • 任务:准入测试完成后,发送飞书通知给运营人员

C1.3 草稿生成

  • 任务:准入测试通过后,自动生成 supply_packages 草稿记录status = draft
  • 任务草稿字段platform / model_id / model_name / price_per_1m_input默认值/ price_per_1m_output默认值/ suggested_by = si_auto
  • 任务:草稿生成后,在工作台"待上架"列表中显示该草稿

Phase 3模块 D受控自动补给+ 模块 E工作台完整干预

模块 D1受控自动补给配置

D1.1 自动补给设置页

  • 任务:实现自动补给设置页路由 /supply/dashboard/auto-supply/settings
  • 任务:页面渲染供应商列表,每行显示:供应商名称 / 是否开启受控自动补给(开关)/ 可用账号阈值(数字输入)/ 状态
  • 任务:点击供应商行"配置"按钮,弹出自动补给配置弹窗
  • 任务:配置弹窗字段:启用自动补给(开关)/ 白名单供应商标记 / 触发阈值(账号数)/ 补给方式(任务化/人工补录入口)/ 审批要求
  • 任务:弹窗保存后,按主仓既有配置方式持久化并生效,不引入 Redis 首期前置依赖
  • 任务:配置页顶部渲染"通知/补给受理链路测试"按钮,点击后发送测试通知或验证受理接口可达

D1.2 自动补给执行后端

  • 任务:实现受控自动补给任务流,监控白名单供应商可用账号数 < 阈值时触发
  • 任务:按供应商配置创建补给任务或调用受控补给受理接口,禁止默认走浏览器自动化注册深链路
  • 任务:补给成功后写入待验证/待启用记录,不允许绕过验证直接进入 active
  • 任务:若涉及凭证写入,则将密钥发送至 KMS 加密,密文存入 supply_accounts
  • 任务:触发验证或人工审核链路,验证通过后再进入可用状态
  • 任务:补给失败时,写入 supply_intelligence_auto_supply_tasks 或等价任务表status = failed记录失败原因

模块 D2Fail-closed 安全机制

  • 任务:补给流程中,若通知网关/补给受理接口返回 503 或超时,任务立即标记为 failed不执行虚假成功写操作
  • 任务:补给流程中,若 KMS 加密超时60 秒),任务立即标记为 failed
  • 任务:明文凭证在内存中的存活时间不超过 60 秒,超时自动清除
  • 任务:审计日志中记录补给请求/响应(脱敏后:隐藏敏感标识、隐藏凭证)

模块 E2工作台完整干预

E2.1 候选模型处理

  • 任务:工作台"待上架模型"列表每行显示模型ID / 供应商 / 发现时间 / 测试结果摘要 / 来源
  • 任务:模型行渲染"查看测试详情"按钮,点击展开显示所有测试用例结果(每条:通过/失败/超时)
  • 任务:模型行渲染"确认上架"绿色按钮,点击后弹出确认框(显示将生成的 package 草稿内容)
  • 任务:模型行渲染"忽略"按钮,点击后该模型 7 天内不出现(写入 ignored_until 字段)
  • 任务:模型行渲染"手动强制上架"橙色按钮(仅测试失败时可见),点击后需填写强制上架理由(必填)

E2.2 草稿确认上架

  • 任务:点击"确认上架"后PUT supply_packages/{id} status = active
  • 任务:同时更新 model_candidates 对应记录 status = published
  • 任务:写入 gateway package change event等待首期消费方按决议链路拉取并 ack
  • 任务:完成后显示成功提示:"模型已上架,已生成待消费变更事件;是否进入路由以消费方 ack 为准"

E2.3 工单与通知

  • 任务:模型下架告警 → 自动生成运营工单(类型 = model_deprecated推送到运营工作台
  • 任务:受控自动补给失败 → 自动生成运营工单(类型 = auto_supply_failed推送飞书通知
  • 任务:连续 3 次探针失败账号 → 生成运营工单(类型 = account_risk推送飞书通知

全局模块

模块 G1供应商配置管理

  • 任务:实现供应商列表页路由 /supply/dashboard/settings/suppliers
  • 任务供应商列表每行显示供应商ID / 名称 / 适配器类型 / 账号数量 / 接口状态 / 操作
  • 任务:渲染"添加供应商"按钮,点击弹出供应商创建表单
  • 任务:供应商表单字段:名称 / 适配器类型(下拉) / API Base URL / API Key加密存储/ 探针周期(默认5min) / 是否启用
  • 任务:实现供应商"测试连通性"按钮,点击后执行一次 probe 并显示结果
  • 任务:供应商配置变更后,刷新当前集成运行实例中的适配器装配或调度配置(不得以 Temporal Worker 作为首期前置依赖)

模块 G2配置热更新

  • 任务:关键配置项(探针周期/扫描周期/阈值)按主仓既有配置方式存储与生效,避免把 Redis 作为首期前置依赖
  • 任务:实现 GET /api/v1/supply-intelligence/config 接口,返回当前生效配置
  • 任务:实现 PUT /api/v1/supply-intelligence/config 接口,修改配置后 60 秒内生效
  • 任务配置变更生成审计日志记录action = config_update
  • 任务:不支持的配置项修改返回 400 错误码

模块 G3OpenAPI + 健康检查

  • 任务:实现 GET /actuator/health / /actuator/health/live / /actuator/health/ready
  • 任务:实现 Swagger UI 路由 /docs
  • 任务:实现 OpenAPI 3.0 spec 端点 /openapi.json
  • 任务:实现关键后台任务执行链路健康检查,调度/执行链路不可用时 /actuator/health/ready 返回 503

模块 G4权限与认证

  • 任务:实现 JWT 认证中间件(与立连桥统一认证打通)
  • 任务:实现角色权限:运营人员(观测 + 部分操作)/ 管理员(全部操作)
  • 任务:权限不足返回 HTTP 403错误码 SUP_INT_AUTH_1001

技术基础设施

T1项目骨架

  • 任务:初始化或挂载到主仓中的 Go module / 子模块边界,保持与 supply-api 一致的技术栈约束
  • 任务:创建集成运行入口;如保留独立运行,也仅作为轻量可选形态,不以双进程 api/worker 为首期强依赖
  • 任务:创建 internal/ 目录结构domain/service/handler/infrastructure/repository
  • 任务:配置 Viper 读取 config.yaml,支持环境变量覆盖
  • 任务:配置 log/slog 结构化日志,输出 JSON 格式
  • 任务:创建 PostgreSQL schema migration使用 golang-migrate表前缀 supply_intelligence_
  • 任务:按主仓既有能力接入配置、调度、审计与内部路由,不额外引入 Redis 作为首期前置依赖
  • 任务:配置 Dockerfile 和最小部署说明,优先支持主仓集成部署
  • 任务:如需部署文档,仅按当前真源补充最小启动命令,不再回写旧 DEPLOYMENT.md 为实现依据

T2单元测试骨架

  • 任务:为每个 domain 层函数编写单元测试,覆盖率 >= 70%
  • 任务:为每个 service 层函数编写单元测试,覆盖率 >= 80%
  • 任务:配置 CIGitHub ActionsPR 必须通过全部测试和覆盖率检查

T3IntegrationPlugin 接口

  • 任务:实现 IntegrationPlugin 接口(Init() error / Serve() error / Shutdown() error
  • 任务:实现插件模式下各模块的开关配置(viper 读取 supply_intelligence.enabled_modules
  • 任务:实现内部/外部路径前缀可配置,并区分 /internal/supply-intelligence/ 与对外暴露路径
  • 任务:编写集成测试:插件模式启动,关键探针/发现/发布事件接口与内部消费接口正常运作

任务估算汇总

Phase 模块 任务数 估计工时
Phase 1 A1 探针管理 + A2 适配层 + E1 工作台只读 34 3 人天
Phase 2 B1 模型发现 + C1 准入测试 22 3 人天
Phase 3 D1/D2 受控自动补给 + E2 工作台干预 24 3 人天
全局 G1 供应商配置 + G2 配置热更新 + G3 OpenAPI + G4 权限认证 18 2 人天
技术基础设施 T1 骨架 + T2 测试 + T3 插件 14 2 人天
合计 112 ~13 人天