diff --git a/.playwright-cli/page-2026-08-22T05-15-46-502Z.yml b/.playwright-cli/page-2026-08-22T05-15-46-502Z.yml deleted file mode 100644 index e69de29bb..000000000 diff --git a/COMPLETE_IMPLEMENTATION_REPORT.md b/COMPLETE_IMPLEMENTATION_REPORT.md deleted file mode 100644 index ca4c69418..000000000 --- a/COMPLETE_IMPLEMENTATION_REPORT.md +++ /dev/null @@ -1,353 +0,0 @@ -# 模型目录管理系统重构 - 完整实施报告 - -## 项目概述 - -本次重构实现了前台模型虚拟渠道与系统渠道模型的双模式支持,通过 `frontendModelsEnabled` 开关控制模型目录的来源和任务创建的校验逻辑。 - -## 实施范围 - -### 后端实现 (Backend) - -#### 1. 核心功能开关 -- **文件**: `internal/service/feature_availability.go` -- **功能**: 添加 `frontendModelsEnabled` 字段,默认值 `true` -- **状态**: ✅ 完成 - -#### 2. 错误码体系 -- **文件**: `internal/service/errors.go` -- **功能**: 定义6个明确的模型错误码 -- **错误码列表**: - - `model_capability_not_supported` - - `model_price_not_configured` - - `model_route_unavailable` - - `provider_request_failed` - - `model_catalog_mismatch` - - `invalid_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 - ↓ -调用渠道模型执行 -``` - -## 待完成事项 - -### 高优先级 -1. ⏳ **数据库迁移脚本** - - 创建 `logical_model_price_skus` 表 - - 为现有模型添加默认 SKU - -2. ⏳ **路由注册** - - 在 `cmd/server/main.go` 中注册 `RegisterModelCatalogRoutes` - -3. ⏳ **前端接口切换** - - 修改前端模型选择器,调用新的 `/api/model-catalog` 接口 - - 移除对旧接口的直接调用 - -### 中优先级 -4. ⏳ **系统渠道报价逻辑** - - 实现 `POST /api/model-catalog/quote` 中系统模式的报价 - -5. ⏳ **SKU 管理后台** - - 添加前台 SKU 的 CRUD 接口 - - 实现 selector 覆盖校验 - -6. ⏳ **单元测试** - - 价格校验逻辑测试 - - 任务入口分流测试 - - 模型目录接口测试 - -### 低优先级 -7. ⏳ **前端适配优化** - - 根据 `source` 字段优化 UI 展示 - - 添加模式切换提示 - -8. ⏳ **文档完善** - - API 文档 - - 用户手册 - - 管理员指南 - -## 测试清单 - -### 后端测试 -- [ ] 功能开关读取和更新 -- [ ] 前台模式任务创建(带 logicalModelId) -- [ ] 系统模式任务创建(带 channelId + model) -- [ ] 模式切换后的任务创建校验 -- [ ] 价格有效性校验 -- [ ] 统一目录接口返回数据正确性 - -### 前端测试 -- [ ] 管理界面开关切换 -- [ ] 二次确认对话框显示 -- [ ] 配置保存和刷新持久化 -- [ ] 非管理员权限限制 - -### 集成测试 -- [ ] 开启前台模式 -> 创建任务 -> 执行成功 -- [ ] 关闭前台模式 -> 创建任务 -> 执行成功 -- [ ] 模式切换 -> 旧任务继续执行 -- [ ] 价格计算正确性 - -## 部署步骤 - -### 1. 数据库迁移 -```sql --- 创建 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. 代码部署 -```bash -# 编译后端 -cd backend -go build ./cmd/server - -# 编译前端 -cd web -npm run build - -# 重启服务 -systemctl restart infinite-canvas -``` - -### 3. 配置验证 -- 登录管理后台 -- 进入"功能开放"页面 -- 确认"前台模型目录"开关显示正常 -- 测试开关切换功能 - -### 4. 功能验证 -- 开启前台模式,创建测试任务 -- 关闭前台模式,创建测试任务 -- 验证两种模式下任务都能正常执行 - -## 回滚方案 - -如遇问题,可通过以下步骤回滚: - -1. **快速回滚**: 通过管理界面切换开关即可 -2. **代码回滚**: 使用 git 回滚到上一个稳定版本 -3. **数据库回滚**: 删除新表(如未使用) - -```bash -# Git 回滚 -git revert - -# 数据库回滚(谨慎操作) -DROP TABLE IF EXISTS logical_model_price_skus; -``` - -## 性能影响 - -### 评估结果 -- **接口响应时间**: 统一目录接口增加约 10-20ms(需加载价格档) -- **数据库查询**: 每次模型目录请求增加 1-2 次查询 -- **内存占用**: 增加约 5-10MB(缓存模型目录) - -### 优化建议 -1. 对模型目录进行缓存(TTL: 30秒) -2. 使用数据库索引优化价格档查询 -3. 考虑使用 Redis 缓存热门模型信息 - -## 安全考虑 - -### 已实现 -- ✅ 系统渠道模型脱敏(不暴露 API Key、Base URL) -- ✅ 管理员权限校验 -- ✅ 任务创建强制校验 - -### 建议加强 -- 添加操作审计日志 -- 添加频率限制 -- 添加异常监控告警 - -## 文件清单 - -### 后端新增文件 -- `internal/service/model_catalog.go` -- `internal/service/price_validation.go` -- `internal/handler/model_catalog.go` -- `backend/IMPLEMENTATION_SUMMARY.md` - -### 后端修改文件 -- `internal/service/feature_availability.go` -- `internal/service/errors.go` -- `internal/service/logical_models.go` -- `internal/service/task_creation.go` -- `internal/model/models_logical_model.go` - -### 前端修改文件 -- `web/src/stores/use-user-store.ts` -- `web/src/pages/admin/components/feature-availability-panel.tsx` -- `web/FRONTEND_FEATURE_TOGGLE.md` - -## 贡献者 - -- 实施日期: 2026-08-22 -- 开发: Claude (AI Assistant) -- 审核: 待定 -- 测试: 待定 - -## 参考文档 - -- [后端实施总结](../backend/IMPLEMENTATION_SUMMARY.md) -- [前端功能开关说明](../web/FRONTEND_FEATURE_TOGGLE.md) -- [原始方案文档](../视频模型API协议改造方案.md) - ---- - -**状态**: 开发完成,待测试和部署 -**风险等级**: 中等(涉及核心任务创建流程) -**建议**: 先在测试环境充分验证后再上线生产环境 diff --git a/FINAL_SUMMARY.md b/FINAL_SUMMARY.md deleted file mode 100644 index 107a639ec..000000000 --- a/FINAL_SUMMARY.md +++ /dev/null @@ -1,238 +0,0 @@ -# 前台模型目录开关功能 - 最终实施总结 - -## 🎯 功能概述 - -实现了 `frontendModelsEnabled` 功能开关,允许管理员在**前台模型虚拟渠道**和**系统渠道模型**之间切换。 - -## ✅ 已完成的功能 - -### 1. 后端实现 - -#### 核心功能 -- ✅ 在 `feature_availability.go` 中添加 `frontendModelsEnabled` 字段(默认 `true`) -- ✅ 定义 6 个明确的错误码(`errors.go`) -- ✅ 新增 `LogicalModelPriceSKU` 数据模型(支持统一定价) -- ✅ 完善价格校验逻辑(`price_validation.go`) -- ✅ 统一价格展示字段(`pricingMode`, `displayPrice`, `priceLabel`) - -#### 统一模型目录接口 -- ✅ `GET /api/model-catalog` - 根据开关返回不同的目录 -- ✅ `POST /api/model-catalog/available` - 能力过滤 -- ✅ `POST /api/model-catalog/quote` - 价格报价 - -#### 任务创建强制分流 -- ✅ 前台模式:必须有 `logicalModelId`,否则拒绝 -- ✅ 系统模式:禁止 `logicalModelId`,必须指定 `channelId + model` -- ✅ 系统模式下校验渠道模型存在且价格有效 - -### 2. 前端实现 - -#### 管理界面 -- ✅ 分成两个独立卡片: - - **用户功能开放**(短剧、任务、积分、自定义渠道) - - **管理后台功能**(前台模型) -- ✅ 添加"前台模型"开关(✨ Sparkles 图标) -- ✅ 关闭时显示二次确认对话框 -- ✅ 产品化文案,无技术术语 - -#### 菜单和路由 -- ✅ 左侧菜单根据开关动态显示/隐藏"前台模型" -- ✅ 路由层面拦截,关闭时访问 `/admin/models` 显示"暂未开放" -- ✅ PC 和移动端菜单都支持 - -#### 模型加载 -- ✅ 登录时调用 `/api/model-catalog` 获取模型目录 -- ✅ 刷新时调用 `/api/model-catalog` 更新模型目录 -- ✅ 根据 `source` 字段加载不同格式的模型数据 - -## 📋 工作原理 - -### 开关状态:开启(默认) - -``` -管理后台: - ✓ 左侧显示"前台模型"菜单 - ✓ 可访问 /admin/models - -用户端: - ✓ 模型选择器显示前台模型 - ✓ 创建任务时带 logicalModelId - -后端接口: - GET /api/model-catalog - → {source: "frontend", models: [...]} -``` - -### 开关状态:关闭 - -``` -管理后台: - ✗ 左侧隐藏"前台模型"菜单 - ✗ 访问 /admin/models 显示"暂未开放" - -用户端: - ✓ 模型选择器显示系统渠道模型 - ✓ 创建任务时带 channelId + model - ✗ 不允许带 logicalModelId - -后端接口: - GET /api/model-catalog - → {source: "system", channels: [...]} -``` - -## 🎨 用户界面 - -### 管理后台 - 功能开放页面 - -``` -┌─────────────────────────────────────────────────┐ -│ 🔄 用户功能开放 4/4 已开放 │ -├─────────────────────────────────────────────────┤ -│ 🎬 短剧创作 /projects [ON] │ -│ ☑️ 任务 /tasks [ON] │ -│ 💰 积分中心 /wallet [ON] │ -│ 📡 自定义渠道 /settings... [ON] │ -└─────────────────────────────────────────────────┘ - -┌─────────────────────────────────────────────────┐ -│ ⚙️ 管理后台功能 1/1 已开放 │ -├─────────────────────────────────────────────────┤ -│ ✨ 前台模型 /admin/models [ON] │ -│ 关闭后隐藏管理后台的前台模型菜单和配置 │ -│ 页面,用户将直接使用系统渠道中的模型。 │ -└─────────────────────────────────────────────────┘ -``` - -### 关闭确认对话框 - -``` -┌─────────────────────────────────────┐ -│ 关闭前台模型功能? │ -├─────────────────────────────────────┤ -│ 关闭后,管理后台的「前台模型」菜单 │ -│ 将隐藏,用户将直接使用系统渠道中配 │ -│ 置的模型。已有前台模型配置不会删除。 │ -│ │ -│ [取消] [确认关闭] │ -└─────────────────────────────────────┘ -``` - -## 🔧 部署步骤 - -### 1. 编译后端 -```bash -cd backend -go build -o bin/server ./cmd/server -``` - -### 2. 重启服务 -```bash -./bin/server -``` - -### 3. 验证接口 -```bash -curl http://localhost:3000/api/model-catalog -``` - -### 4. 编译前端 -```bash -cd web -npm run build -``` - -### 5. 清除缓存并刷新浏览器 - -## 🧪 测试清单 - -### 基础功能测试 -- [ ] 管理后台显示两个独立的功能卡片 -- [ ] "前台模型"开关可以正常切换 -- [ ] 关闭时显示二次确认对话框 -- [ ] 配置保存后刷新页面仍然保持 - -### 菜单和路由测试 -- [ ] 开启时左侧菜单显示"前台模型" -- [ ] 关闭时左侧菜单隐藏"前台模型" -- [ ] 关闭后直接访问 `/admin/models` 被拦截 -- [ ] 移动端菜单也正确过滤 - -### 模型目录测试 -- [ ] 开启时模型选择器显示前台模型 -- [ ] 关闭时模型选择器显示系统渠道模型 -- [ ] 切换开关后刷新页面,模型目录正确更新 - -### 任务创建测试 -- [ ] 开启时创建任务带 `logicalModelId` -- [ ] 关闭时创建任务带 `channelId + model` -- [ ] 关闭时尝试带 `logicalModelId` 被拒绝 -- [ ] 两种模式下任务都能正常执行 - -### 接口测试 -- [ ] `/api/model-catalog` 返回 200 -- [ ] 开启时返回 `{source: "frontend", models: [...]}` -- [ ] 关闭时返回 `{source: "system", channels: [...]}` - -## 📦 修改文件清单 - -### 后端(9个文件) -1. `internal/service/feature_availability.go` - 添加开关 -2. `internal/service/errors.go` - 错误码定义(新建) -3. `internal/model/models_logical_model.go` - SKU 模型 -4. `internal/service/price_validation.go` - 价格校验(新建) -5. `internal/service/logical_models.go` - 价格展示字段 -6. `internal/service/model_catalog.go` - 统一目录接口(新建) -7. `internal/handler/model_catalog.go` - HTTP 处理器(新建) -8. `internal/service/task_creation.go` - 任务创建分流 -9. `cmd/server/main.go` - 路由注册 - -### 前端(7个文件) -1. `stores/use-user-store.ts` - 类型定义 -2. `pages/admin/components/feature-availability-panel.tsx` - UI 和交互 -3. `pages/admin/components/admin-shell.tsx` - 菜单过滤 -4. `components/auth/require-feature.tsx` - 权限检查 -5. `router.tsx` - 路由拦截 -6. `services/api/logical-models.ts` - API 函数 -7. `lib/user-session.ts` - 模型加载逻辑 - -## 📊 影响范围 - -### 用户影响 -- **零影响**:默认开启,行为与之前完全一致 -- **管理员可控**:通过管理后台随时切换 - -### 性能影响 -- **接口响应**:统一目录接口增加约 10-20ms -- **数据库查询**:每次请求增加 1-2 次查询 -- **内存占用**:增加约 5-10MB(模型目录缓存) - -## ⚠️ 注意事项 - -1. **关闭前台模型前**:确认系统渠道中有可用模型 -2. **切换模式后**:建议用户刷新页面以加载最新配置 -3. **任务兼容**:旧任务继续使用创建时的模型配置 -4. **数据不丢失**:关闭前台模型不会删除已有配置 - -## 🐛 已知问题 - -无 - -## 🚀 下一步计划 - -1. 创建数据库迁移脚本(`logical_model_price_skus` 表) -2. 编写单元测试和集成测试 -3. 性能优化(添加缓存) -4. 文档更新(API 文档、用户手册) - -## 📞 技术支持 - -如遇问题,请查看: -- [部署指南](./DEPLOYMENT_GUIDE.md) -- [完整实施报告](./COMPLETE_IMPLEMENTATION_REPORT.md) -- [前端功能开关说明](./web/FRONTEND_FEATURE_TOGGLE.md) - ---- - -**实施日期**: 2026-08-22 -**状态**: ✅ 开发完成,待测试部署 -**开发者**: Claude AI Assistant diff --git a/README.md b/README.md index edbc47627..bf4026812 100644 --- a/README.md +++ b/README.md @@ -19,10 +19,6 @@ 当前版本以仓库根目录 [`VERSION`](VERSION) 为准。 -## 仓库协作 - -本项目的远端上游仓库是 [`ddcat-ai/open-ai-canvas`](https://github.com/ddcat-ai/open-ai-canvas)。本地同步主线代码时,应以该仓库的 `main` 分支为准。 - ## 赞助商 感谢以下赞助商对影策项目的支持: @@ -56,7 +52,8 @@ Issue 反馈、技术讨论和产品升级建议都可以在 QQ 群中沟通。群内还会不定期组织 AI 学习与培训交流会。

- 影策 QQ 交流群 + 影策 QQ 交流群 + 影策 微信交流群

## 当前能力 diff --git a/assets/wx.jpg b/assets/wx.jpg new file mode 100644 index 000000000..6c6b5ba82 Binary files /dev/null and b/assets/wx.jpg differ diff --git a/output/playwright/canvas-card-metadata.png b/output/playwright/canvas-card-metadata.png deleted file mode 100644 index e1d880d2f..000000000 Binary files a/output/playwright/canvas-card-metadata.png and /dev/null differ