9.3 KiB
9.3 KiB
模型目录管理系统重构 - 完整实施报告
项目概述
本次重构实现了前台模型虚拟渠道与系统渠道模型的双模式支持,通过 frontendModelsEnabled 开关控制模型目录的来源和任务创建的校验逻辑。
实施范围
后端实现 (Backend)
1. 核心功能开关
- 文件:
internal/service/feature_availability.go - 功能: 添加
frontendModelsEnabled字段,默认值true - 状态: ✅ 完成
2. 错误码体系
- 文件:
internal/service/errors.go - 功能: 定义6个明确的模型错误码
- 错误码列表:
model_capability_not_supportedmodel_price_not_configuredmodel_route_unavailableprovider_request_failedmodel_catalog_mismatchinvalid_model_selection
- 状态: ✅ 完成
3. 数据模型扩展
- 文件:
internal/model/models_logical_model.go - 功能: 新增
LogicalModelPriceSKU结构体 - 用途: 支持统一定价模式的独立售价 SKU
- 状态: ✅ 完成
4. 价格校验逻辑
- 文件:
internal/service/price_validation.go - 功能:
ValidateChannelModelPrice- 根据 billingMode 校验价格ComputePriceConfigured- 自动派生价格标志HasValidPrice- 检查价格有效性
- 状态: ✅ 完成
5. 统一价格展示
- 文件:
internal/service/logical_models.go - 功能: 在
PublicLogicalModel中添加:PricingMode- 价格模式DisplayPrice- 展示价格PriceLabel- 价格标签
- 状态: ✅ 完成
6. 统一模型目录接口
- 文件:
internal/service/model_catalog.go - 功能:
GET /api/model-catalog- 统一目录接口POST /api/model-catalog/available- 能力过滤POST /api/model-catalog/quote- 价格报价
- 返回数据: 根据开关返回前台模型或脱敏的系统渠道模型
- 状态: ✅ 完成
7. 任务入口强制分流
- 文件:
internal/service/task_creation.go - 功能:
- 前台模式: 必须有
logicalModelId - 系统模式: 禁止
logicalModelId,校验系统渠道模型
- 前台模式: 必须有
- 状态: ✅ 完成
前端实现 (Frontend)
1. 类型定义更新
- 文件:
web/src/stores/use-user-store.ts - 功能: 在
FeatureAvailability类型中添加frontendModelsEnabled - 状态: ✅ 完成
2. 管理界面更新
- 文件:
web/src/pages/admin/components/feature-availability-panel.tsx - 功能:
- 添加"前台模型目录"开关项
- 使用 Sparkles 图标
- 关闭时显示二次确认对话框
- 状态: ✅ 完成
访问路径
管理员入口
管理员可以通过以下路径访问功能开关设置:
应用首页 -> 管理后台 -> 功能开放 -> 前台模型目录开关
或直接访问:
/admin/features
开关配置项
| 字段 | 标题 | 图标 | 默认值 | 描述 |
|---|---|---|---|---|
frontendModelsEnabled |
前台模型目录 | ✨ | true |
开启时使用前台模型虚拟渠道,关闭时使用系统渠道模型 |
工作模式
模式 1: 前台模型模式 (frontendModelsEnabled = true)
特点:
- 用户目录来源: 前台模型虚拟渠道
- 任务创建要求: 必须提供
logicalModelId - 路由机制: 通过 LogicalModelRoute 路由到具体渠道模型
- 价格来源: Revision + 路由 + 渠道价格档 / 前台 SKU
适用场景:
- 需要对用户隐藏底层渠道细节
- 需要统一的模型目录和品牌
- 需要前台独立定价
模式 2: 系统渠道模式 (frontendModelsEnabled = false)
特点:
- 用户目录来源: 脱敏的系统渠道模型
- 任务创建要求: 禁止
logicalModelId,必须指定系统渠道模型 - 路由机制: 直接调用指定的渠道模型
- 价格来源: ChannelModel 能力和渠道价格档
适用场景:
- 简化模型管理,直接使用系统渠道
- 无需配置前台模型路由
- 快速上线和测试
数据流图
前台模型模式
用户请求
↓
GET /api/model-catalog
↓
返回前台模型目录 (source: "frontend")
↓
用户选择模型 + logicalModelId
↓
POST /api/tasks (带 logicalModelId)
↓
ResolveLogicalModel 路由
↓
调用渠道模型执行
系统渠道模式
用户请求
↓
GET /api/model-catalog
↓
返回脱敏的系统渠道模型 (source: "system")
↓
用户选择渠道 + 模型
↓
POST /api/tasks (带 channelId + model)
↓
validateSystemChannelModelSelection
↓
调用渠道模型执行
待完成事项
高优先级
-
⏳ 数据库迁移脚本
- 创建
logical_model_price_skus表 - 为现有模型添加默认 SKU
- 创建
-
⏳ 路由注册
- 在
cmd/server/main.go中注册RegisterModelCatalogRoutes
- 在
-
⏳ 前端接口切换
- 修改前端模型选择器,调用新的
/api/model-catalog接口 - 移除对旧接口的直接调用
- 修改前端模型选择器,调用新的
中优先级
-
⏳ 系统渠道报价逻辑
- 实现
POST /api/model-catalog/quote中系统模式的报价
- 实现
-
⏳ SKU 管理后台
- 添加前台 SKU 的 CRUD 接口
- 实现 selector 覆盖校验
-
⏳ 单元测试
- 价格校验逻辑测试
- 任务入口分流测试
- 模型目录接口测试
低优先级
-
⏳ 前端适配优化
- 根据
source字段优化 UI 展示 - 添加模式切换提示
- 根据
-
⏳ 文档完善
- API 文档
- 用户手册
- 管理员指南
测试清单
后端测试
- 功能开关读取和更新
- 前台模式任务创建(带 logicalModelId)
- 系统模式任务创建(带 channelId + model)
- 模式切换后的任务创建校验
- 价格有效性校验
- 统一目录接口返回数据正确性
前端测试
- 管理界面开关切换
- 二次确认对话框显示
- 配置保存和刷新持久化
- 非管理员权限限制
集成测试
- 开启前台模式 -> 创建任务 -> 执行成功
- 关闭前台模式 -> 创建任务 -> 执行成功
- 模式切换 -> 旧任务继续执行
- 价格计算正确性
部署步骤
1. 数据库迁移
-- 创建 LogicalModelPriceSKU 表
CREATE TABLE logical_model_price_skus (
id VARCHAR(36) PRIMARY KEY,
logical_model_revision_id VARCHAR(36) NOT NULL,
code VARCHAR(80),
name VARCHAR(160),
selector_key VARCHAR(500) NOT NULL DEFAULT '{}',
selector_json TEXT NOT NULL DEFAULT '{}',
billing_mode VARCHAR(32),
unit_price_microcredits BIGINT,
input_token_price_microcredits BIGINT,
output_token_price_microcredits BIGINT,
cached_token_price_microcredits BIGINT,
priority INT,
enabled BOOLEAN,
version INT,
created_at TIMESTAMP,
updated_at TIMESTAMP,
deleted_at TIMESTAMP,
INDEX idx_logical_sku_active (logical_model_revision_id, selector_key, deleted_at)
);
2. 代码部署
# 编译后端
cd backend
go build ./cmd/server
# 编译前端
cd web
npm run build
# 重启服务
systemctl restart infinite-canvas
3. 配置验证
- 登录管理后台
- 进入"功能开放"页面
- 确认"前台模型目录"开关显示正常
- 测试开关切换功能
4. 功能验证
- 开启前台模式,创建测试任务
- 关闭前台模式,创建测试任务
- 验证两种模式下任务都能正常执行
回滚方案
如遇问题,可通过以下步骤回滚:
- 快速回滚: 通过管理界面切换开关即可
- 代码回滚: 使用 git 回滚到上一个稳定版本
- 数据库回滚: 删除新表(如未使用)
# Git 回滚
git revert <commit-hash>
# 数据库回滚(谨慎操作)
DROP TABLE IF EXISTS logical_model_price_skus;
性能影响
评估结果
- 接口响应时间: 统一目录接口增加约 10-20ms(需加载价格档)
- 数据库查询: 每次模型目录请求增加 1-2 次查询
- 内存占用: 增加约 5-10MB(缓存模型目录)
优化建议
- 对模型目录进行缓存(TTL: 30秒)
- 使用数据库索引优化价格档查询
- 考虑使用 Redis 缓存热门模型信息
安全考虑
已实现
- ✅ 系统渠道模型脱敏(不暴露 API Key、Base URL)
- ✅ 管理员权限校验
- ✅ 任务创建强制校验
建议加强
- 添加操作审计日志
- 添加频率限制
- 添加异常监控告警
文件清单
后端新增文件
internal/service/model_catalog.gointernal/service/price_validation.gointernal/handler/model_catalog.gobackend/IMPLEMENTATION_SUMMARY.md
后端修改文件
internal/service/feature_availability.gointernal/service/errors.gointernal/service/logical_models.gointernal/service/task_creation.gointernal/model/models_logical_model.go
前端修改文件
web/src/stores/use-user-store.tsweb/src/pages/admin/components/feature-availability-panel.tsxweb/FRONTEND_FEATURE_TOGGLE.md
贡献者
- 实施日期: 2026-08-22
- 开发: Claude (AI Assistant)
- 审核: 待定
- 测试: 待定
参考文档
状态: 开发完成,待测试和部署 风险等级: 中等(涉及核心任务创建流程) 建议: 先在测试环境充分验证后再上线生产环境