@lobehub/chat 0.162.17 → 0.162.18

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 (149) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/docs/self-hosting/advanced/settings-url-share.mdx +89 -57
  3. package/docs/self-hosting/advanced/settings-url-share.zh-CN.mdx +87 -56
  4. package/locales/ar/error.json +7 -39
  5. package/locales/ar/modelProvider.json +15 -183
  6. package/locales/ar/setting.json +5 -8
  7. package/locales/bg-BG/error.json +6 -38
  8. package/locales/bg-BG/modelProvider.json +15 -183
  9. package/locales/bg-BG/setting.json +5 -8
  10. package/locales/de-DE/error.json +6 -38
  11. package/locales/de-DE/modelProvider.json +15 -183
  12. package/locales/de-DE/setting.json +5 -8
  13. package/locales/en-US/error.json +6 -38
  14. package/locales/en-US/modelProvider.json +15 -183
  15. package/locales/en-US/setting.json +6 -9
  16. package/locales/es-ES/error.json +6 -38
  17. package/locales/es-ES/modelProvider.json +15 -183
  18. package/locales/es-ES/setting.json +5 -8
  19. package/locales/fr-FR/error.json +6 -38
  20. package/locales/fr-FR/modelProvider.json +15 -183
  21. package/locales/fr-FR/setting.json +9 -12
  22. package/locales/it-IT/error.json +6 -38
  23. package/locales/it-IT/modelProvider.json +15 -183
  24. package/locales/it-IT/setting.json +5 -8
  25. package/locales/ja-JP/error.json +6 -38
  26. package/locales/ja-JP/modelProvider.json +15 -183
  27. package/locales/ja-JP/setting.json +5 -8
  28. package/locales/ko-KR/error.json +6 -38
  29. package/locales/ko-KR/modelProvider.json +15 -183
  30. package/locales/ko-KR/setting.json +5 -8
  31. package/locales/nl-NL/error.json +6 -38
  32. package/locales/nl-NL/modelProvider.json +15 -183
  33. package/locales/nl-NL/setting.json +5 -8
  34. package/locales/pl-PL/error.json +6 -38
  35. package/locales/pl-PL/modelProvider.json +15 -183
  36. package/locales/pl-PL/setting.json +6 -9
  37. package/locales/pt-BR/error.json +6 -38
  38. package/locales/pt-BR/modelProvider.json +15 -183
  39. package/locales/pt-BR/setting.json +5 -8
  40. package/locales/ru-RU/error.json +6 -38
  41. package/locales/ru-RU/modelProvider.json +15 -183
  42. package/locales/ru-RU/setting.json +5 -8
  43. package/locales/tr-TR/error.json +6 -38
  44. package/locales/tr-TR/modelProvider.json +15 -183
  45. package/locales/tr-TR/setting.json +5 -8
  46. package/locales/vi-VN/error.json +6 -38
  47. package/locales/vi-VN/modelProvider.json +15 -183
  48. package/locales/vi-VN/setting.json +5 -8
  49. package/locales/zh-CN/error.json +7 -39
  50. package/locales/zh-CN/modelProvider.json +15 -183
  51. package/locales/zh-CN/setting.json +5 -8
  52. package/locales/zh-TW/error.json +7 -39
  53. package/locales/zh-TW/modelProvider.json +15 -183
  54. package/locales/zh-TW/setting.json +5 -8
  55. package/package.json +1 -2
  56. package/src/app/(main)/settings/llm/ProviderList/Azure/index.tsx +107 -0
  57. package/src/app/(main)/settings/llm/ProviderList/Bedrock/index.tsx +68 -0
  58. package/src/app/(main)/settings/llm/ProviderList/Ollama/index.tsx +29 -0
  59. package/src/app/(main)/settings/llm/ProviderList/OpenAI/index.tsx +20 -0
  60. package/src/app/(main)/settings/llm/ProviderList/providers.tsx +141 -0
  61. package/src/app/(main)/settings/llm/components/ProviderConfig/index.tsx +18 -27
  62. package/src/app/(main)/settings/llm/index.tsx +7 -36
  63. package/src/app/(main)/settings/llm/type.ts +5 -0
  64. package/src/app/api/chat/[provider]/route.ts +8 -3
  65. package/src/app/api/errorResponse.test.ts +7 -95
  66. package/src/app/api/errorResponse.ts +6 -46
  67. package/src/app/api/middleware/auth/index.ts +7 -3
  68. package/src/components/ModelSelect/index.tsx +7 -10
  69. package/src/config/modelProviders/anthropic.ts +5 -0
  70. package/src/config/modelProviders/azure.ts +2 -0
  71. package/src/config/modelProviders/bedrock.ts +2 -0
  72. package/src/config/modelProviders/deepseek.ts +4 -1
  73. package/src/config/modelProviders/google.ts +5 -0
  74. package/src/config/modelProviders/groq.ts +5 -0
  75. package/src/config/modelProviders/minimax.ts +2 -0
  76. package/src/config/modelProviders/mistral.ts +2 -0
  77. package/src/config/modelProviders/moonshot.ts +2 -0
  78. package/src/config/modelProviders/ollama.ts +4 -0
  79. package/src/config/modelProviders/openai.ts +3 -0
  80. package/src/config/modelProviders/openrouter.ts +3 -0
  81. package/src/config/modelProviders/perplexity.ts +5 -0
  82. package/src/config/modelProviders/qwen.ts +3 -0
  83. package/src/config/modelProviders/togetherai.ts +3 -0
  84. package/src/config/modelProviders/zeroone.ts +4 -2
  85. package/src/config/modelProviders/zhipu.ts +2 -0
  86. package/src/features/Conversation/Error/APIKeyForm/ProviderApiKeyForm.tsx +6 -3
  87. package/src/features/Conversation/Error/OllamaBizError/InvalidOllamaModel/index.tsx +11 -14
  88. package/src/features/Conversation/Error/index.tsx +29 -20
  89. package/src/features/Conversation/components/ChatItem/index.tsx +4 -13
  90. package/src/features/ModelSelect/index.tsx +1 -1
  91. package/src/features/ModelSwitchPanel/index.tsx +1 -1
  92. package/src/hooks/useProviderName.ts +8 -0
  93. package/src/libs/agent-runtime/anthropic/index.test.ts +8 -5
  94. package/src/libs/agent-runtime/anthropic/index.ts +3 -3
  95. package/src/libs/agent-runtime/azureOpenai/index.test.ts +5 -2
  96. package/src/libs/agent-runtime/azureOpenai/index.ts +2 -2
  97. package/src/libs/agent-runtime/bedrock/index.test.ts +2 -2
  98. package/src/libs/agent-runtime/bedrock/index.ts +2 -2
  99. package/src/libs/agent-runtime/deepseek/index.test.ts +3 -2
  100. package/src/libs/agent-runtime/deepseek/index.ts +0 -5
  101. package/src/libs/agent-runtime/error.ts +11 -46
  102. package/src/libs/agent-runtime/google/index.test.ts +3 -4
  103. package/src/libs/agent-runtime/google/index.ts +4 -4
  104. package/src/libs/agent-runtime/groq/index.test.ts +3 -2
  105. package/src/libs/agent-runtime/groq/index.ts +0 -4
  106. package/src/libs/agent-runtime/minimax/index.test.ts +3 -2
  107. package/src/libs/agent-runtime/minimax/index.ts +5 -5
  108. package/src/libs/agent-runtime/mistral/index.test.ts +2 -2
  109. package/src/libs/agent-runtime/mistral/index.ts +0 -5
  110. package/src/libs/agent-runtime/moonshot/index.test.ts +3 -2
  111. package/src/libs/agent-runtime/moonshot/index.ts +0 -5
  112. package/src/libs/agent-runtime/openrouter/index.test.ts +3 -2
  113. package/src/libs/agent-runtime/openrouter/index.ts +0 -6
  114. package/src/libs/agent-runtime/perplexity/index.test.ts +2 -2
  115. package/src/libs/agent-runtime/perplexity/index.ts +0 -5
  116. package/src/libs/agent-runtime/qwen/index.test.ts +2 -2
  117. package/src/libs/agent-runtime/qwen/index.ts +0 -5
  118. package/src/libs/agent-runtime/togetherai/index.test.ts +3 -2
  119. package/src/libs/agent-runtime/togetherai/index.ts +0 -5
  120. package/src/libs/agent-runtime/utils/openaiCompatibleFactory/index.test.ts +2 -6
  121. package/src/libs/agent-runtime/utils/openaiCompatibleFactory/index.ts +12 -6
  122. package/src/libs/agent-runtime/zeroone/index.test.ts +3 -2
  123. package/src/libs/agent-runtime/zeroone/index.ts +1 -5
  124. package/src/libs/agent-runtime/zhipu/index.test.ts +8 -5
  125. package/src/libs/agent-runtime/zhipu/index.ts +2 -2
  126. package/src/locales/default/error.ts +10 -51
  127. package/src/locales/default/modelProvider.ts +12 -169
  128. package/src/locales/default/setting.ts +5 -8
  129. package/src/services/message/client.test.ts +4 -1
  130. package/src/types/fetch.ts +3 -1
  131. package/src/types/llm.ts +22 -0
  132. package/src/app/(main)/settings/llm/Anthropic/index.tsx +0 -25
  133. package/src/app/(main)/settings/llm/Azure/index.tsx +0 -110
  134. package/src/app/(main)/settings/llm/Bedrock/index.tsx +0 -74
  135. package/src/app/(main)/settings/llm/DeepSeek/index.tsx +0 -21
  136. package/src/app/(main)/settings/llm/Google/index.tsx +0 -31
  137. package/src/app/(main)/settings/llm/Groq/index.tsx +0 -26
  138. package/src/app/(main)/settings/llm/Minimax/index.tsx +0 -20
  139. package/src/app/(main)/settings/llm/Mistral/index.tsx +0 -20
  140. package/src/app/(main)/settings/llm/Moonshot/index.tsx +0 -28
  141. package/src/app/(main)/settings/llm/Ollama/index.tsx +0 -37
  142. package/src/app/(main)/settings/llm/OpenAI/index.tsx +0 -28
  143. package/src/app/(main)/settings/llm/OpenRouter/index.tsx +0 -21
  144. package/src/app/(main)/settings/llm/Perplexity/index.tsx +0 -23
  145. package/src/app/(main)/settings/llm/Qwen/index.tsx +0 -21
  146. package/src/app/(main)/settings/llm/TogetherAI/index.tsx +0 -19
  147. package/src/app/(main)/settings/llm/ZeroOne/index.tsx +0 -20
  148. package/src/app/(main)/settings/llm/Zhipu/index.tsx +0 -18
  149. /package/src/app/(main)/settings/llm/{Ollama → ProviderList/Ollama}/Checker.tsx +0 -0
@@ -0,0 +1,141 @@
1
+ import {
2
+ Anthropic,
3
+ Claude,
4
+ DeepSeek,
5
+ Gemini,
6
+ Google,
7
+ Groq,
8
+ Minimax,
9
+ Mistral,
10
+ Moonshot,
11
+ OpenRouter,
12
+ Perplexity,
13
+ Together,
14
+ Tongyi,
15
+ ZeroOne,
16
+ Zhipu,
17
+ } from '@lobehub/icons';
18
+ import { Divider } from 'antd';
19
+ import { useTheme } from 'antd-style';
20
+ import { useMemo } from 'react';
21
+ import { Flexbox } from 'react-layout-kit';
22
+
23
+ import {
24
+ AnthropicProviderCard,
25
+ DeepSeekProviderCard,
26
+ GoogleProviderCard,
27
+ GroqProviderCard,
28
+ MinimaxProviderCard,
29
+ MistralProviderCard,
30
+ MoonshotProviderCard,
31
+ OpenRouterProviderCard,
32
+ PerplexityProviderCard,
33
+ QwenProviderCard,
34
+ TogetherAIProviderCard,
35
+ ZeroOneProviderCard,
36
+ ZhiPuProviderCard,
37
+ } from '@/config/modelProviders';
38
+
39
+ import { ProviderItem } from '../type';
40
+ import { useAzureProvider } from './Azure';
41
+ import { useBedrockProvider } from './Bedrock';
42
+ import { useOllamaProvider } from './Ollama';
43
+ import { useOpenAIProvider } from './OpenAI';
44
+
45
+ const AnthropicBrand = () => {
46
+ const { isDarkMode } = useTheme();
47
+ return <Anthropic.Text color={isDarkMode ? undefined : Claude.colorPrimary} size={15} />;
48
+ };
49
+
50
+ const MoonshotBrand = () => {
51
+ const theme = useTheme();
52
+ return (
53
+ <Moonshot.Combine
54
+ color={theme.isDarkMode ? theme.colorText : Moonshot.colorPrimary}
55
+ size={22}
56
+ />
57
+ );
58
+ };
59
+
60
+ const GroqBrand = () => {
61
+ const theme = useTheme();
62
+
63
+ return <Groq.Text color={theme.isDarkMode ? theme.colorText : Groq.colorPrimary} size={20} />;
64
+ };
65
+
66
+ const GoogleBrand = () => (
67
+ <Flexbox align={'center'} gap={8} horizontal>
68
+ <Google.BrandColor size={22} />
69
+ <Divider style={{ margin: '0 4px' }} type={'vertical'} />
70
+ <Gemini.Combine size={22} type={'color'} />
71
+ </Flexbox>
72
+ );
73
+
74
+ export const useProviderList = (): ProviderItem[] => {
75
+ const azureProvider = useAzureProvider();
76
+ const ollamaProvider = useOllamaProvider();
77
+ const openAIProvider = useOpenAIProvider();
78
+ const bedrockProvider = useBedrockProvider();
79
+
80
+ return useMemo(
81
+ () => [
82
+ openAIProvider,
83
+ ollamaProvider,
84
+ azureProvider,
85
+ {
86
+ ...GoogleProviderCard,
87
+ title: <GoogleBrand />,
88
+ },
89
+ {
90
+ ...AnthropicProviderCard,
91
+ title: <AnthropicBrand />,
92
+ },
93
+ bedrockProvider,
94
+ {
95
+ ...GroqProviderCard,
96
+ title: <GroqBrand />,
97
+ },
98
+ {
99
+ ...OpenRouterProviderCard,
100
+ title: <OpenRouter.Combine iconProps={{ color: OpenRouter.colorPrimary }} size={20} />,
101
+ },
102
+ {
103
+ ...TogetherAIProviderCard,
104
+ title: <Together.Combine size={26} type={'color'} />,
105
+ },
106
+ {
107
+ ...QwenProviderCard,
108
+ title: <Tongyi.Combine extra={'千问'} size={26} type={'color'} />,
109
+ },
110
+ {
111
+ ...DeepSeekProviderCard,
112
+ title: <DeepSeek.Combine size={28} type={'color'} />,
113
+ },
114
+ {
115
+ ...MinimaxProviderCard,
116
+ title: <Minimax.Combine size={32} type={'color'} />,
117
+ },
118
+ {
119
+ ...MistralProviderCard,
120
+ title: <Mistral.Combine size={26} type={'color'} />,
121
+ },
122
+ {
123
+ ...MoonshotProviderCard,
124
+ title: <MoonshotBrand />,
125
+ },
126
+ {
127
+ ...PerplexityProviderCard,
128
+ title: <Perplexity.Combine size={24} type={'color'} />,
129
+ },
130
+ {
131
+ ...ZhiPuProviderCard,
132
+ title: <Zhipu.Combine size={32} type={'color'} />,
133
+ },
134
+ {
135
+ ...ZeroOneProviderCard,
136
+ title: <ZeroOne.Text size={20} />,
137
+ },
138
+ ],
139
+ [azureProvider, ollamaProvider, ollamaProvider, bedrockProvider],
140
+ );
141
+ };
@@ -19,6 +19,7 @@ import {
19
19
  import { FORM_STYLE } from '@/const/layoutTokens';
20
20
  import { useUserStore } from '@/store/user';
21
21
  import { keyVaultsConfigSelectors, modelConfigSelectors } from '@/store/user/selectors';
22
+ import { ModelProviderCard } from '@/types/llm';
22
23
  import { GlobalLLMProviderKey } from '@/types/user/settings';
23
24
 
24
25
  import Checker from '../Checker';
@@ -46,36 +47,26 @@ const useStyles = createStyles(({ css, prefixCls, responsive }) => ({
46
47
  `,
47
48
  }));
48
49
 
49
- interface ProviderConfigProps {
50
+ export interface ProviderConfigProps extends Omit<ModelProviderCard, 'id'> {
50
51
  apiKeyItems?: FormItemProps[];
51
52
  canDeactivate?: boolean;
52
- checkModel?: string;
53
53
  checkerItem?: FormItemProps;
54
54
  className?: string;
55
55
  hideSwitch?: boolean;
56
+ id: GlobalLLMProviderKey;
56
57
  modelList?: {
57
58
  azureDeployName?: boolean;
58
59
  notFoundContent?: ReactNode;
59
60
  placeholder?: string;
60
61
  showModelFetcher?: boolean;
61
62
  };
62
- provider: GlobalLLMProviderKey;
63
- proxyUrl?:
64
- | {
65
- desc?: string;
66
- placeholder: string;
67
- title?: string;
68
- }
69
- | false;
70
- showApiKey?: boolean;
71
- showBrowserRequest?: boolean;
72
63
  title: ReactNode;
73
64
  }
74
65
 
75
66
  const ProviderConfig = memo<ProviderConfigProps>(
76
67
  ({
77
68
  apiKeyItems,
78
- provider,
69
+ id,
79
70
  proxyUrl,
80
71
  showApiKey = true,
81
72
  checkModel,
@@ -85,9 +76,9 @@ const ProviderConfig = memo<ProviderConfigProps>(
85
76
  modelList,
86
77
  showBrowserRequest,
87
78
  className,
79
+ name,
88
80
  }) => {
89
81
  const { t } = useTranslation('setting');
90
- const { t: modelT } = useTranslation('modelProvider');
91
82
  const [form] = Form.useForm();
92
83
  const { cx, styles } = useStyles();
93
84
  const [
@@ -99,9 +90,9 @@ const ProviderConfig = memo<ProviderConfigProps>(
99
90
  ] = useUserStore((s) => [
100
91
  s.toggleProviderEnabled,
101
92
  s.setSettings,
102
- modelConfigSelectors.isProviderEnabled(provider)(s),
103
- modelConfigSelectors.isProviderFetchOnClient(provider)(s),
104
- keyVaultsConfigSelectors.isProviderEndpointNotEmpty(provider)(s),
93
+ modelConfigSelectors.isProviderEnabled(id)(s),
94
+ modelConfigSelectors.isProviderFetchOnClient(id)(s),
95
+ keyVaultsConfigSelectors.isProviderEndpointNotEmpty(id)(s),
105
96
  ]);
106
97
 
107
98
  useSyncSettings(form);
@@ -113,12 +104,12 @@ const ProviderConfig = memo<ProviderConfigProps>(
113
104
  children: (
114
105
  <Input.Password
115
106
  autoComplete={'new-password'}
116
- placeholder={modelT(`${provider}.token.placeholder` as any)}
107
+ placeholder={t(`llm.apiKey.placeholder`, { name })}
117
108
  />
118
109
  ),
119
- desc: modelT(`${provider}.token.desc` as any),
120
- label: modelT(`${provider}.token.title` as any),
121
- name: [KeyVaultsConfigKey, provider, LLMProviderApiTokenKey],
110
+ desc: t(`llm.apiKey.desc`, { name }),
111
+ label: t(`llm.apiKey.title`),
112
+ name: [KeyVaultsConfigKey, id, LLMProviderApiTokenKey],
122
113
  },
123
114
  ];
124
115
 
@@ -129,13 +120,13 @@ const ProviderConfig = memo<ProviderConfigProps>(
129
120
  children: <Input allowClear placeholder={proxyUrl?.placeholder} />,
130
121
  desc: proxyUrl?.desc || t('llm.proxyUrl.desc'),
131
122
  label: proxyUrl?.title || t('llm.proxyUrl.title'),
132
- name: [KeyVaultsConfigKey, provider, LLMProviderBaseUrlKey],
123
+ name: [KeyVaultsConfigKey, id, LLMProviderBaseUrlKey],
133
124
  },
134
125
  (showBrowserRequest || (showEndpoint && isProviderEndpointNotEmpty)) && {
135
126
  children: (
136
127
  <Switch
137
128
  onChange={(enabled) => {
138
- setSettings({ [LLMProviderConfigKey]: { [provider]: { fetchOnClient: enabled } } });
129
+ setSettings({ [LLMProviderConfigKey]: { [id]: { fetchOnClient: enabled } } });
139
130
  }}
140
131
  value={isFetchOnClient}
141
132
  />
@@ -149,17 +140,17 @@ const ProviderConfig = memo<ProviderConfigProps>(
149
140
  <ProviderModelListSelect
150
141
  notFoundContent={modelList?.notFoundContent}
151
142
  placeholder={modelList?.placeholder ?? t('llm.modelList.placeholder')}
152
- provider={provider}
143
+ provider={id}
153
144
  showAzureDeployName={modelList?.azureDeployName}
154
145
  showModelFetcher={modelList?.showModelFetcher}
155
146
  />
156
147
  ),
157
148
  desc: t('llm.modelList.desc'),
158
149
  label: t('llm.modelList.title'),
159
- name: [LLMProviderConfigKey, provider, LLMProviderModelListKey],
150
+ name: [LLMProviderConfigKey, id, LLMProviderModelListKey],
160
151
  },
161
152
  checkerItem ?? {
162
- children: <Checker model={checkModel!} provider={provider} />,
153
+ children: <Checker model={checkModel!} provider={id} />,
163
154
  desc: t('llm.checker.desc'),
164
155
  label: t('llm.checker.title'),
165
156
  minWidth: undefined,
@@ -173,7 +164,7 @@ const ProviderConfig = memo<ProviderConfigProps>(
173
164
  extra: canDeactivate ? (
174
165
  <Switch
175
166
  onChange={(enabled) => {
176
- toggleProviderEnabled(provider, enabled);
167
+ toggleProviderEnabled(id, enabled);
177
168
  }}
178
169
  value={enabled}
179
170
  />
@@ -2,46 +2,17 @@
2
2
 
3
3
  import { Flexbox } from 'react-layout-kit';
4
4
 
5
- import Anthropic from './Anthropic';
6
- import Azure from './Azure';
7
- import Bedrock from './Bedrock';
8
- import DeepSeek from './DeepSeek';
9
- import Google from './Google';
10
- import Groq from './Groq';
11
- import Minimax from './Minimax';
12
- import Mistral from './Mistral';
13
- import Moonshot from './Moonshot';
14
- import Ollama from './Ollama';
15
- import OpenAI from './OpenAI';
16
- import OpenRouter from './OpenRouter';
17
- import Perplexity from './Perplexity';
18
- import Qwen from './Qwen';
19
- import TogetherAI from './TogetherAI';
20
- import ZeroOne from './ZeroOne';
21
- import Zhipu from './Zhipu';
22
- import Footer from './components/Footer';
5
+ import { useProviderList } from './ProviderList/providers';
6
+ import ProviderConfig from './components/ProviderConfig';
23
7
 
24
8
  const Page = () => {
9
+ const list = useProviderList();
10
+
25
11
  return (
26
12
  <Flexbox gap={24} width={'100%'}>
27
- <OpenAI />
28
- <Ollama />
29
- <Azure />
30
- <Google />
31
- <Anthropic />
32
- <Bedrock />
33
- <DeepSeek />
34
- <OpenRouter />
35
- <TogetherAI />
36
- <Groq />
37
- <Perplexity />
38
- <Qwen />
39
- <Minimax />
40
- <Mistral />
41
- <Moonshot />
42
- <Zhipu />
43
- <ZeroOne />
44
- <Footer />
13
+ {list.map(({ id, ...res }) => (
14
+ <ProviderConfig id={id as any} key={id} {...res} />
15
+ ))}
45
16
  </Flexbox>
46
17
  );
47
18
  };
@@ -0,0 +1,5 @@
1
+ import { ProviderConfigProps } from './components/ProviderConfig';
2
+
3
+ export interface ProviderItem extends Omit<ProviderConfigProps, 'id'> {
4
+ id: string;
5
+ }
@@ -1,6 +1,6 @@
1
1
  import { getPreferredRegion } from '@/app/api/config';
2
2
  import { createErrorResponse } from '@/app/api/errorResponse';
3
- import { ChatCompletionErrorPayload } from '@/libs/agent-runtime';
3
+ import { AgentRuntime, ChatCompletionErrorPayload } from '@/libs/agent-runtime';
4
4
  import { ChatErrorType } from '@/types/fetch';
5
5
  import { ChatStreamPayload } from '@/types/openai/chat';
6
6
  import { getTracePayload } from '@/utils/trace';
@@ -12,12 +12,17 @@ export const runtime = 'edge';
12
12
 
13
13
  export const preferredRegion = getPreferredRegion();
14
14
 
15
- export const POST = checkAuth(async (req: Request, { params, jwtPayload }) => {
15
+ export const POST = checkAuth(async (req: Request, { params, jwtPayload, createRuntime }) => {
16
16
  const { provider } = params;
17
17
 
18
18
  try {
19
19
  // ============ 1. init chat model ============ //
20
- const agentRuntime = await initAgentRuntimeWithUserPayload(provider, jwtPayload);
20
+ let agentRuntime: AgentRuntime;
21
+ if (createRuntime) {
22
+ agentRuntime = createRuntime(jwtPayload);
23
+ } else {
24
+ agentRuntime = await initAgentRuntimeWithUserPayload(provider, jwtPayload);
25
+ }
21
26
 
22
27
  // ============ 2. create chat completion ============ //
23
28
 
@@ -34,7 +34,13 @@ describe('createErrorResponse', () => {
34
34
 
35
35
  describe('Provider Biz Error', () => {
36
36
  it('returns a 471 status for OpenAIBizError error type', () => {
37
- const errorType = ChatErrorType.OpenAIBizError;
37
+ const errorType = AgentRuntimeErrorType.OpenAIBizError;
38
+ const response = createErrorResponse(errorType);
39
+ expect(response.status).toBe(471);
40
+ });
41
+
42
+ it('returns a 471 status for ProviderBizError error type', () => {
43
+ const errorType = AgentRuntimeErrorType.ProviderBizError;
38
44
  const response = createErrorResponse(errorType);
39
45
  expect(response.status).toBe(471);
40
46
  });
@@ -50,100 +56,6 @@ describe('createErrorResponse', () => {
50
56
  const response = createErrorResponse(errorType as any);
51
57
  expect(response.status).toBe(471);
52
58
  });
53
-
54
- // 测试 AzureBizError 错误类型返回472状态码
55
- it('returns a 472 status for AzureBizError error type', () => {
56
- const errorType = AgentRuntimeErrorType.AzureBizError;
57
- const response = createErrorResponse(errorType);
58
- expect(response.status).toBe(472);
59
- });
60
-
61
- // 测试 ZhipuBizError 错误类型返回473状态码
62
- it('returns a 473 status for ZhipuBizError error type', () => {
63
- const errorType = AgentRuntimeErrorType.ZhipuBizError;
64
- const response = createErrorResponse(errorType);
65
- expect(response.status).toBe(473);
66
- });
67
-
68
- // 测试 BedrockBizError 错误类型返回474状态码
69
- it('returns a 474 status for BedrockBizError error type', () => {
70
- const errorType = AgentRuntimeErrorType.BedrockBizError;
71
- const response = createErrorResponse(errorType);
72
- expect(response.status).toBe(474);
73
- });
74
-
75
- // 测试 GoogleBizError 错误类型返回475状态码
76
- it('returns a 475 status for GoogleBizError error type', () => {
77
- const errorType = AgentRuntimeErrorType.GoogleBizError;
78
- const response = createErrorResponse(errorType);
79
- expect(response.status).toBe(475);
80
- });
81
-
82
- // 测试 MoonshotBizError 错误类型返回476状态码
83
- it('returns a 476 status for MoonshotBizError error type', () => {
84
- const errorType = AgentRuntimeErrorType.MoonshotBizError;
85
- const response = createErrorResponse(errorType);
86
- expect(response.status).toBe(476);
87
- });
88
-
89
- // 测试 OpenRouterBizError 错误类型返回477状态码
90
- it('returns a 477 status for OpenRouterBizError error type', () => {
91
- const errorType = AgentRuntimeErrorType.OpenRouterBizError;
92
- const response = createErrorResponse(errorType);
93
- expect(response.status).toBe(477);
94
- });
95
-
96
- // 测试 OllamaBizError 错误类型返回478状态码
97
- it('returns a 478 status for OllamaBizError error type', () => {
98
- const errorType = AgentRuntimeErrorType.OllamaBizError;
99
- const response = createErrorResponse(errorType);
100
- expect(response.status).toBe(478);
101
- });
102
-
103
- // 测试 PerplexityBizError 错误类型返回479状态码
104
- it('returns a 479 status for PerplexityBizError error type', () => {
105
- const errorType = AgentRuntimeErrorType.PerplexityBizError;
106
- const response = createErrorResponse(errorType);
107
- expect(response.status).toBe(479);
108
- });
109
-
110
- // 测试 AnthropicBizError 错误类型返回480状态码
111
- it('returns a 480 status for AnthropicBizError error type', () => {
112
- const errorType = AgentRuntimeErrorType.AnthropicBizError;
113
- const response = createErrorResponse(errorType);
114
- expect(response.status).toBe(480);
115
- });
116
-
117
- // 测试 MistralBizError 错误类型返回481状态码
118
- it('returns a 481 status for MistralBizError error type', () => {
119
- const errorType = AgentRuntimeErrorType.MistralBizError;
120
- const response = createErrorResponse(errorType);
121
- expect(response.status).toBe(481);
122
- });
123
-
124
- it('returns a 484 status for TogetherAIBizError error type', () => {
125
- const errorType = AgentRuntimeErrorType.TogetherAIBizError;
126
- const response = createErrorResponse(errorType);
127
- expect(response.status).toBe(484);
128
- });
129
-
130
- it('returns a 485 status for MinimaxBizError error type', () => {
131
- const errorType = AgentRuntimeErrorType.MinimaxBizError;
132
- const response = createErrorResponse(errorType);
133
- expect(response.status).toBe(485);
134
- });
135
-
136
- it('returns a 486 status for DeepSeekBizError error type', () => {
137
- const errorType = AgentRuntimeErrorType.DeepSeekBizError;
138
- const response = createErrorResponse(errorType);
139
- expect(response.status).toBe(486);
140
- });
141
-
142
- it('returns a 487 status for QwenBizError error type', () => {
143
- const errorType = AgentRuntimeErrorType.QwenBizError;
144
- const response = createErrorResponse(errorType);
145
- expect(response.status).toBe(487);
146
- });
147
59
  });
148
60
 
149
61
  // 测试状态码不在200-599范围内的情况
@@ -7,6 +7,7 @@ const getStatus = (errorType: ILobeAgentRuntimeErrorType | ErrorType) => {
7
7
 
8
8
  switch (errorType) {
9
9
  // TODO: Need to refactor to Invalid OpenAI API Key
10
+ case AgentRuntimeErrorType.InvalidProviderAPIKey:
10
11
  case AgentRuntimeErrorType.NoOpenAIAPIKey: {
11
12
  return 401;
12
13
  }
@@ -19,59 +20,18 @@ const getStatus = (errorType: ILobeAgentRuntimeErrorType | ErrorType) => {
19
20
  case AgentRuntimeErrorType.AgentRuntimeError: {
20
21
  return 470;
21
22
  }
23
+
24
+ case AgentRuntimeErrorType.ProviderBizError:
22
25
  case AgentRuntimeErrorType.OpenAIBizError: {
23
26
  return 471;
24
27
  }
25
- case AgentRuntimeErrorType.AzureBizError: {
26
- return 472;
27
- }
28
- case AgentRuntimeErrorType.ZhipuBizError: {
29
- return 473;
30
- }
31
- case AgentRuntimeErrorType.BedrockBizError: {
32
- return 474;
33
- }
34
- case AgentRuntimeErrorType.GoogleBizError: {
35
- return 475;
36
- }
37
- case AgentRuntimeErrorType.MoonshotBizError: {
38
- return 476;
39
- }
40
- case AgentRuntimeErrorType.OpenRouterBizError: {
41
- return 477;
42
- }
28
+
43
29
  case ChatErrorType.OllamaServiceUnavailable:
44
30
  case AgentRuntimeErrorType.OllamaBizError: {
45
- return 478;
46
- }
47
- case AgentRuntimeErrorType.PerplexityBizError: {
48
- return 479;
49
- }
50
- case AgentRuntimeErrorType.AnthropicBizError: {
51
- return 480;
52
- }
53
- case AgentRuntimeErrorType.MistralBizError: {
54
- return 481;
55
- }
56
- case AgentRuntimeErrorType.GroqBizError: {
57
- return 482;
58
- }
59
- case AgentRuntimeErrorType.ZeroOneBizError: {
60
- return 483;
61
- }
62
- case AgentRuntimeErrorType.TogetherAIBizError: {
63
- return 484;
64
- }
65
- case AgentRuntimeErrorType.MinimaxBizError: {
66
- return 485;
67
- }
68
- case AgentRuntimeErrorType.DeepSeekBizError: {
69
- return 486;
70
- }
71
- case AgentRuntimeErrorType.QwenBizError: {
72
- return 487;
31
+ return 472;
73
32
  }
74
33
  }
34
+
75
35
  return errorType as number;
76
36
  };
77
37
 
@@ -4,16 +4,20 @@ import { NextRequest } from 'next/server';
4
4
 
5
5
  import { createErrorResponse } from '@/app/api/errorResponse';
6
6
  import { JWTPayload, LOBE_CHAT_AUTH_HEADER, OAUTH_AUTHORIZED, enableClerk } from '@/const/auth';
7
- import { AgentRuntimeError, ChatCompletionErrorPayload } from '@/libs/agent-runtime';
7
+ import { AgentRuntime, AgentRuntimeError, ChatCompletionErrorPayload } from '@/libs/agent-runtime';
8
8
  import { ChatErrorType } from '@/types/fetch';
9
9
 
10
10
  import { checkAuthMethod, getJWTPayload } from './utils';
11
11
 
12
- type RequestOptions = { params: { provider: string } };
12
+ type CreateRuntime = (jwtPayload: JWTPayload) => AgentRuntime;
13
+ type RequestOptions = { createRuntime?: CreateRuntime, params: { provider: string }; };
13
14
 
14
15
  export type RequestHandler = (
15
16
  req: Request,
16
- options: RequestOptions & { jwtPayload: JWTPayload },
17
+ options: RequestOptions & {
18
+ createRuntime?: CreateRuntime;
19
+ jwtPayload: JWTPayload;
20
+ },
17
21
  ) => Promise<Response>;
18
22
 
19
23
  export const checkAuth =
@@ -151,16 +151,13 @@ export const ModelItemRender = memo<ModelItemRenderProps>(({ showInfoTag = true,
151
151
  });
152
152
 
153
153
  interface ProviderItemRenderProps {
154
+ name: string;
154
155
  provider: string;
155
156
  }
156
157
 
157
- export const ProviderItemRender = memo<ProviderItemRenderProps>(({ provider }) => {
158
- const { t } = useTranslation('modelProvider');
159
-
160
- return (
161
- <Flexbox align={'center'} gap={4} horizontal>
162
- <ModelProviderIcon provider={provider} />
163
- {t(`${provider}.title` as any)}
164
- </Flexbox>
165
- );
166
- });
158
+ export const ProviderItemRender = memo<ProviderItemRenderProps>(({ provider, name }) => (
159
+ <Flexbox align={'center'} gap={4} horizontal>
160
+ <ModelProviderIcon provider={provider} />
161
+ {name}
162
+ </Flexbox>
163
+ ));
@@ -58,7 +58,12 @@ const Anthropic: ModelProviderCard = {
58
58
  tokens: 100_000,
59
59
  },
60
60
  ],
61
+ checkModel: 'claude-3-haiku-20240307',
61
62
  id: 'anthropic',
63
+ name: 'Anthropic',
64
+ proxyUrl: {
65
+ placeholder: 'https://api.anthropic.com',
66
+ },
62
67
  };
63
68
 
64
69
  export default Anthropic;
@@ -38,6 +38,8 @@ const Azure: ModelProviderCard = {
38
38
  },
39
39
  ],
40
40
  id: 'azure',
41
+ name: 'Azure',
42
+ showBrowserRequest: true,
41
43
  };
42
44
 
43
45
  export default Azure;
@@ -88,7 +88,9 @@ const Bedrock: ModelProviderCard = {
88
88
  tokens: 4096,
89
89
  },
90
90
  ],
91
+ checkModel: 'anthropic.claude-instant-v1',
91
92
  id: 'bedrock',
93
+ name: 'Bedrock',
92
94
  };
93
95
 
94
96
  export default Bedrock;
@@ -17,7 +17,10 @@ const DeepSeek: ModelProviderCard = {
17
17
  tokens: 16_384,
18
18
  },
19
19
  ],
20
+ checkModel: 'deepseek-chat',
20
21
  id: 'deepseek',
22
+ modelList: { showModelFetcher: true },
23
+ name: 'DeepSeek',
21
24
  };
22
25
 
23
- export default DeepSeek;
26
+ export default DeepSeek;
@@ -97,7 +97,12 @@ const Google: ModelProviderCard = {
97
97
  tokens: 32_768,
98
98
  },
99
99
  ],
100
+ checkModel: 'gemini-pro',
100
101
  id: 'google',
102
+ name: 'Google',
103
+ proxyUrl: {
104
+ placeholder: 'https://generativelanguage.googleapis.com',
105
+ },
101
106
  };
102
107
 
103
108
  export default Google;
@@ -37,7 +37,12 @@ const Groq: ModelProviderCard = {
37
37
  tokens: 4096,
38
38
  },
39
39
  ],
40
+ checkModel: 'gemma-7b-it',
40
41
  id: 'groq',
42
+ name: 'Groq',
43
+ proxyUrl: {
44
+ placeholder: 'https://api.groq.com/openai/v1',
45
+ },
41
46
  };
42
47
 
43
48
  export default Groq;