feat: 实现 MVP-1 路由核心、故障转移与熔断状态 (#19) #21

Closed
opened 2026-08-21 16:07:26 +08:00 by ila · 0 comments
Owner

基本信息

  • 类型:需求
  • 所属 Epic:#3
  • 所属 MVP / 版本:#19 / MVP-1
  • 阶段:已完成

原始需求

  • 来源:用户对话与已确认 MVP-1 技术设计、管理端原型 #17、用户端原型 #18。
  • 提出时间:2026-08-21
  • 脱敏摘要:按已确认 MVP-1 范围建立生产实现单元工单。

实施记录(2026-08-21)

  • 新增 internal/core/router:能力映射、无密钥 RouteSnapshot 编码与 generation 字段写入、加权无放回候选、最大故障转移、稳定路由错误码和 retryable 行为。
  • 新增只读 GORMRepository.ActiveSnapshot:按活动绑定、路由池、模板、启用成员与显式能力查询;它不选择 Provider base_url、API Key 或密文。无绑定返回 route_not_configured,无可用成员返回 route_unavailable。
  • 定义 worker 后续使用的跨进程熔断 runtime 预留/观测仓储契约;#22 负责其原子数据库实现和上游调用,当前工单不调用上游、不改 portal/UI。
  • 补齐 #20 已迁移的 PromptTemplate/Generation/GenerationInput 路由字段模型与 schema 契约,允许同步提交只持久化快照和 rendered prompt。
  • 验证通过:go test -race -count=1 ./internal/core/router;隔离 MySQL 8 的 CHORUS_TEST_DSN 路由快照测试;go build ./...、go vet ./...、go test -count=1 ./...、python dev_scripts/harness.py check --strict、python -m unittest discover -s tests -v(42 项)。
  • 提交:9b2827a,已推送至 main。
  • 长期文档影响:无。实现严格落在 #16 已确认的路由/熔断数据与错误码契约内,未新增外部入口、配置或业务规则。
  • 任务归档:Task-21-MVP-1-路由核心与故障转移,revision 1b86d4431eac6e73dcb293f5ba81208127dae040;仅保存在 Wiki,未导出 docs/task/。

文档影响

  • 不影响长期文档,原因:本工单实现已确认设计;入口、契约、规则或验证方法确有变化时,在验收前更新相应核心 Wiki。
  • 更新项目档案或本地开发与验证
  • 更新架构与代码地图
  • 更新业务规则与术语
  • 更新常见修改或故障排查
  • 更新其他 Wiki 页面:

交付文档影响

  • 无交付文档影响,原因:本工单交付内部实现,最终用户操作文档待功能集成后统一评估。
  • 更新已有交付文档,受众与页面:
  • 新增交付文档,受众与页面:

变更控制

  • 不增加计费扣点、支付、配额、内容审核、公开注册、MVP-2 API Key/openapi 或其他已排除范围。
  • 不使用真实 Provider 额度进行调试;自动化与开发使用 mock。
  • 实施开始前复核依赖工单、工作区和已确认设计;完成后保持“待验收”,由用户明确验收后关闭。

依赖与并行

  • 前置工单:#20
  • 是否允许并行:否;需要已落地的路由与 runtime 数据结构。

目标与范围

在 internal/core 和相应 repository 边界实现能力匹配、活动路由快照、正权重无放回候选、max_failover、稳定错误码、retryable 分类和数据库熔断 runtime 契约。

不实现具体 Provider HTTP 协议、管理 API/UI、portal 页面或真实探测。

已确认方案

internal/core 不得 import gin 或 go-admin,只依赖 GORM/标准库。候选仅来自启用、能力匹配、未熔断成员;同一 ProviderModel 在单个 generation 至多一次。429/5xx/超时/连接错误换家;400/401/内容策略立即返回,401 同时打开后续任务避开该成员的 circuit。数据库 runtime 负责跨 worker 排除,gobreaker 仅作进程内快速保护。

验收标准

  • 路由快照包含版本、模板和不含密钥的成员信息;同步提交不调用上游。
  • 权重、无放回、停用/open/能力不匹配跳过、half-open 探测上限与 max_failover=0/N 被单元测试覆盖。
  • route_not_configured、route_unavailable、failover_exhausted 和 retryable 红线稳定且脱敏。
  • 429、5xx、超时、连接错误与 400、401、策略拒绝均有对应单元测试。

验证

  • 运行 core/repository 单元测试和 race 相关测试。
  • 验证 internal/core import 边界及不含上游调用的同步提交流程。

用户验收(2026-08-21)

  • 用户明确确认 #21 验收通过。
  • 实现提交:9b2827a727da31d75d2013bae74bff12f4d0f8e7,已推送至 main。
  • 任务归档:Task-21-MVP-1-路由核心与故障转移,revision 1b86d4431eac6e73dcb293f5ba81208127dae040;未导出 docs/task/。
## 基本信息 - 类型:需求 - 所属 Epic:#3 - 所属 MVP / 版本:#19 / MVP-1 - 阶段:已完成 ## 原始需求 - 来源:用户对话与已确认 MVP-1 技术设计、管理端原型 #17、用户端原型 #18。 - 提出时间:2026-08-21 - 脱敏摘要:按已确认 MVP-1 范围建立生产实现单元工单。 ## 实施记录(2026-08-21) - 新增 `internal/core/router`:能力映射、无密钥 `RouteSnapshot` 编码与 generation 字段写入、加权无放回候选、最大故障转移、稳定路由错误码和 retryable 行为。 - 新增只读 `GORMRepository.ActiveSnapshot`:按活动绑定、路由池、模板、启用成员与显式能力查询;它不选择 Provider `base_url`、API Key 或密文。无绑定返回 `route_not_configured`,无可用成员返回 `route_unavailable`。 - 定义 worker 后续使用的跨进程熔断 runtime 预留/观测仓储契约;#22 负责其原子数据库实现和上游调用,当前工单不调用上游、不改 portal/UI。 - 补齐 #20 已迁移的 PromptTemplate/Generation/GenerationInput 路由字段模型与 schema 契约,允许同步提交只持久化快照和 rendered prompt。 - 验证通过:`go test -race -count=1 ./internal/core/router`;隔离 MySQL 8 的 `CHORUS_TEST_DSN` 路由快照测试;`go build ./...`、`go vet ./...`、`go test -count=1 ./...`、`python dev_scripts/harness.py check --strict`、`python -m unittest discover -s tests -v`(42 项)。 - 提交:`9b2827a`,已推送至 `main`。 - 长期文档影响:无。实现严格落在 #16 已确认的路由/熔断数据与错误码契约内,未新增外部入口、配置或业务规则。 - 任务归档:Task-21-MVP-1-路由核心与故障转移,revision 1b86d4431eac6e73dcb293f5ba81208127dae040;仅保存在 Wiki,未导出 docs/task/。 ## 文档影响 - [x] 不影响长期文档,原因:本工单实现已确认设计;入口、契约、规则或验证方法确有变化时,在验收前更新相应核心 Wiki。 - [ ] 更新项目档案或本地开发与验证 - [ ] 更新架构与代码地图 - [ ] 更新业务规则与术语 - [ ] 更新常见修改或故障排查 - [ ] 更新其他 Wiki 页面: ## 交付文档影响 - [x] 无交付文档影响,原因:本工单交付内部实现,最终用户操作文档待功能集成后统一评估。 - [ ] 更新已有交付文档,受众与页面: - [ ] 新增交付文档,受众与页面: ## 变更控制 - 不增加计费扣点、支付、配额、内容审核、公开注册、MVP-2 API Key/openapi 或其他已排除范围。 - 不使用真实 Provider 额度进行调试;自动化与开发使用 mock。 - 实施开始前复核依赖工单、工作区和已确认设计;完成后保持“待验收”,由用户明确验收后关闭。 ## 依赖与并行 - 前置工单:#20 - 是否允许并行:否;需要已落地的路由与 runtime 数据结构。 ## 目标与范围 在 internal/core 和相应 repository 边界实现能力匹配、活动路由快照、正权重无放回候选、max_failover、稳定错误码、retryable 分类和数据库熔断 runtime 契约。 不实现具体 Provider HTTP 协议、管理 API/UI、portal 页面或真实探测。 ## 已确认方案 internal/core 不得 import gin 或 go-admin,只依赖 GORM/标准库。候选仅来自启用、能力匹配、未熔断成员;同一 ProviderModel 在单个 generation 至多一次。429/5xx/超时/连接错误换家;400/401/内容策略立即返回,401 同时打开后续任务避开该成员的 circuit。数据库 runtime 负责跨 worker 排除,gobreaker 仅作进程内快速保护。 ## 验收标准 - [x] 路由快照包含版本、模板和不含密钥的成员信息;同步提交不调用上游。 - [x] 权重、无放回、停用/open/能力不匹配跳过、half-open 探测上限与 max_failover=0/N 被单元测试覆盖。 - [x] `route_not_configured`、`route_unavailable`、`failover_exhausted` 和 retryable 红线稳定且脱敏。 - [x] 429、5xx、超时、连接错误与 400、401、策略拒绝均有对应单元测试。 ## 验证 - 运行 core/repository 单元测试和 race 相关测试。 - 验证 internal/core import 边界及不含上游调用的同步提交流程。 ## 用户验收(2026-08-21) - 用户明确确认 #21 验收通过。 - 实现提交:`9b2827a727da31d75d2013bae74bff12f4d0f8e7`,已推送至 `main`。 - 任务归档:Task-21-MVP-1-路由核心与故障转移,revision `1b86d4431eac6e73dcb293f5ba81208127dae040`;未导出 `docs/task/`。
ila closed this issue 2026-08-21 18:06:12 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/chorus#21