@lobehub/chat 1.99.2 → 1.99.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/.cursor/rules/project-introduce.mdc +1 -56
  2. package/.cursor/rules/testing-guide/db-model-test.mdc +453 -0
  3. package/.cursor/rules/testing-guide/electron-ipc-test.mdc +80 -0
  4. package/.cursor/rules/testing-guide/testing-guide.mdc +401 -0
  5. package/CHANGELOG.md +25 -0
  6. package/changelog/v1.json +9 -0
  7. package/docs/usage/providers/ai21.mdx +1 -1
  8. package/docs/usage/providers/ai21.zh-CN.mdx +1 -1
  9. package/docs/usage/providers/ai360.mdx +1 -1
  10. package/docs/usage/providers/ai360.zh-CN.mdx +1 -1
  11. package/docs/usage/providers/anthropic.mdx +1 -1
  12. package/docs/usage/providers/anthropic.zh-CN.mdx +1 -1
  13. package/docs/usage/providers/azure.mdx +1 -1
  14. package/docs/usage/providers/azure.zh-CN.mdx +1 -1
  15. package/docs/usage/providers/baichuan.mdx +1 -1
  16. package/docs/usage/providers/baichuan.zh-CN.mdx +1 -1
  17. package/docs/usage/providers/bedrock.mdx +1 -1
  18. package/docs/usage/providers/bedrock.zh-CN.mdx +1 -1
  19. package/docs/usage/providers/cloudflare.mdx +1 -1
  20. package/docs/usage/providers/cloudflare.zh-CN.mdx +1 -1
  21. package/docs/usage/providers/deepseek.mdx +1 -1
  22. package/docs/usage/providers/deepseek.zh-CN.mdx +1 -1
  23. package/docs/usage/providers/fal.mdx +69 -0
  24. package/docs/usage/providers/fal.zh-CN.mdx +68 -0
  25. package/docs/usage/providers/fireworksai.mdx +1 -1
  26. package/docs/usage/providers/fireworksai.zh-CN.mdx +1 -1
  27. package/docs/usage/providers/giteeai.mdx +1 -1
  28. package/docs/usage/providers/giteeai.zh-CN.mdx +1 -1
  29. package/docs/usage/providers/github.mdx +1 -1
  30. package/docs/usage/providers/github.zh-CN.mdx +1 -1
  31. package/docs/usage/providers/google.mdx +1 -1
  32. package/docs/usage/providers/google.zh-CN.mdx +1 -1
  33. package/docs/usage/providers/groq.mdx +1 -1
  34. package/docs/usage/providers/groq.zh-CN.mdx +1 -1
  35. package/docs/usage/providers/hunyuan.mdx +1 -1
  36. package/docs/usage/providers/hunyuan.zh-CN.mdx +1 -1
  37. package/docs/usage/providers/internlm.mdx +1 -1
  38. package/docs/usage/providers/internlm.zh-CN.mdx +1 -1
  39. package/docs/usage/providers/jina.mdx +1 -1
  40. package/docs/usage/providers/jina.zh-CN.mdx +1 -1
  41. package/docs/usage/providers/minimax.mdx +1 -1
  42. package/docs/usage/providers/minimax.zh-CN.mdx +1 -1
  43. package/docs/usage/providers/mistral.mdx +1 -1
  44. package/docs/usage/providers/mistral.zh-CN.mdx +1 -1
  45. package/docs/usage/providers/moonshot.mdx +1 -1
  46. package/docs/usage/providers/moonshot.zh-CN.mdx +1 -1
  47. package/docs/usage/providers/novita.mdx +1 -1
  48. package/docs/usage/providers/novita.zh-CN.mdx +1 -1
  49. package/docs/usage/providers/ollama.mdx +1 -1
  50. package/docs/usage/providers/ollama.zh-CN.mdx +1 -1
  51. package/docs/usage/providers/openai.mdx +4 -4
  52. package/docs/usage/providers/openai.zh-CN.mdx +4 -4
  53. package/docs/usage/providers/openrouter.mdx +1 -1
  54. package/docs/usage/providers/openrouter.zh-CN.mdx +1 -1
  55. package/docs/usage/providers/perplexity.mdx +1 -1
  56. package/docs/usage/providers/perplexity.zh-CN.mdx +1 -1
  57. package/docs/usage/providers/ppio.mdx +1 -1
  58. package/docs/usage/providers/ppio.zh-CN.mdx +1 -1
  59. package/docs/usage/providers/qiniu.mdx +1 -1
  60. package/docs/usage/providers/qiniu.zh-CN.mdx +1 -1
  61. package/docs/usage/providers/qwen.mdx +1 -1
  62. package/docs/usage/providers/qwen.zh-CN.mdx +1 -1
  63. package/docs/usage/providers/sambanova.mdx +1 -1
  64. package/docs/usage/providers/sambanova.zh-CN.mdx +1 -1
  65. package/docs/usage/providers/sensenova.mdx +1 -1
  66. package/docs/usage/providers/sensenova.zh-CN.mdx +1 -1
  67. package/docs/usage/providers/siliconcloud.mdx +1 -1
  68. package/docs/usage/providers/siliconcloud.zh-CN.mdx +1 -1
  69. package/docs/usage/providers/spark.mdx +1 -1
  70. package/docs/usage/providers/spark.zh-CN.mdx +1 -1
  71. package/docs/usage/providers/stepfun.mdx +1 -1
  72. package/docs/usage/providers/stepfun.zh-CN.mdx +1 -1
  73. package/docs/usage/providers/taichu.mdx +1 -1
  74. package/docs/usage/providers/taichu.zh-CN.mdx +1 -1
  75. package/docs/usage/providers/togetherai.mdx +1 -1
  76. package/docs/usage/providers/togetherai.zh-CN.mdx +1 -1
  77. package/docs/usage/providers/upstage.mdx +1 -1
  78. package/docs/usage/providers/upstage.zh-CN.mdx +1 -1
  79. package/docs/usage/providers/vllm.mdx +1 -1
  80. package/docs/usage/providers/vllm.zh-CN.mdx +1 -1
  81. package/docs/usage/providers/wenxin.mdx +1 -1
  82. package/docs/usage/providers/wenxin.zh-CN.mdx +1 -1
  83. package/docs/usage/providers/xai.mdx +1 -1
  84. package/docs/usage/providers/xai.zh-CN.mdx +1 -1
  85. package/docs/usage/providers/zeroone.mdx +1 -1
  86. package/docs/usage/providers/zeroone.zh-CN.mdx +1 -1
  87. package/docs/usage/providers/zhipu.mdx +1 -1
  88. package/docs/usage/providers/zhipu.zh-CN.mdx +1 -1
  89. package/package.json +2 -2
  90. package/src/config/aiModels/openai.ts +24 -9
  91. package/src/libs/model-runtime/BaseAI.ts +1 -0
  92. package/src/libs/model-runtime/hunyuan/index.ts +4 -6
  93. package/src/libs/model-runtime/novita/__snapshots__/index.test.ts.snap +18 -0
  94. package/src/libs/model-runtime/openai/__snapshots__/index.test.ts.snap +28 -0
  95. package/src/libs/model-runtime/openai/index.test.ts +1 -338
  96. package/src/libs/model-runtime/openai/index.ts +0 -127
  97. package/src/libs/model-runtime/openrouter/__snapshots__/index.test.ts.snap +3 -0
  98. package/src/libs/model-runtime/ppio/__snapshots__/index.test.ts.snap +2 -0
  99. package/src/libs/model-runtime/utils/modelParse.ts +1 -0
  100. package/src/libs/model-runtime/utils/openaiCompatibleFactory/index.test.ts +364 -12
  101. package/src/libs/model-runtime/utils/openaiCompatibleFactory/index.ts +145 -43
  102. package/src/libs/model-runtime/utils/openaiHelpers.test.ts +151 -0
  103. package/src/libs/model-runtime/utils/openaiHelpers.ts +26 -1
  104. package/src/libs/model-runtime/xai/index.ts +1 -4
  105. package/src/store/aiInfra/slices/aiModel/action.ts +1 -1
  106. package/src/store/aiInfra/slices/aiProvider/action.ts +5 -2
  107. package/src/types/aiModel.ts +1 -0
  108. package/src/types/llm.ts +3 -1
  109. package/.cursor/rules/testing-guide.mdc +0 -881
@@ -0,0 +1,401 @@
1
+ ---
2
+ globs: *.test.ts,*.test.tsx
3
+ alwaysApply: false
4
+ ---
5
+
6
+ # 测试指南 - LobeChat Testing Guide
7
+
8
+ ## 🧪 测试环境概览
9
+
10
+ LobeChat 项目使用 Vitest 测试库,配置了两种不同的测试环境:
11
+
12
+ ### 客户端测试环境 (DOM Environment)
13
+
14
+ - **配置文件**: [vitest.config.ts](mdc:vitest.config.ts)
15
+ - **环境**: Happy DOM (浏览器环境模拟)
16
+ - **数据库**: PGLite (浏览器环境的 PostgreSQL)
17
+ - **用途**: 测试前端组件、客户端逻辑、React 组件等
18
+ - **设置文件**: [tests/setup.ts](mdc:tests/setup.ts)
19
+
20
+ ### 服务端测试环境 (Node Environment)
21
+
22
+ - **配置文件**: [vitest.config.server.ts](mdc:vitest.config.server.ts)
23
+ - **环境**: Node.js
24
+ - **数据库**: 真实的 PostgreSQL 数据库
25
+ - **并发限制**: 单线程运行 (`singleFork: true`)
26
+ - **用途**: 测试数据库模型、服务端逻辑、API 端点等
27
+ - **设置文件**: [tests/setup-db.ts](mdc:tests/setup-db.ts)
28
+
29
+ ## 🚀 测试运行命令
30
+
31
+ ### package.json 脚本说明
32
+
33
+ 查看 [package.json](mdc:package.json) 中的测试相关脚本:
34
+
35
+ ```json
36
+ {
37
+ "test": "npm run test-app && npm run test-server",
38
+ "test-app": "vitest run --config vitest.config.ts",
39
+ "test-app:coverage": "vitest run --config vitest.config.ts --coverage",
40
+ "test-server": "vitest run --config vitest.config.server.ts",
41
+ "test-server:coverage": "vitest run --config vitest.config.server.ts --coverage"
42
+ }
43
+ ```
44
+
45
+ ### 推荐的测试运行方式
46
+
47
+ #### ⚠️ 重要提醒
48
+
49
+ **🚨 性能警告**:
50
+
51
+ - **永远不要直接运行整个项目的所有测试用例** - 项目包含 3000+ 测试用例,完整运行需要约 10 分钟
52
+ - **务必使用文件过滤或测试名称过滤** - 始终指定具体的测试文件或测试名称模式
53
+ - **避免无意中触发全量测试** - 某些看似针对单个文件的命令实际上会运行所有测试
54
+
55
+ #### ✅ 正确的命令格式
56
+
57
+ ```bash
58
+ # 运行所有客户端测试
59
+ npx vitest run --config vitest.config.ts
60
+
61
+ # 运行所有服务端测试
62
+ npx vitest run --config vitest.config.server.ts
63
+
64
+ # 运行特定测试文件 (支持模糊匹配)
65
+ npx vitest run --config vitest.config.ts basic
66
+ npx vitest run --config vitest.config.ts user.test.ts
67
+
68
+ # 运行特定文件的特定行号
69
+ npx vitest run --config vitest.config.ts src/utils/helper.test.ts:25
70
+ npx vitest run --config vitest.config.ts basic/foo.test.ts:10,basic/foo.test.ts:25
71
+
72
+ # 过滤特定测试用例名称
73
+ npx vitest -t "test case name" --config vitest.config.ts
74
+
75
+ # 组合使用文件和测试名称过滤
76
+ npx vitest run --config vitest.config.ts filename.test.ts -t "specific test"
77
+ ```
78
+
79
+ #### ❌ 避免的命令格式
80
+
81
+ ```bash
82
+ # ❌ 这些命令会运行所有 3000+ 测试用例,耗时约 10 分钟!
83
+ npm test
84
+ npm run test
85
+ pnpm test
86
+ pnpm run test
87
+
88
+ # ❌ 这些命令看似针对单个文件,但实际会运行所有测试用例!, 需要直接运行 vitest 命令不要使用 test npm script
89
+ npm test src/libs/model-runtime/utils/openaiCompatibleFactory/index.test.ts
90
+ pnpm test src/components/Button/index.test.tsx
91
+
92
+ # ❌ 不要使用 pnpm test xxx (这不是有效的 vitest 命令)
93
+ pnpm test some-file
94
+
95
+ # ❌ 不要使用裸 vitest (会进入 watch 模式)
96
+ vitest test-file.test.ts
97
+
98
+ # ❌ 不要混淆测试环境
99
+ npx vitest run --config vitest.config.server.ts client-component.test.ts
100
+ ```
101
+
102
+ ### 关键运行参数说明
103
+
104
+ - **`vitest run`**: 运行一次测试然后退出 (避免 watch 模式)
105
+ - **`vitest`**: 默认进入 watch 模式,持续监听文件变化
106
+ - **`--config`**: 指定配置文件,选择正确的测试环境
107
+ - **`-t`**: 过滤测试用例名称,支持正则表达式
108
+ - **`--coverage`**: 生成测试覆盖率报告
109
+
110
+ ## 🔧 测试修复原则
111
+
112
+ ### 核心原则 ⚠️
113
+
114
+ 1. **充分阅读测试代码**: 在修复测试之前,必须完整理解测试的意图和实现
115
+ 2. **测试优先修复**: 如果是测试本身写错了,修改测试而不是实现代码
116
+ 3. **专注单一问题**: 只修复指定的测试,不要添加额外测试或功能
117
+ 4. **不自作主张**: 不要因为发现其他问题就直接修改,先提出再讨论
118
+
119
+ ### 测试修复流程
120
+
121
+ ```mermaid
122
+ flowchart TD
123
+ subgraph "阶段一:分析与复现"
124
+ A[开始:收到测试失败报告] --> B[定位并运行失败的测试];
125
+ B --> C{是否能在本地复现?};
126
+ C -->|否| D[检查测试环境/配置/依赖];
127
+ C -->|是| E[分析:阅读测试代码、错误日志、Git 历史];
128
+ end
129
+
130
+ subgraph "阶段二:诊断与调试"
131
+ E --> F[建立假设:问题出在测试、代码还是环境?];
132
+ F --> G["调试:使用 console.log 或 debugger 深入检查"];
133
+ G --> H{假设是否被证实?};
134
+ H -->|否, 重新假设| F;
135
+ end
136
+
137
+ subgraph "阶段三:修复与验证"
138
+ H -->|是| I{确定根本原因};
139
+ I -->|测试逻辑错误| J[修复测试代码];
140
+ I -->|实现代码 Bug| K[修复实现代码];
141
+ I -->|环境/配置问题| L[修复配置或依赖];
142
+ J --> M[验证修复:重新运行失败的测试];
143
+ K --> M;
144
+ L --> M;
145
+ M --> N{测试是否通过?};
146
+ N -->|否, 修复无效| F;
147
+ N -->|是| O[扩大验证:运行当前文件内所有测试];
148
+ O --> P{是否全部通过?};
149
+ P -->|否, 引入新问题| F;
150
+ end
151
+
152
+ subgraph "阶段四:总结"
153
+ P -->|是| Q[完成:撰写修复总结];
154
+ end
155
+
156
+ D --> F;
157
+ ```
158
+
159
+ ### 修复完成后的总结
160
+
161
+ 测试修复完成后,应该提供简要说明,包括:
162
+
163
+ 1. **错误原因分析**: 说明测试失败的根本原因
164
+ - 测试逻辑错误
165
+ - 实现代码bug
166
+ - 环境配置问题
167
+ - 依赖变更导致的问题
168
+
169
+ 2. **修复方法说明**: 简述采用的修复方式
170
+ - 修改了哪些文件
171
+ - 采用了什么解决方案
172
+ - 为什么选择这种修复方式
173
+
174
+ **示例格式**:
175
+
176
+ ```markdown
177
+ ## 测试修复总结
178
+
179
+ **错误原因**: 测试中的 mock 数据格式与实际 API 返回格式不匹配,导致断言失败。
180
+
181
+ **修复方法**: 更新了测试文件中的 mock 数据结构,使其与最新的 API 响应格式保持一致。具体修改了 `user.test.ts` 中的 `mockUserData` 对象结构。
182
+ ```
183
+
184
+ ## 📂 测试文件组织
185
+
186
+ ### 文件命名约定
187
+
188
+ - **客户端测试**: `*.test.ts`, `*.test.tsx` (任意位置)
189
+ - **服务端测试**: `src/database/models/**/*.test.ts`, `src/database/server/**/*.test.ts` (限定路径)
190
+
191
+ ### 测试文件组织风格
192
+
193
+ 项目采用 **测试文件与源文件同目录** 的组织风格:
194
+
195
+ - 测试文件放在对应源文件的同一目录下
196
+ - 命名格式:`原文件名.test.ts` 或 `原文件名.test.tsx`
197
+
198
+ 例如:
199
+
200
+ ```
201
+ src/components/Button/
202
+ ├── index.tsx # 源文件
203
+ └── index.test.tsx # 测试文件
204
+ ```
205
+
206
+ ## 🛠️ 测试调试技巧
207
+
208
+ ### 运行失败测试的步骤
209
+
210
+ 1. **确定测试类型**: 查看文件路径确定使用哪个配置
211
+ 2. **运行单个测试**: 使用 `-t` 参数隔离问题
212
+ 3. **检查错误日志**: 仔细阅读错误信息和堆栈跟踪
213
+ 4. **查看最近修改记录**: 检查相关文件的最近变更情况
214
+ 5. **添加调试日志**: 在测试中添加 `console.log` 了解执行流程
215
+
216
+ ### TypeScript 类型处理 📝
217
+
218
+ 在测试中,为了提高编写效率和可读性,可以适当放宽 TypeScript 类型检测:
219
+
220
+ #### ✅ 推荐的类型放宽策略
221
+
222
+ ```typescript
223
+ // ✅ 使用非空断言访问测试中确定存在的属性
224
+ const result = await someFunction();
225
+ expect(result!.data).toBeDefined();
226
+ expect(result!.status).toBe('success');
227
+
228
+ // ✅ 使用 any 类型简化复杂的 Mock 设置
229
+ const mockStream = new ReadableStream() as any;
230
+ mockStream.toReadableStream = () => mockStream;
231
+ ```
232
+
233
+ #### 🎯 适用场景
234
+
235
+ - **Mock 对象**: 对于测试用的 Mock 数据,使用 `as any` 避免复杂的类型定义
236
+ - **第三方库**: 处理复杂的第三方库类型时,适当使用 `any` 提高效率
237
+ - **测试断言**: 在确定对象存在的测试场景中,使用 `!` 非空断言
238
+ - **临时调试**: 快速编写测试时,先用 `any` 保证功能,后续可选择性地优化类型
239
+
240
+ #### ⚠️ 注意事项
241
+
242
+ - **适度使用**: 不要过度依赖 `any`,核心业务逻辑的类型仍应保持严格
243
+ - **文档说明**: 对于使用 `any` 的复杂场景,添加注释说明原因
244
+ - **测试覆盖**: 确保即使使用了 `any`,测试仍能有效验证功能正确性
245
+
246
+ ### 检查最近修改记录 🔍
247
+
248
+ 为了更好地判断测试失败的根本原因,需要**系统性地检查相关文件的修改历史**。这是问题定位的关键步骤。
249
+
250
+ #### 第一步:确定需要检查的文件范围
251
+
252
+ 1. **测试文件本身**: `path/to/component.test.ts`
253
+ 2. **对应的实现文件**: `path/to/component.ts` 或 `path/to/component/index.ts`
254
+ 3. **相关依赖文件**: 测试或实现中导入的其他模块
255
+
256
+ #### 第二步:检查当前工作目录状态
257
+
258
+ ```bash
259
+ # 查看所有未提交的修改状态
260
+ git status
261
+
262
+ # 重点关注测试文件和实现文件是否有未提交的修改
263
+ git status | grep -E "(test|spec)"
264
+ ```
265
+
266
+ #### 第三步:检查未提交的修改内容
267
+
268
+ ```bash
269
+ # 查看测试文件的未提交修改 (工作区 vs 暂存区)
270
+ git diff path/to/component.test.ts | cat
271
+
272
+ # 查看对应实现文件的未提交修改
273
+ git diff path/to/component.ts | cat
274
+
275
+ # 查看已暂存但未提交的修改
276
+ git diff --cached path/to/component.test.ts | cat
277
+ git diff --cached path/to/component.ts | cat
278
+ ```
279
+
280
+ #### 第四步:检查提交历史和时间相关性
281
+
282
+ **首先查看提交时间,判断修改的时效性**:
283
+
284
+ ```bash
285
+ # 查看测试文件的最近提交历史,包含提交时间
286
+ git log --pretty=format:"%h %ad %s" --date=relative -5 path/to/component.test.ts | cat
287
+
288
+ # 查看实现文件的最近提交历史,包含提交时间
289
+ git log --pretty=format:"%h %ad %s" --date=relative -5 path/to/component.ts | cat
290
+
291
+ # 查看详细的提交时间(ISO格式,便于精确判断)
292
+ git log --pretty=format:"%h %ad %an %s" --date=iso -3 path/to/component.ts | cat
293
+ git log --pretty=format:"%h %ad %an %s" --date=iso -3 path/to/component.test.ts | cat
294
+ ```
295
+
296
+ **判断提交的参考价值**:
297
+
298
+ 1. **最近提交(24小时内)**: 🔴 **高度相关** - 很可能是导致测试失败的直接原因
299
+ 2. **近期提交(1-7天内)**: 🟡 **中等相关** - 可能相关,需要仔细分析修改内容
300
+ 3. **较早提交(超过1周)**: ⚪ **低相关性** - 除非是重大重构,否则不太可能是直接原因
301
+
302
+ #### 第五步:基于时间相关性查看具体修改内容
303
+
304
+ **根据提交时间的远近,优先查看最近的修改**:
305
+
306
+ ```bash
307
+ # 如果有24小时内的提交,重点查看这些修改
308
+ git show HEAD -- path/to/component.test.ts | cat
309
+ git show HEAD -- path/to/component.ts | cat
310
+
311
+ # 查看次新的提交(如果最新提交时间较远)
312
+ git show HEAD~1 -- path/to/component.ts | cat
313
+ git show path/to/component.ts < recent-commit-hash > -- | cat
314
+
315
+ # 对比最近两次提交的差异
316
+ git diff HEAD~1 HEAD -- path/to/component.ts | cat
317
+ ```
318
+
319
+ #### 第六步:分析修改与测试失败的关系
320
+
321
+ 基于修改记录和时间相关性判断:
322
+
323
+ 1. **最近修改了实现代码**:
324
+
325
+ ```bash
326
+ # 重点检查实现逻辑的变化
327
+ git diff HEAD~1 path/to/component.ts | cat
328
+ ```
329
+
330
+ - 很可能是实现代码的变更导致测试失败
331
+ - 检查实现逻辑是否正确
332
+ - 确认测试是否需要相应更新
333
+
334
+ 2. **最近修改了测试代码**:
335
+
336
+ ```bash
337
+ # 重点检查测试逻辑的变化
338
+ git diff HEAD~1 path/to/component.test.ts | cat
339
+ ```
340
+
341
+ - 可能是测试本身写错了
342
+ - 检查测试逻辑和断言是否正确
343
+ - 确认测试是否符合实现的预期行为
344
+
345
+ 3. **两者都有最近修改**:
346
+
347
+ ```bash
348
+ # 对比两个文件的修改时间
349
+ git log --pretty=format:"%ad %f" --date=iso -1 path/to/component.ts | cat
350
+ git log --pretty=format:"%ad %f" --date=iso -1 path/to/component.test.ts | cat
351
+ ```
352
+
353
+ - 需要综合分析两者的修改
354
+ - 确定哪个修改更可能导致问题
355
+ - 优先检查时间更近的修改
356
+
357
+ 4. **都没有最近修改**:
358
+ - 可能是依赖变更或环境问题
359
+ - 检查 `package.json`、配置文件等的修改
360
+ - 查看是否有全局性的代码重构
361
+
362
+ #### 修改记录检查示例
363
+
364
+ ```bash
365
+ # 完整的检查流程示例
366
+ echo "=== 检查文件修改状态 ==="
367
+ git status | grep component
368
+
369
+ echo "=== 检查未提交修改 ==="
370
+ git diff src/components/Button/index.test.tsx | cat
371
+ git diff src/components/Button/index.tsx | cat
372
+
373
+ echo "=== 检查提交历史和时间 ==="
374
+ git log --pretty=format:"%h %ad %s" --date=relative -3 src/components/Button/index.test.tsx | cat
375
+ git log --pretty=format:"%h %ad %s" --date=relative -3 src/components/Button/index.tsx | cat
376
+
377
+ echo "=== 根据时间优先级查看修改内容 ==="
378
+ # 如果有24小时内的提交,重点查看
379
+ git show HEAD -- src/components/Button/index.tsx | cat
380
+ ```
381
+
382
+ ## 特殊场景的测试
383
+
384
+ 针对一些特殊场景的测试,需要阅读相关文件:
385
+
386
+ - [Electron IPC 接口测试策略](mdc:./electron-ipc-test.mdc)
387
+ - [数据库 Model 测试指南](mdc:./db-model-test.mdc)
388
+
389
+ ## 🎯 总结
390
+
391
+ 修复测试时,记住以下关键点:
392
+
393
+ - **使用正确的命令**: `npx vitest run --config [config-file]`
394
+ - **理解测试意图**: 先读懂测试再修复
395
+ - **查看最近修改**: 检查相关文件的 git 修改记录,判断问题根源
396
+ - **选择正确环境**: 客户端测试用 `vitest.config.ts`,服务端用 `vitest.config.server.ts`
397
+ - **专注单一问题**: 只修复当前的测试失败
398
+ - **验证修复结果**: 确保修复后测试通过且无副作用
399
+ - **提供修复总结**: 说明错误原因和修复方法
400
+ - **Model 测试安全第一**: 必须包含用户权限检查和对应的安全测试
401
+ - **Model 双环境验证**: 必须在 PGLite 和 PostgreSQL 两个环境下都验证通过
package/CHANGELOG.md CHANGED
@@ -2,6 +2,31 @@
2
2
 
3
3
  # Changelog
4
4
 
5
+ ### [Version 1.99.3](https://github.com/lobehub/lobe-chat/compare/v1.99.2...v1.99.3)
6
+
7
+ <sup>Released on **2025-07-16**</sup>
8
+
9
+ #### 🐛 Bug Fixes
10
+
11
+ - **misc**: Chat model list should not show image model.
12
+
13
+ <br/>
14
+
15
+ <details>
16
+ <summary><kbd>Improvements and Fixes</kbd></summary>
17
+
18
+ #### What's fixed
19
+
20
+ - **misc**: Chat model list should not show image model, closes [#8448](https://github.com/lobehub/lobe-chat/issues/8448) ([2bb1506](https://github.com/lobehub/lobe-chat/commit/2bb1506))
21
+
22
+ </details>
23
+
24
+ <div align="right">
25
+
26
+ [![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
27
+
28
+ </div>
29
+
5
30
  ### [Version 1.99.2](https://github.com/lobehub/lobe-chat/compare/v1.99.1...v1.99.2)
6
31
 
7
32
  <sup>Released on **2025-07-15**</sup>
package/changelog/v1.json CHANGED
@@ -1,4 +1,13 @@
1
1
  [
2
+ {
3
+ "children": {
4
+ "fixes": [
5
+ "Chat model list should not show image model."
6
+ ]
7
+ },
8
+ "date": "2025-07-16",
9
+ "version": "1.99.3"
10
+ },
2
11
  {
3
12
  "children": {
4
13
  "fixes": [
@@ -30,7 +30,7 @@ This article will guide you on how to use AI21 Labs within LobeChat.
30
30
  ### Step 2: Configure AI21 Labs in LobeChat
31
31
 
32
32
  - Go to the `Settings` page in LobeChat
33
- - Under `Language Model`, find the setting for `AI21 Labs`
33
+ - Under `AI Service Provider`, find the setting for `AI21 Labs`
34
34
 
35
35
  <Image alt={'Enter API Key'} inStep src={'https://github.com/user-attachments/assets/9336d6c5-2a83-4aa9-854e-75e245b665cb'} />
36
36
 
@@ -28,7 +28,7 @@ tags:
28
28
  ### 步骤二:在 LobeChat 中配置 AI21 Labs
29
29
 
30
30
  - 访问 LobeChat 的`设置`界面
31
- - 在`语言模型`下找到 `AI21labs` 的设置项
31
+ - 在`AI 服务商`下找到 `AI21labs` 的设置项
32
32
 
33
33
  <Image alt={'填入 API 密钥'} inStep src={'https://github.com/user-attachments/assets/9336d6c5-2a83-4aa9-854e-75e245b665cb'} />
34
34
 
@@ -28,7 +28,7 @@ This article will guide you on how to use the 360AI in LobeChat.
28
28
  ### Step 2: Configure 360AI in LobeChat
29
29
 
30
30
  - Access the `Settings` interface in LobeChat
31
- - Under `Language Models`, find the option for `360`
31
+ - Under `AI Service Provider`, find the option for `360`
32
32
 
33
33
  <Image alt={'Enter API Key'} inStep src={'https://github.com/user-attachments/assets/a53deb11-2c14-441a-8a5c-a0f3a74e2a63'} />
34
34
 
@@ -28,7 +28,7 @@ tags:
28
28
  ### 步骤二:在 LobeChat 中配置 360 智脑
29
29
 
30
30
  - 访问 LobeChat 的`设置`界面
31
- - 在`语言模型`下找到 `360` 的设置项
31
+ - 在`AI 服务商`下找到 `360` 的设置项
32
32
 
33
33
  <Image alt={'填入 API 密钥'} inStep src={'https://github.com/user-attachments/assets/a53deb11-2c14-441a-8a5c-a0f3a74e2a63'} />
34
34
 
@@ -37,7 +37,7 @@ The Anthropic Claude API is now available for everyone to use. This document wil
37
37
  ### Step 2: Configure Anthropic Claude in LobeChat
38
38
 
39
39
  - Access the `Settings` interface in LobeChat.
40
- - Find the setting for `Anthropic Claude` under `Language Models`.
40
+ - Find the setting for `Anthropic Claude` under `AI Service Provider`.
41
41
 
42
42
  <Image alt={'Enter API Key'} inStep src={'https://github.com/lobehub/lobe-chat/assets/17870709/ff9c3eb8-412b-4275-80be-177ae7b7acbc'} />
43
43
 
@@ -36,7 +36,7 @@ Anthropic Claude API 现在可供所有人使用,本文档将指导你如何
36
36
  ### 步骤二:在 LobeChat 中配置 Anthropic Claude
37
37
 
38
38
  - 访问 LobeChat 的`设置`界面
39
- - 在`语言模型`下找到`Anthropic Claude`的设置项
39
+ - 在`AI 服务商`下找到`Anthropic Claude`的设置项
40
40
 
41
41
  <Image alt={'填入 API 密钥'} inStep src={'https://github.com/lobehub/lobe-chat/assets/17870709/ff9c3eb8-412b-4275-80be-177ae7b7acbc'} />
42
42
 
@@ -39,7 +39,7 @@ This document will guide you on how to use [Azure OpenAI](https://oai.azure.com/
39
39
  ### Step 2: Configure Azure OpenAI in LobeChat
40
40
 
41
41
  - Access the `Settings` interface in LobeChat.
42
- - Find the setting for `Azure OpenAI` under `Language Model`.
42
+ - Find the setting for `Azure OpenAI` under `AI Service Provider`.
43
43
 
44
44
  <Image alt={'Enter the API key'} inStep src={'https://github.com/lobehub/lobe-chat/assets/17870709/63d9f6d4-5b78-4c65-8cd1-ff8b7f143406'} />
45
45
 
@@ -33,7 +33,7 @@ tags:
33
33
  ### 步骤二:在 LobeChat 中配置 Azure OpenAI
34
34
 
35
35
  - 访问 LobeChat 的`设置`界面
36
- - 在`语言模型`下找到`Azure OpenAI`的设置项
36
+ - 在`AI 服务商`下找到`Azure OpenAI`的设置项
37
37
 
38
38
  <Image alt={'填入 API 密钥'} inStep src={'https://github.com/lobehub/lobe-chat/assets/17870709/63d9f6d4-5b78-4c65-8cd1-ff8b7f143406'} />
39
39
 
@@ -27,7 +27,7 @@ This article will guide you on how to use Baichuan in LobeChat:
27
27
  ### Step 2: Configure Baichuan in LobeChat
28
28
 
29
29
  - Visit the `Settings` interface in LobeChat
30
- - Find the setting for `Baichuan` under `Language Model`
30
+ - Find the setting for `Baichuan` under `AI Service Provider`
31
31
 
32
32
  <Image alt={'Enter API Key'} inStep src={'https://github.com/user-attachments/assets/dec6665a-b3ec-4c50-a57f-7c7eb3160e7b'} />
33
33
 
@@ -26,7 +26,7 @@ tags:
26
26
  ### 步骤二:在 LobeChat 中配置百川
27
27
 
28
28
  - 访问 LobeChat 的`设置`界面
29
- - 在`语言模型`下找到`百川`的设置项
29
+ - 在`AI 服务商`下找到`百川`的设置项
30
30
 
31
31
  <Image alt={'填入 API 密钥'} inStep src={'https://github.com/user-attachments/assets/dec6665a-b3ec-4c50-a57f-7c7eb3160e7b'} />
32
32
 
@@ -71,7 +71,7 @@ This document will guide you on how to use Amazon Bedrock in LobeChat:
71
71
  ### Step 3: Configure Amazon Bedrock in LobeChat
72
72
 
73
73
  - Access the `Settings` interface in LobeChat
74
- - Find the setting for `Amazon Bedrock` under `Language Models` and open it
74
+ - Find the setting for `Amazon Bedrock` under `AI Service Provider` and open it
75
75
 
76
76
  <Image alt={'Enter Amazon Bedrock keys in LobeChat'} inStep src={'https://github.com/lobehub/lobe-chat/assets/34400653/7468594b-3355-4cb9-85bc-c9dace137653'} />
77
77
 
@@ -68,7 +68,7 @@ Amazon Bedrock 是一个完全托管的基础模型 API 服务,允许用户通
68
68
  ### 步骤三:在 LobeChat 中配置 Amazon Bedrock
69
69
 
70
70
  - 访问 LobeChat 的`设置`界面
71
- - 在`语言模型`下找到`Amazon Bedrock`的设置项并打开
71
+ - 在`AI 服务商`下找到`Amazon Bedrock`的设置项并打开
72
72
 
73
73
  <Image alt={'LobeChat 中填写 Amazon Bedrock 密钥'} inStep src={'https://github.com/lobehub/lobe-chat/assets/34400653/7468594b-3355-4cb9-85bc-c9dace137653'} />
74
74
 
@@ -41,7 +41,7 @@ This document will guide you on how to use Cloudflare Workers AI in LobeChat:
41
41
  ### Step 2: Configure Cloudflare Workers AI in LobeChat
42
42
 
43
43
  - Go to the `Settings` interface in LobeChat.
44
- - Under `Language Model`, find the `Cloudflare` settings.
44
+ - Under `AI Service Provider`, find the `Cloudflare` settings.
45
45
 
46
46
  <Image alt={'Input API Token'} inStep src={'https://github.com/user-attachments/assets/82a7ebe0-69ad-43b6-8767-1316b443fa03'} />
47
47
 
@@ -40,7 +40,7 @@ tags:
40
40
  ### 步骤二:在 LobeChat 中配置 Cloudflare Workers AI
41
41
 
42
42
  - 访问 LobeChat 的`设置`界面
43
- - 在`语言模型`下找到 `Cloudflare` 的设置项
43
+ - 在`AI 服务商`下找到 `Cloudflare` 的设置项
44
44
 
45
45
  <Image alt={'填入访问令牌'} inStep src={'https://github.com/user-attachments/assets/82a7ebe0-69ad-43b6-8767-1316b443fa03'} />
46
46
 
@@ -46,7 +46,7 @@ This document will guide you on how to use DeepSeek in LobeChat:
46
46
  ### Step 2: Configure DeepSeek in LobeChat
47
47
 
48
48
  - Access the `App Settings` interface in LobeChat.
49
- - Find the setting for `DeepSeek` under `Language Models`.
49
+ - Find the setting for `DeepSeek` under `AI Service Provider`.
50
50
 
51
51
  <Image alt={'Enter Deepseek API Key'} inStep src={'https://github.com/user-attachments/assets/aaa3e2c5-7f16-4cfb-86b6-2814a1aafe3a'} />
52
52
 
@@ -43,7 +43,7 @@ tags:
43
43
  ### 步骤二:在 LobeChat 中配置 DeepSeek
44
44
 
45
45
  - 访问 LobeChat 的 `应用设置`界面
46
- - 在 `语言模型` 下找到 `DeepSeek` 的设置项
46
+ - 在 `AI 服务商` 下找到 `DeepSeek` 的设置项
47
47
 
48
48
  <Image alt={'填写 Deepseek API 密钥'} inStep src={'https://github.com/user-attachments/assets/aaa3e2c5-7f16-4cfb-86b6-2814a1aafe3a'} />
49
49