Skip to content

Latest commit

 

History

History
640 lines (487 loc) · 22 KB

File metadata and controls

640 lines (487 loc) · 22 KB

📋 所有版本 | English | 简体中文

Chats 1.8.0 发布说明

发布日期:2025-11-04(相对 1.7.2 以来 27 次提交)

1.8.0 是一次重大架构升级版本,核心是将模型配置从静态参考表(ModelReference)迁移到模型实例级别,实现了模型配置的完全用户化。此版本还包含大量前端体验优化、图像处理重构、新增模型验证框架等重要改进。

🎯 核心变革

模型配置架构重构 - 从静态到动态

之前的设计(≤ 1.7.x)

  • 模型能力配置存储在 ModelReference 表(静态参考数据)
  • 所有使用相同模型引用的实例共享配置(无法个性化)
  • 添加新模型需要数据库迁移(依赖开发者更新)
  • 配置分散在两个表中(ModelReference + Model),查询复杂

现在的设计(1.8.0+)

  • 每个模型实例拥有完整的独立配置(18 个新字段)
  • 用户可自由定制模型能力(支持异构部署)
  • 添加新模型无需数据库迁移(即开即用)
  • 配置集中在 Model 表,查询高效

删除的表(5 个静态参考表):

  • ModelReference - 模型能力参考表
  • ModelProvider - 提供商信息表
  • CurrencyRate - 货币汇率表
  • Tokenizer - 分词器表
  • ReasoningResponseKind - 推理响应类型表
  • FileServiceType - 文件服务类型表(额外清理)
  • KnownImageSize - 已知图片尺寸表(图片尺寸改为字符串)

新增的表(1 个配置表):

  • ModelProviderOrder - 提供商显示顺序表

重构的代码

  • 提供商配置改为静态类:ModelProviderInfo(19 个提供商)
  • 文件服务类型改为静态类:FileServiceTypeInfo(5 个服务类型)
  • 删除 45+ 处 EF Core 导航属性和关联查询

📦 新增功能

1) 模型配置管理增强(需要数据库迁移)

新增 18 个模型配置字段(全部必填):

功能开关(7 个布尔字段):

  • AllowSearch - 是否支持联网搜索
  • AllowVision - 是否支持视觉理解
  • AllowSystemPrompt - 是否支持系统提示词
  • AllowStreaming - 是否支持流式输出
  • AllowCodeExecution - 是否支持代码执行(Gemini)
  • AllowToolCall - 是否支持工具调用
  • ThinkTagParserEnabled - 是否启用思考标签解析(DeepSeek)

温度范围(2 个数值字段):

  • MinTemperature - 最小温度值(0.0 - 2.0)
  • MaxTemperature - 最大温度值(0.0 - 2.0)

Token 配置(2 个数值字段):

  • ContextWindow - 上下文窗口大小
  • MaxResponseTokens - 最大响应 Token 数

推理与图像(2 个数组字段):

  • ReasoningEffortOptions - 推理级别选项(如 [2,3,4]
  • SupportedImageSizes - 支持的图像尺寸(如 ["1024x1024","1792x1024"]

API 类型(3 个配置字段):

  • ApiType - API 类型(0=ChatCompletion, 1=Response, 2=ImageGeneration)
  • UseAsyncApi - 是否使用异步 API(如 o3-pro)
  • UseMaxCompletionTokens - 是否使用 max_completion_tokens 字段(OpenAI/Azure)

遗留标记(1 个布尔字段):

  • IsLegacy - 是否为遗留模型(2024-07-01 之前发布)

详细说明

  • 所有字段在创建/更新模型时都必须提供(后端保证返回)
  • 前端表单根据 ApiType 动态显示相关字段
  • 管理员可为每个模型实例单独配置(支持异构部署)
  • 参见 1.8.0 API 变更说明 了解前端适配细节

2) 第三种 API 类型 - ImageGeneration

新增 ApiType.ImageGeneration (值=2)

  • ChatCompletion (0) 和 Response (1) 并列
  • 专门用于图像生成模型(如 DALL-E、gpt-image-1)
  • 字段复用:
    • MaxResponseTokens → 最大批量生成图片数
    • ReasoningEffortOptions → 图片生成质量选项(2=Low, 3=Medium, 4=High)
    • AllowStreaming → 是否返回中间状态预览图片
  • 图像生成模型自动禁用工具调用(AllowToolCall=false

重构 ChatFactory 创建逻辑

// 根据 ApiType 创建不同的服务
return model.ApiType switch
{
    DBApiType.ChatCompletion => new ChatCompletionService(/*...*/),
    DBApiType.Response => model.UseAsyncApi 
        ? new ResponseApiService(/*...*/, async: true)
        : new ResponseApiService(/*...*/, async: false),
    DBApiType.ImageGeneration => new ImageGenerationService(/*...*/),
    _ => throw new NotSupportedException($"Unsupported ApiType: {model.ApiType}")
};

3) 模型验证框架

新增 UpdateModelRequest 数据验证

  • 18 个配置字段的验证规则(温度范围、Token 限制等)
  • 自定义验证特性:
    • [TemperatureRange] - 验证温度范围(0-2,且 min ≤ max)
    • [TokenRange] - 验证 Token 范围(≥ 0)
    • [ReasoningEffortValues] - 验证推理级别选项(0-4)
    • [ImageSizesFormat] - 验证图像尺寸格式(如 "1024x1024")
  • xUnit 单元测试:UpdateModelRequestValidationTests(436 行)
  • 详细文档:模型验证规则说明

模型验证接口重构

  • ❌ 删除 ValidateModelRequest(只包含 modelReferenceId
  • ✅ 改用 UpdateModelRequest(完整配置对象)
  • 验证逻辑:创建临时模型 → 发送测试请求 → 返回结果
  • 前端需传递完整配置(参见 API 变更说明 2.1

4) 快速添加模型对话框

新增 QuickAddModelModal 组件(376 行):

  • 从可用模型列表快速批量添加模型
  • 对话框保持打开状态,支持连续添加
  • 自动重新加载模型列表
  • 搜索/过滤功能(按模型名称)
  • 已添加模型自动排序到底部
  • 表格行高优化(紧凑显示)

使用流程

  1. 点击"添加模型"按钮 → 选择 ModelKey → 查看可用模型列表
  2. 点击"快速添加"按钮 → 自动使用默认配置创建模型
  3. 对话框不关闭,继续添加其他模型
  4. 添加完成后,可在模型列表中编辑详细配置

默认配置(通用保守值):

  • apiType: 0 (ChatCompletion)
  • allowStreaming: true
  • allowSystemPrompt: true
  • allowToolCall: true
  • minTemperature: 0.0, maxTemperature: 2.0
  • contextWindow: 32768, maxResponseTokens: 4096
  • 其他功能默认禁用(false 或空数组)

5) 管理后台模型列表优化

懒加载 + 骨架屏

  • 分层加载:提供商 → 密钥 → 模型(3 层级联)
  • 按需渐进式加载:初始只加载提供商列表,展开时才加载子层级数据
  • 避免一次性加载所有 Model Key 和 Model 数据(减少初始页面加载负担)
  • 加载中显示骨架屏(基于后端返回的数量)

提供商查询优化

  • 单个 EF Core 查询替代多次数据库调用
  • 使用 GroupBy + LEFT JOIN + 关联子查询
  • 只返回有密钥的提供商(按 ModelProviderOrder.Order 排序)
  • 返回每个提供商的密钥数量和模型数量(用于骨架屏显示)

删除按钮优化

  • 使用后端返回的 totalModelCount 判断是否可删除
  • 避免前端遍历计数

密钥表单优化

  • 字段顺序调整:模型提供商 → 名称 → 其他
  • 选择提供商后自动填充名称(仅新建时)
  • 编辑时保留原名称

6) 图像处理库重构

从手写解析器迁移到 ImageSharp

  • ❌ 删除手写图像解析器(1,217 行代码):
    • JpegImageInfoService (124 行)
    • PngImageInfoService (81 行)
    • GifImageInfoService (49 行)
    • BmpImageInfoService (91 行)
    • WebpImageInfoService (174 行)
    • AvifImageInfoService (215 行)
    • HeicImageInfoService (184 行)
    • PartialBufferedStream (91 行)
    • IImageInfoService 接口
    • ImageInfoFactory 工厂类
  • ✅ 新增 SixLabors.ImageSharp 3.1.12(纯 .NET 实现)
  • 优化上传流程:上传前解析图像信息(而非上传后下载再解析)
  • 删除冗余的下载操作(节省网络流量)
  • 无需原生依赖(Docker 部署更简单)
  • 包体积从 90MB+ 降回 30MB+

新增两个重载方法

public ImageInfo GetImageInfo(Stream stream, string fileName);
public ImageInfo GetImageInfo(byte[] imageData, string fileName);

7) 全屏图片预览组件

新增 ImagePreview 组件(234 行):

  • 全屏模态框,半透明背景(bg-black/70 + 背景模糊)
  • 平滑缩放动画(从缩略图位置到居中,300ms)
  • 键盘支持:Esc 关闭,←/→ 切换图片
  • UI 控件:关闭(X)、上一张/下一张箭头、计数器、缩略图条
  • 集成到聊天消息(ResponseMessageUserMessage
  • 自动收集消息中的所有图片(支持预览内导航)
  • 连续图片横向排列(flex + flex-wrap

视觉优化

  • 统一缩略图最大尺寸为 300x300(响应消息和用户消息)
  • 保留 tempFileId 的蓝色扫描效果
  • 添加 cursor-pointer 和微妙的悬停过渡
  • 消除初始居中闪烁(使用 hasEnterStarted + 可见性门控)
  • 控件仅在进入动画开始后渲染(无闪烁)

8) ChatConfig 图片尺寸字段重构(需要数据库迁移)

从外键关联改为字符串存储

  • ❌ 删除 ChatConfig.ImageSizeId 外键字段
  • ❌ 删除 KnownImageSize
  • ✅ 新增 ChatConfig.ImageSize 字符串字段(如 "1024x1024")
  • 数据迁移:自动转换 ImageSizeIdImageSize 字符串
  • 更灵活的图片尺寸支持(不受预定义尺寸限制)

🔄 接口变更(需要前端适配)

破坏性变更

  1. 模型管理接口

    • GET /api/admin/models/{id} - 删除 3 个字段,新增 18 个字段
    • POST /api/admin/models - 新增 18 个必填字段
    • PUT /api/admin/models/{id} - 新增 18 个必填字段
    • POST /api/admin/models/validate - 参数从 ModelReferenceId 改为完整配置对象
  2. 可用模型列表接口

    • GET /api/admin/model-keys/{modelKeyId}/possible-models - 移除 3 个字段
  3. 用户模型接口

    • GET /api/users/{userId}/models - 新增 18 个字段
  4. 快速创建接口

    • ❌ 删除 POST /api/admin/models/fast-create
    • ✅ 使用普通创建接口 POST /api/admin/models(提供默认值)
  5. 删除的接口

    • GET /api/model-provider/{modelProviderId}/models - 模型提供商模型列表
    • GET /api/model-reference/{modelId} - 模型引用详情

新增接口

模型提供商管理

  • GET /api/admin/model-providers - 获取所有提供商(含密钥和模型数量)
  • POST /api/admin/model-providers/reorder - 重新排序提供商

详细的前端适配指南


✨ 前端体验优化

1) 聊天组件重构

组件重命名(提升可读性):

  • ConversationsChatList(聊天列表)
  • ConversationChatListItem(聊天列表项)
  • ChatChatView(聊天视图)
  • 删除 MemoizedChatMessage(冗余包装组件)

导航改进

  • 聊天列表项从 <button> 改为 <a> 标签
  • 支持右键菜单(在新标签页打开)
  • 支持 Ctrl/Cmd+Click 在新标签页打开
  • 改善无障碍体验(符合语义化 HTML)
  • 相同改进应用于设置页面和管理后台导航

2) 聊天消息加载骨架屏

新增 ChatMessagesSkeleton 组件(199 行):

  • 在聊天消息加载时显示骨架屏(而非空白)
  • 多模型展示(显示 3 个不同尺寸的模型卡片)
  • 模拟消息气泡的动画加载效果
  • 提升首次进入聊天的感知性能

集成到聊天视图

  • 新增 isLoadingChat 状态(在 HomeContext 中)
  • 加载消息时显示骨架屏
  • 消息加载完成后淡入显示

3) 预设配置对话框优化

按 API 类型分离配置 UI

  • 聊天/推理模型apiType=0/1):ChatResponsePresetConfig 组件
    • 显示:温度、Top P、Frequency Penalty、Presence Penalty
    • 显示:最大输出 Token 数、推理强度
  • 图像生成模型apiType=2):ImageGenerationPresetConfig 组件
    • 显示:图片尺寸、图片数量、图片质量
    • 字段名称调整:"推理强度" → "图片质量","最大输出 Token 数" → "批量图片数"

新增 ImageQualityRadio 组件(67 行):

  • 图片质量选择器(低/中/高)
  • 与推理强度共享底层枚举(2/3/4)
  • 视觉上更符合图像生成场景

应用范围

  • ChatPresetModal - 聊天预设模态框
  • ChatModelSettingsModal - 模型设置模态框

4) 代码重构与清理

类型系统简化

  • 删除冗余类型别名(在 reducers 中)
  • 直接使用原始类型(提升可读性)
  • 影响文件:chat.reducer.tsmodel.reducer.tsprompt.reducer.ts

模块化改进

  • chatApi.tsChatView.tsx 中独立出来
  • ChatView.tsx 从 1431 行降至 1384 行
  • 提升代码可维护性和模块化

🐛 问题修复

1) 编译错误修复

  • 修复 MCP 升级导致的 BE 编译错误
  • 修复前端构建错误
  • 修复 45+ 处 EF Core 导航属性相关的编译错误
  • 修复 TypeScript 类型错误(ResponseMessage 中的图像 URL 收集)

2) Google AI 服务优化

  • 降低重试次数:从 60 次降至 3 次
  • 避免长时间挂起(提升用户体验)

3) 图像生成修复

  • 修复推理级别在图像生成 API 中不支持的问题
  • 修复推理级别设置不生效的问题

4) 其他修复

  • 修复非流式 API 工具调用问题
  • 修复模型 loader 查询问题
  • 修复管理员消息内容查询问题
  • 修复 ChatConfig 哈希计算问题(单元测试更新)

📦 依赖更新

前端依赖

  • next:15.5.3 → 15.5.6
  • @next/env:15.5.3 → 15.5.6
  • @next/swc-*(所有平台):15.5.3 → 15.5.6
  • 更新 browserslist 数据库

后端依赖

  • SixLabors.ImageSharp:新增 3.1.12(纯 .NET 图像处理库)
    • 替代手写图像解析器,无需平台原生依赖
    • 跨平台支持更好,包体积适中(约 30MB+)
    • 曾考虑使用 SkiaSharp,但其包含所有平台原生库会导致包体积膨胀至 90MB+

🗄️ 数据库迁移

重要提示:本版本包含重大数据库架构变更,升级前请务必备份数据库

迁移脚本位置

src/scripts/db-migration/1.8/1.8.0.sql

迁移步骤(18 步)

  1. 添加 18 个新字段到 Model
  2. ModelReference 迁移基础字段
  3. 设置 UseMaxCompletionTokens(OpenAI/Azure OpenAI)
  4. 迁移 AllowCodeExecution(基于模型名称判断)
  5. 迁移 ReasoningEffortOptions(基于模型名称判断)
  6. 迁移 SupportedImageSizesApiType(图像生成模型)
  7. 设置 UseAsyncApi 和推理模型 ApiType
  8. 设置 DeploymentName 为必填字段
  9. 删除 Model.ModelReferenceId 外键和字段
  10. 删除 ModelReference 表及其外键
  11. 删除 ModelProvider 表及其外键
  12. 删除 CurrencyRate
  13. 删除 Tokenizer
  14. 删除 ReasoningResponseKind
  15. 创建 ModelProviderOrder
  16. 初始化 ModelProviderOrder 数据(基于现有 ModelKey.Order
  17. 删除 FileServiceType 表及其外键
  18. 迁移 ChatConfig.ImageSizeIdImageSize 字符串
  19. 删除 KnownImageSize

迁移特点

  • 安全性:所有步骤都有 IF EXISTS 检查,可重复执行
  • 数据保留:自动迁移现有模型配置(无数据丢失)
  • 智能判断:根据模型名称自动设置特殊能力
    • Gemini 模型:AllowCodeExecution
    • DeepSeek 模型:ThinkTagParserEnabled
    • o1/o3 系列:推理级别选项
    • gpt-image 系列:图像尺寸和 API 类型
  • 版本标记:自动设置 IsLegacy(2024-07-01 之前发布的模型)

迁移前检查

  • ✅ 数据库已备份
  • ✅ 确认当前版本为 1.7.2 或更早
  • ✅ 已阅读 API 变更说明
  • ✅ 前端代码已更新(TypeScript 类型定义)

📊 代码统计

整体变更

  • 新增:9,915 行
  • 删除:4,279 行
  • 净增:5,636 行
  • 文件变更:156 个文件

关键模块

后端

  • 删除 1,217 行手写图像解析器
  • 新增 888 行 API 变更文档
  • 新增 436 行模型验证单元测试
  • 新增 172 行 ModelProviderInfo 静态类
  • 新增 130 行自定义验证特性
  • 新增 64 行 FileServiceTypeInfo 静态类

前端

  • 新增 376 行 QuickAddModelModal 组件
  • 新增 234 行 ImagePreview 组件
  • 新增 227 行 ChatResponseConfig 组件
  • 新增 209 行 ChatResponsePresetConfig 组件
  • 新增 199 行 ChatMessagesSkeleton 组件
  • 新增 106 行模型默认配置
  • 新增 102 行 ImageGenerationPresetConfig 组件
  • 新增 91 行 ImageGenerationConfig 组件
  • 重构 ModelModal.tsx:+528 行(714 行总计)

数据库

  • 新增 647 行迁移脚本(1.8.0.sql)

文档

  • 新增 2,816 行历史发布说明(1.0 - 1.6)
  • 新增 888 行 API 变更说明
  • 新增 157 行模型验证规则说明

🎓 学习资源

新增文档

其他资源


⚠️ 升级注意事项

升级前准备

  1. 备份数据库(必须!):

    -- SQL Server 示例
    BACKUP DATABASE [Chats] TO DISK = N'D:\Backup\Chats_1.7.2_BeforeUpgrade.bak'
  2. 记录当前模型配置

    SELECT m.Id, m.Name, mr.Name AS ReferenceName, 
           mr.AllowVision, mr.AllowSearch, mr.ContextWindow, mr.MaxResponseTokens
    FROM Model m
    INNER JOIN ModelReference mr ON m.ModelReferenceId = mr.Id;
  3. 检查自定义修改

    • 如果你手动修改过 ModelReference 表,请记录修改内容
    • 迁移后需在 Model 表中重新配置

升级步骤

  1. 停止应用服务
  2. 备份数据库(再次确认!)
  3. 执行迁移脚本
    sqlcmd -S localhost -d Chats -i 1.8.0.sql
  4. 验证迁移结果
    -- 检查新字段是否存在
    SELECT TOP 1 * FROM Model;
    
    -- 检查表是否删除
    SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_NAME IN ('ModelReference', 'ModelProvider', 'CurrencyRate');
    -- 应返回 0 条记录
  5. 部署新版本后端代码
  6. 部署新版本前端代码
  7. 验证功能
    • 登录管理后台 → 模型管理
    • 检查现有模型配置是否正确
    • 尝试添加新模型
    • 测试模型验证功能
    • 验证聊天功能正常

回滚方案

如果升级失败,可按以下步骤回滚:

  1. 停止应用服务
  2. 恢复数据库备份
    RESTORE DATABASE [Chats] FROM DISK = N'D:\Backup\Chats_1.7.2_BeforeUpgrade.bak'
    WITH REPLACE;
  3. 部署 1.7.2 版本代码
  4. 重启应用服务

🚀 后续计划

1.8.x 系列

  • 模型配置模板(快速克隆相似模型)
  • 模型分组管理(按用途分类)
  • 批量导入/导出模型配置
  • 模型使用情况统计

未来版本

  • 模型能力自动检测(减少手动配置)
  • 模型配置版本历史(跟踪变更)
  • 模型推荐系统(基于使用场景)
  • 更多模型提供商集成

🙏 贡献者

感谢所有为本版本做出贡献的开发者!

特别感谢:

  • @sdcb - 核心架构重构、数据库迁移、API 设计、文档编写

如有问题或建议,欢迎在 GitHub Issues 反馈。


📝 更新日志摘要

架构变更

  • ✅ 模型配置从静态参考表迁移到模型实例级别
  • ✅ 删除 5 个静态参考表(ModelReference、ModelProvider 等)
  • ✅ 新增 ModelProviderOrder 表(提供商排序)
  • ✅ 提供商配置改为静态类(ModelProviderInfo、FileServiceTypeInfo)
  • ✅ 新增第三种 API 类型(ImageGeneration)

功能新增

  • ✅ 18 个模型配置字段(功能开关、温度范围、Token 配置等)
  • ✅ 模型验证框架(自定义验证特性 + 单元测试)
  • ✅ 快速添加模型对话框(批量添加 + 默认配置)
  • ✅ 全屏图片预览组件(缩放动画 + 键盘导航)
  • ✅ 管理后台按需懒加载 + 骨架屏(渐进式加载数据)
  • ✅ 聊天消息加载骨架屏(提升感知性能)
  • ✅ 按 API 类型分离预设配置 UI

代码优化

  • ✅ 图像处理库重构(ImageSharp 替代手写解析器,-1,217 行)
  • ✅ 聊天组件重命名(提升可读性)
  • ✅ 导航改进(button → anchor,支持右键菜单)
  • ✅ 类型系统简化(删除冗余别名)
  • ✅ 模块化改进(独立 chatApi.ts)

问题修复

  • ✅ 修复 45+ 处 EF Core 相关编译错误
  • ✅ 修复 Google AI 服务重试次数问题
  • ✅ 修复图像生成推理级别问题
  • ✅ 修复非流式 API 工具调用问题

依赖更新

  • ✅ Next.js:15.5.3 → 15.5.6
  • ✅ ImageSharp:新增 3.1.12(替代手写图像解析器)

文档完善

  • ✅ 新增 888 行 API 变更说明
  • ✅ 新增 157 行模型验证规则说明
  • ✅ 新增 2,816 行历史发布说明(1.0 - 1.6)

最后更新:2025-11-04