diff --git a/docs/superpowers/specs/2026-05-16-channel-selection-removal-design.md b/docs/superpowers/specs/2026-05-16-channel-selection-removal-design.md new file mode 100644 index 0000000..03fc6c2 --- /dev/null +++ b/docs/superpowers/specs/2026-05-16-channel-selection-removal-design.md @@ -0,0 +1,98 @@ +--- +title: 完整删除渠道选择功能 +date: 2026-05-16 +status: approved +--- + +# 设计方案:完整删除渠道选择功能 + +## 背景 + +渠道选择功能允许用户强制指定使用某个具体渠道,而非系统自动分发。有 3 个入口: +1. Token 密钥格式 `sk-{key}:{channelId}` +2. Playground 通道下拉框 +3. 渠道列表 API (`GET /api/user/model_channels`, `GET /api/user/channels`) + +此外还有 `is_default` 默认渠道标记功能,用于 Playground 下拉框的默认选中项和定价页面的默认通道显示。 + +**删除原因**:该功能增加代码复杂度且线上无用户使用。 + +## 决策 + +- **方案**:一次性完整删除(方案 A) +- **is_default 数据库字段**:保留列,不执行 migration,只删除功能代码 +- **Distribute() 自动分发**:完全保留 +- **线上用户影响**:无,已确认无用户使用 `sk-xxx:channelId` 格式 + +## 后端改动 + +### Middleware 层 + +**`middleware/auth.go`**: +- `parseTokenKey()` 简化为只提取 key,去掉冒号和短横线分割 channelId 的逻辑 +- `SetupContextForToken()` 删除第 412-415 行的 `specific_channel_id` context 设置 + +**`middleware/distributor.go`**: +- `ModelRequest` 结构体删除 `ChannelId int` 字段 +- `Distribute()` 删除第 39-62 行的 `specific_channel_id` 分支,直接进入自动分发 +- `getModelRequest()` 删除第 377-382 行的 channel_id body/header 处理 + +### Controller 层 + +- **删除整个** `controller/playground_channels.go` +- `controller/relay.go`:删除 `shouldRetry()` 和 `shouldRetryTaskRelay()` 中 `specific_channel_id` 判断 +- `controller/channel.go`:删除 `GetUserChannelsForBinding()` +- `controller/channel_pricing.go`:删除 `SetDefaultChannel()` 和 `ClearDefaultChannel()` 控制器函数 + +### Model 层 + +- `model/ability.go`:删除 `GetModelChannelsForGroup()` +- `model/channel.go`:删除 `GetAllChannelsForBinding()` +- `model/channel_pricing.go`:删除 `GetDefaultChannelId()`、`SetDefaultChannel()`、`ClearDefaultChannel()`、`defaultChannelCache` 缓存及其锁和辅助函数 +- `model/pricing.go`:删除 `PricingModel.DefaultChannelName` 字段及其赋值逻辑 +- `model/channel_pricing_test.go`:删除相关测试用例 + +### 路由和常量 + +- `constant/context_key.go`:删除 `ContextKeyTokenSpecificChannelId` +- `router/api-router.go`:删除 4 条路由(`model_channels`、`channels`、`/set_default`、`/default/*name`) +- `i18n/keys.go`:删除 `MsgChannelIdFormatError`、`MsgDistributorInvalidChannelId` +- `i18n/locales/*.yaml`:删除对应翻译条目 + +## 前端改动 + +### Playground 相关 + +| 文件 | 操作 | +|------|------| +| `web/src/components/playground/SettingsPanel.jsx` | 删除通道选择 `