@lobehub/chat 1.40.0 → 1.40.2

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 (110) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/changelog/v1.json +18 -0
  3. package/package.json +1 -1
  4. package/src/app/(main)/chat/(workspace)/_layout/Desktop/HotKeys.tsx +7 -0
  5. package/src/app/(main)/discover/(detail)/model/[...slugs]/features/Actions.tsx +1 -1
  6. package/src/app/(main)/discover/(detail)/model/[...slugs]/features/Header.tsx +1 -1
  7. package/src/app/(main)/discover/(detail)/model/[...slugs]/features/InfoSidebar/SuggestionItem.tsx +2 -2
  8. package/src/app/(main)/discover/(detail)/model/[...slugs]/features/ProviderList/ProviderItem.tsx +1 -1
  9. package/src/app/(main)/discover/(detail)/provider/[slug]/features/ModelList/ModelItem.tsx +3 -3
  10. package/src/app/(main)/discover/(list)/models/features/Card.tsx +6 -2
  11. package/src/app/(main)/settings/llm/ProviderList/Cloudflare/index.tsx +1 -5
  12. package/src/app/(main)/settings/llm/components/ProviderModelList/ModelFetcher.tsx +2 -2
  13. package/src/components/ModelSelect/index.tsx +7 -4
  14. package/src/config/__tests__/app.test.ts +6 -2
  15. package/src/config/app.ts +1 -2
  16. package/src/config/modelProviders/ai21.ts +2 -2
  17. package/src/config/modelProviders/ai360.ts +4 -4
  18. package/src/config/modelProviders/anthropic.ts +8 -8
  19. package/src/config/modelProviders/azure.ts +5 -5
  20. package/src/config/modelProviders/baichuan.ts +6 -6
  21. package/src/config/modelProviders/bedrock.ts +14 -14
  22. package/src/config/modelProviders/cloudflare.ts +12 -11
  23. package/src/config/modelProviders/deepseek.ts +1 -1
  24. package/src/config/modelProviders/fireworksai.ts +29 -27
  25. package/src/config/modelProviders/giteeai.ts +7 -7
  26. package/src/config/modelProviders/github.ts +29 -28
  27. package/src/config/modelProviders/google.ts +18 -19
  28. package/src/config/modelProviders/groq.ts +13 -13
  29. package/src/config/modelProviders/higress.ts +195 -194
  30. package/src/config/modelProviders/huggingface.ts +7 -7
  31. package/src/config/modelProviders/hunyuan.ts +25 -17
  32. package/src/config/modelProviders/internlm.ts +6 -4
  33. package/src/config/modelProviders/minimax.ts +5 -5
  34. package/src/config/modelProviders/mistral.ts +14 -16
  35. package/src/config/modelProviders/moonshot.ts +3 -3
  36. package/src/config/modelProviders/novita.ts +15 -15
  37. package/src/config/modelProviders/ollama.ts +46 -46
  38. package/src/config/modelProviders/openai.ts +23 -22
  39. package/src/config/modelProviders/openrouter.ts +20 -18
  40. package/src/config/modelProviders/perplexity.ts +7 -7
  41. package/src/config/modelProviders/qwen.ts +23 -25
  42. package/src/config/modelProviders/sensenova.ts +8 -8
  43. package/src/config/modelProviders/siliconcloud.ts +138 -92
  44. package/src/config/modelProviders/spark.ts +6 -6
  45. package/src/config/modelProviders/stepfun.ts +9 -9
  46. package/src/config/modelProviders/taichu.ts +2 -3
  47. package/src/config/modelProviders/togetherai.ts +57 -48
  48. package/src/config/modelProviders/upstage.ts +3 -3
  49. package/src/config/modelProviders/wenxin.ts +12 -12
  50. package/src/config/modelProviders/xai.ts +4 -4
  51. package/src/config/modelProviders/zeroone.ts +11 -11
  52. package/src/config/modelProviders/zhipu.ts +17 -16
  53. package/src/const/hotkeys.ts +1 -0
  54. package/src/database/_deprecated/core/model.ts +1 -1
  55. package/src/database/_deprecated/models/sessionGroup.ts +4 -1
  56. package/src/database/client/migrations.json +2 -5
  57. package/src/database/migrations/meta/0012_snapshot.json +176 -518
  58. package/src/database/schemas/agent.ts +1 -1
  59. package/src/database/schemas/message.ts +1 -0
  60. package/src/database/schemas/session.ts +1 -0
  61. package/src/database/server/models/topic.ts +19 -17
  62. package/src/features/DebugUI/Content.tsx +0 -1
  63. package/src/features/PluginStore/index.tsx +2 -2
  64. package/src/layout/GlobalProvider/AntdV5MonkeyPatch.tsx +4 -4
  65. package/src/libs/agent-runtime/google/index.ts +4 -3
  66. package/src/libs/agent-runtime/higress/index.ts +1 -1
  67. package/src/libs/agent-runtime/huggingface/index.ts +2 -4
  68. package/src/libs/agent-runtime/minimax/index.ts +5 -10
  69. package/src/libs/agent-runtime/mistral/index.ts +3 -6
  70. package/src/libs/agent-runtime/moonshot/index.ts +3 -6
  71. package/src/libs/agent-runtime/novita/__snapshots__/index.test.ts.snap +18 -18
  72. package/src/libs/agent-runtime/novita/index.ts +1 -1
  73. package/src/libs/agent-runtime/openai/__snapshots__/index.test.ts.snap +10 -10
  74. package/src/libs/agent-runtime/openai/index.ts +2 -0
  75. package/src/libs/agent-runtime/openrouter/__snapshots__/index.test.ts.snap +168 -168
  76. package/src/libs/agent-runtime/openrouter/index.ts +1 -1
  77. package/src/libs/agent-runtime/perplexity/index.ts +4 -4
  78. package/src/libs/agent-runtime/sensenova/index.ts +9 -3
  79. package/src/libs/agent-runtime/taichu/index.ts +4 -10
  80. package/src/libs/agent-runtime/utils/streams/minimax.test.ts +5 -2
  81. package/src/libs/agent-runtime/utils/streams/minimax.ts +4 -1
  82. package/src/libs/agent-runtime/zhipu/index.ts +12 -13
  83. package/src/libs/langchain/loaders/index.ts +2 -2
  84. package/src/libs/langchain/types.ts +9 -1
  85. package/src/locales/default/modelProvider.ts +1 -1
  86. package/src/migrations/FromV3ToV4/fixtures/ollama-output-v4.json +1 -1
  87. package/src/migrations/FromV6ToV7/types/v7.ts +0 -2
  88. package/src/server/globalConfig/genServerLLMConfig.test.ts +4 -4
  89. package/src/server/globalConfig/genServerLLMConfig.ts +29 -24
  90. package/src/server/globalConfig/index.ts +1 -2
  91. package/src/server/routers/edge/config/__snapshots__/index.test.ts.snap +9 -9
  92. package/src/server/routers/lambda/_template.ts +1 -1
  93. package/src/server/routers/lambda/knowledgeBase.ts +1 -1
  94. package/src/server/routers/lambda/session.ts +1 -1
  95. package/src/server/routers/lambda/sessionGroup.ts +1 -1
  96. package/src/server/routers/lambda/thread.ts +1 -1
  97. package/src/server/services/nextAuthUser/index.ts +1 -1
  98. package/src/store/user/slices/modelList/__snapshots__/action.test.ts.snap +1 -1
  99. package/src/store/user/slices/modelList/action.test.ts +4 -4
  100. package/src/store/user/slices/modelList/reducers/customModelCard.test.ts +6 -6
  101. package/src/store/user/slices/modelList/selectors/modelProvider.ts +3 -2
  102. package/src/tools/dalle/Render/Item/index.tsx +1 -1
  103. package/src/types/files/index.ts +0 -1
  104. package/src/types/llm.ts +4 -5
  105. package/src/utils/__snapshots__/parseModels.test.ts.snap +2 -2
  106. package/src/utils/genUserLLMConfig.test.ts +4 -4
  107. package/src/utils/genUserLLMConfig.ts +6 -4
  108. package/src/utils/parseModels.test.ts +16 -16
  109. package/src/utils/parseModels.ts +1 -1
  110. package/src/utils/server/jwt.ts +2 -6
@@ -82,6 +82,7 @@ exports[`parseModelString > only add the model 1`] = `
82
82
  exports[`transformToChatModelCards > should have file with builtin models like gpt-4-0125-preview 1`] = `
83
83
  [
84
84
  {
85
+ "contextWindowTokens": 128000,
85
86
  "description": "最新的 GPT-4 Turbo 模型具备视觉功能。现在,视觉请求可以使用 JSON 模式和函数调用。 GPT-4 Turbo 是一个增强版本,为多模态任务提供成本效益高的支持。它在准确性和效率之间找到平衡,适合需要进行实时交互的应用程序场景。",
86
87
  "displayName": "ChatGPT-4",
87
88
  "enabled": true,
@@ -92,9 +93,9 @@ exports[`transformToChatModelCards > should have file with builtin models like g
92
93
  "input": 10,
93
94
  "output": 30,
94
95
  },
95
- "tokens": 128000,
96
96
  },
97
97
  {
98
+ "contextWindowTokens": 128000,
98
99
  "description": "最新的 GPT-4 Turbo 模型具备视觉功能。现在,视觉请求可以使用 JSON 模式和函数调用。 GPT-4 Turbo 是一个增强版本,为多模态任务提供成本效益高的支持。它在准确性和效率之间找到平衡,适合需要进行实时交互的应用程序场景。",
99
100
  "displayName": "ChatGPT-4 Vision",
100
101
  "enabled": true,
@@ -105,7 +106,6 @@ exports[`transformToChatModelCards > should have file with builtin models like g
105
106
  "input": 10,
106
107
  "output": 30,
107
108
  },
108
- "tokens": 128000,
109
109
  "vision": true,
110
110
  },
111
111
  ]
@@ -1,15 +1,15 @@
1
1
  import { describe, expect, it, vi } from 'vitest';
2
2
 
3
- import { genUserLLMConfig } from './genUserLLMConfig';
4
-
5
3
  import { ModelProviderCard } from '@/types/llm';
6
4
 
5
+ import { genUserLLMConfig } from './genUserLLMConfig';
6
+
7
7
  // Mock ModelProvider enum
8
8
  vi.mock('@/libs/agent-runtime', () => ({
9
9
  ModelProvider: {
10
10
  Ollama: 'ollama',
11
11
  OpenAI: 'openai',
12
- }
12
+ },
13
13
  }));
14
14
 
15
15
  // Mock ProviderCards and filterEnabledModels
@@ -27,7 +27,7 @@ describe('genUserLLMConfig', () => {
27
27
  it('should generate correct LLM config for Ollama and OpenAI', () => {
28
28
  const specificConfig = {
29
29
  ollama: { enabled: true, fetchOnClient: true },
30
- openai: { enabled: true }
30
+ openai: { enabled: true },
31
31
  };
32
32
  const config = genUserLLMConfig(specificConfig);
33
33
 
@@ -1,20 +1,22 @@
1
1
  import * as ProviderCards from '@/config/modelProviders';
2
-
3
2
  import { ModelProvider } from '@/libs/agent-runtime';
4
-
5
3
  import { ModelProviderCard } from '@/types/llm';
6
4
  import { UserModelProviderConfig } from '@/types/user/settings';
7
5
 
8
6
  export const genUserLLMConfig = (specificConfig: Record<any, any>): UserModelProviderConfig => {
9
7
  return Object.keys(ModelProvider).reduce((config, providerKey) => {
10
8
  const provider = ModelProvider[providerKey as keyof typeof ModelProvider];
11
- const providerCard = ProviderCards[`${providerKey}ProviderCard` as keyof typeof ProviderCards] as ModelProviderCard;
9
+ const providerCard = ProviderCards[
10
+ `${providerKey}ProviderCard` as keyof typeof ProviderCards
11
+ ] as ModelProviderCard;
12
12
  const providerConfig = specificConfig[provider as keyof typeof specificConfig] || {};
13
13
 
14
14
  config[provider] = {
15
15
  enabled: providerConfig.enabled !== undefined ? providerConfig.enabled : false,
16
16
  enabledModels: providerCard ? ProviderCards.filterEnabledModels(providerCard) : [],
17
- ...(providerConfig.fetchOnClient !== undefined && { fetchOnClient: providerConfig.fetchOnClient }),
17
+ ...(providerConfig.fetchOnClient !== undefined && {
18
+ fetchOnClient: providerConfig.fetchOnClient,
19
+ }),
18
20
  };
19
21
 
20
22
  return config;
@@ -37,7 +37,7 @@ describe('parseModelString', () => {
37
37
  expect(result.add[0]).toEqual({
38
38
  displayName: 'ChatGLM 6B',
39
39
  id: 'chatglm-6b',
40
- tokens: 4096,
40
+ contextWindowTokens: 4096,
41
41
  });
42
42
  });
43
43
 
@@ -48,7 +48,7 @@ describe('parseModelString', () => {
48
48
  displayName: '讯飞星火 v3.5',
49
49
  functionCall: true,
50
50
  id: 'spark-v3.5',
51
- tokens: 8192,
51
+ contextWindowTokens: 8192,
52
52
  });
53
53
  });
54
54
 
@@ -62,7 +62,7 @@ describe('parseModelString', () => {
62
62
  displayName: 'Gemini 1.5 Flash',
63
63
  vision: true,
64
64
  id: 'gemini-1.5-flash-latest',
65
- tokens: 16000,
65
+ contextWindowTokens: 16000,
66
66
  },
67
67
  {
68
68
  displayName: 'ChatGPT Plus',
@@ -70,7 +70,7 @@ describe('parseModelString', () => {
70
70
  functionCall: true,
71
71
  files: true,
72
72
  id: 'gpt-4-all',
73
- tokens: 128000,
73
+ contextWindowTokens: 128000,
74
74
  },
75
75
  ]);
76
76
  });
@@ -85,14 +85,14 @@ describe('parseModelString', () => {
85
85
  files: true,
86
86
  functionCall: true,
87
87
  id: 'gpt-4-0125-preview',
88
- tokens: 128000,
88
+ contextWindowTokens: 128000,
89
89
  },
90
90
  {
91
91
  displayName: 'ChatGPT-4 Vision',
92
92
  files: true,
93
93
  functionCall: true,
94
94
  id: 'gpt-4-turbo-2024-04-09',
95
- tokens: 128000,
95
+ contextWindowTokens: 128000,
96
96
  vision: true,
97
97
  },
98
98
  ]);
@@ -100,27 +100,27 @@ describe('parseModelString', () => {
100
100
 
101
101
  it('should handle empty extension capability value', () => {
102
102
  const result = parseModelString('model1<1024:>');
103
- expect(result.add[0]).toEqual({ id: 'model1', tokens: 1024 });
103
+ expect(result.add[0]).toEqual({ id: 'model1', contextWindowTokens: 1024 });
104
104
  });
105
105
 
106
106
  it('should handle empty extension capability name', () => {
107
107
  const result = parseModelString('model1<1024::file>');
108
- expect(result.add[0]).toEqual({ id: 'model1', tokens: 1024, files: true });
108
+ expect(result.add[0]).toEqual({ id: 'model1', contextWindowTokens: 1024, files: true });
109
109
  });
110
110
 
111
111
  it('should handle duplicate extension capabilities', () => {
112
112
  const result = parseModelString('model1<1024:vision:vision>');
113
- expect(result.add[0]).toEqual({ id: 'model1', tokens: 1024, vision: true });
113
+ expect(result.add[0]).toEqual({ id: 'model1', contextWindowTokens: 1024, vision: true });
114
114
  });
115
115
 
116
116
  it('should handle case-sensitive extension capability names', () => {
117
117
  const result = parseModelString('model1<1024:VISION:FC:file>');
118
- expect(result.add[0]).toEqual({ id: 'model1', tokens: 1024, files: true });
118
+ expect(result.add[0]).toEqual({ id: 'model1', contextWindowTokens: 1024, files: true });
119
119
  });
120
120
 
121
121
  it('should handle case-sensitive extension capability values', () => {
122
122
  const result = parseModelString('model1<1024:vision:Fc:File>');
123
- expect(result.add[0]).toEqual({ id: 'model1', tokens: 1024, vision: true });
123
+ expect(result.add[0]).toEqual({ id: 'model1', contextWindowTokens: 1024, vision: true });
124
124
  });
125
125
 
126
126
  it('should handle empty angle brackets', () => {
@@ -155,27 +155,27 @@ describe('parseModelString', () => {
155
155
 
156
156
  it('should handle digits followed by non-colon characters inside angle brackets', () => {
157
157
  const result = parseModelString('model1<1024abc>');
158
- expect(result.add[0]).toEqual({ id: 'model1', tokens: 1024 });
158
+ expect(result.add[0]).toEqual({ id: 'model1', contextWindowTokens: 1024 });
159
159
  });
160
160
 
161
161
  it('should handle digits followed by multiple colons inside angle brackets', () => {
162
162
  const result = parseModelString('model1<1024::>');
163
- expect(result.add[0]).toEqual({ id: 'model1', tokens: 1024 });
163
+ expect(result.add[0]).toEqual({ id: 'model1', contextWindowTokens: 1024 });
164
164
  });
165
165
 
166
166
  it('should handle digits followed by a colon and non-letter characters inside angle brackets', () => {
167
167
  const result = parseModelString('model1<1024:123>');
168
- expect(result.add[0]).toEqual({ id: 'model1', tokens: 1024 });
168
+ expect(result.add[0]).toEqual({ id: 'model1', contextWindowTokens: 1024 });
169
169
  });
170
170
 
171
171
  it('should handle digits followed by a colon and spaces inside angle brackets', () => {
172
172
  const result = parseModelString('model1<1024: vision>');
173
- expect(result.add[0]).toEqual({ id: 'model1', tokens: 1024 });
173
+ expect(result.add[0]).toEqual({ id: 'model1', contextWindowTokens: 1024 });
174
174
  });
175
175
 
176
176
  it('should handle digits followed by multiple colons and spaces inside angle brackets', () => {
177
177
  const result = parseModelString('model1<1024: : vision>');
178
- expect(result.add[0]).toEqual({ id: 'model1', tokens: 1024 });
178
+ expect(result.add[0]).toEqual({ id: 'model1', contextWindowTokens: 1024 });
179
179
  });
180
180
  });
181
181
 
@@ -56,7 +56,7 @@ export const parseModelString = (modelString: string = '', withDeploymentName =
56
56
 
57
57
  if (capabilities.length > 0) {
58
58
  const [maxTokenStr, ...capabilityList] = capabilities[0].replace('>', '').split(':');
59
- model.tokens = parseInt(maxTokenStr, 10) || undefined;
59
+ model.contextWindowTokens = parseInt(maxTokenStr, 10) || undefined;
60
60
 
61
61
  for (const capability of capabilityList) {
62
62
  switch (capability) {
@@ -1,10 +1,6 @@
1
1
  import { importJWK, jwtVerify } from 'jose';
2
2
 
3
- import {
4
- JWTPayload,
5
- JWT_SECRET_KEY,
6
- NON_HTTP_PREFIX,
7
- } from '@/const/auth';
3
+ import { JWTPayload, JWT_SECRET_KEY, NON_HTTP_PREFIX } from '@/const/auth';
8
4
 
9
5
  export const getJWTPayload = async (token: string): Promise<JWTPayload> => {
10
6
  //如果是 HTTP 协议发起的请求,直接解析 token
@@ -29,4 +25,4 @@ export const getJWTPayload = async (token: string): Promise<JWTPayload> => {
29
25
  const { payload } = await jwtVerify(token, jwkSecretKey);
30
26
 
31
27
  return payload as JWTPayload;
32
- };
28
+ };