@lobehub/chat 0.141.2 → 0.142.0
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.
- package/.env.example +6 -0
- package/CHANGELOG.md +25 -0
- package/Dockerfile +3 -0
- package/README.md +14 -14
- package/README.zh-CN.md +16 -15
- package/docs/self-hosting/environment-variables/model-provider.zh-CN.mdx +10 -0
- package/docs/usage/features/multi-ai-providers.zh-CN.mdx +1 -0
- package/docs/usage/providers/ollama/qwen.mdx +47 -0
- package/docs/usage/providers/ollama/qwen.zh-CN.mdx +45 -0
- package/locales/ar/common.json +1 -0
- package/locales/ar/error.json +7 -1
- package/locales/ar/setting.json +8 -0
- package/locales/de-DE/common.json +1 -0
- package/locales/de-DE/error.json +7 -1
- package/locales/de-DE/setting.json +8 -0
- package/locales/en-US/common.json +1 -0
- package/locales/en-US/error.json +7 -1
- package/locales/en-US/setting.json +8 -0
- package/locales/es-ES/common.json +1 -0
- package/locales/es-ES/error.json +7 -1
- package/locales/es-ES/setting.json +8 -0
- package/locales/fr-FR/common.json +1 -0
- package/locales/fr-FR/error.json +7 -1
- package/locales/fr-FR/setting.json +8 -0
- package/locales/it-IT/common.json +1 -0
- package/locales/it-IT/error.json +7 -1
- package/locales/it-IT/setting.json +30 -24
- package/locales/ja-JP/common.json +1 -0
- package/locales/ja-JP/error.json +7 -1
- package/locales/ja-JP/setting.json +30 -24
- package/locales/ko-KR/common.json +1 -0
- package/locales/ko-KR/error.json +7 -1
- package/locales/ko-KR/setting.json +8 -0
- package/locales/nl-NL/common.json +1 -0
- package/locales/nl-NL/error.json +7 -1
- package/locales/nl-NL/setting.json +30 -24
- package/locales/pl-PL/common.json +1 -0
- package/locales/pl-PL/error.json +7 -1
- package/locales/pl-PL/setting.json +8 -0
- package/locales/pt-BR/common.json +1 -0
- package/locales/pt-BR/error.json +7 -1
- package/locales/pt-BR/setting.json +8 -0
- package/locales/ru-RU/common.json +1 -0
- package/locales/ru-RU/error.json +7 -1
- package/locales/ru-RU/setting.json +8 -0
- package/locales/tr-TR/common.json +1 -0
- package/locales/tr-TR/error.json +7 -1
- package/locales/tr-TR/setting.json +8 -0
- package/locales/vi-VN/common.json +1 -0
- package/locales/vi-VN/error.json +7 -1
- package/locales/vi-VN/setting.json +8 -0
- package/locales/zh-CN/common.json +1 -0
- package/locales/zh-CN/error.json +7 -1
- package/locales/zh-CN/setting.json +8 -0
- package/locales/zh-TW/common.json +1 -0
- package/locales/zh-TW/error.json +7 -1
- package/locales/zh-TW/setting.json +8 -0
- package/package.json +1 -1
- package/src/app/api/chat/[provider]/agentRuntime.ts +15 -2
- package/src/app/api/config/route.ts +2 -0
- package/src/app/api/errorResponse.ts +3 -0
- package/src/app/settings/llm/Google/index.tsx +10 -3
- package/src/app/settings/llm/ZeroOne/index.tsx +52 -0
- package/src/app/settings/llm/index.tsx +2 -0
- package/src/components/ModelIcon/index.tsx +2 -0
- package/src/components/ModelProviderIcon/index.tsx +5 -0
- package/src/components/ModelTag/ModelIcon.tsx +2 -0
- package/src/config/modelProviders/index.ts +3 -0
- package/src/config/modelProviders/zeroone.ts +28 -0
- package/src/config/server/provider.ts +10 -2
- package/src/const/settings.ts +4 -0
- package/src/features/Conversation/Error/APIKeyForm/ZeroOne.tsx +60 -0
- package/src/features/Conversation/Error/APIKeyForm/index.tsx +6 -1
- package/src/features/Conversation/Error/index.tsx +1 -0
- package/src/libs/agent-runtime/error.ts +4 -1
- package/src/libs/agent-runtime/index.ts +1 -0
- package/src/libs/agent-runtime/types/type.ts +1 -0
- package/src/libs/agent-runtime/zeroone/index.ts +78 -0
- package/src/locales/default/common.ts +1 -0
- package/src/locales/default/error.ts +8 -1
- package/src/locales/default/setting.ts +8 -0
- package/src/services/_auth.ts +5 -1
- package/src/store/global/slices/settings/selectors/modelProvider.ts +11 -2
- package/src/types/settings/modelProvider.ts +7 -0
|
@@ -37,7 +37,10 @@ export const AgentRuntimeErrorType = {
|
|
|
37
37
|
|
|
38
38
|
InvalidGroqAPIKey: 'InvalidGroqAPIKey',
|
|
39
39
|
GroqBizError: 'GroqBizError',
|
|
40
|
-
|
|
40
|
+
|
|
41
|
+
InvalidZeroOneAPIKey: 'InvalidZeroOneAPIKey',
|
|
42
|
+
ZeroOneBizError: 'ZeroOneBizError',
|
|
43
|
+
|
|
41
44
|
InvalidOpenRouterAPIKey: 'InvalidOpenRouterAPIKey',
|
|
42
45
|
OpenRouterBizError: 'OpenRouterBizError',
|
|
43
46
|
} as const;
|
|
@@ -13,4 +13,5 @@ export { LobeOpenRouterAI } from './openrouter';
|
|
|
13
13
|
export { LobePerplexityAI } from './perplexity';
|
|
14
14
|
export * from './types';
|
|
15
15
|
export { AgentRuntimeError } from './utils/createError';
|
|
16
|
+
export { LobeZeroOneAI } from './zeroone';
|
|
16
17
|
export { LobeZhipuAI } from './zhipu';
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { OpenAIStream, StreamingTextResponse } from 'ai';
|
|
2
|
+
import OpenAI, { ClientOptions } from 'openai';
|
|
3
|
+
|
|
4
|
+
import { LobeRuntimeAI } from '../BaseAI';
|
|
5
|
+
import { AgentRuntimeErrorType } from '../error';
|
|
6
|
+
import { ChatCompetitionOptions, ChatStreamPayload, ModelProvider } from '../types';
|
|
7
|
+
import { AgentRuntimeError } from '../utils/createError';
|
|
8
|
+
import { debugStream } from '../utils/debugStream';
|
|
9
|
+
import { desensitizeUrl } from '../utils/desensitizeUrl';
|
|
10
|
+
import { handleOpenAIError } from '../utils/handleOpenAIError';
|
|
11
|
+
|
|
12
|
+
const DEFAULT_BASE_URL = 'https://api.lingyiwanwu.com/v1';
|
|
13
|
+
|
|
14
|
+
export class LobeZeroOneAI implements LobeRuntimeAI {
|
|
15
|
+
private client: OpenAI;
|
|
16
|
+
|
|
17
|
+
baseURL: string;
|
|
18
|
+
|
|
19
|
+
constructor({ apiKey, baseURL = DEFAULT_BASE_URL, ...res }: ClientOptions) {
|
|
20
|
+
if (!apiKey) throw AgentRuntimeError.createError(AgentRuntimeErrorType.InvalidZeroOneAPIKey);
|
|
21
|
+
|
|
22
|
+
this.client = new OpenAI({ apiKey, baseURL, ...res });
|
|
23
|
+
this.baseURL = this.client.baseURL;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
async chat(payload: ChatStreamPayload, options?: ChatCompetitionOptions) {
|
|
27
|
+
try {
|
|
28
|
+
const response = await this.client.chat.completions.create(
|
|
29
|
+
payload as unknown as OpenAI.ChatCompletionCreateParamsStreaming
|
|
30
|
+
);
|
|
31
|
+
const [prod, debug] = response.tee();
|
|
32
|
+
|
|
33
|
+
if (process.env.DEBUG_ZEROONE_CHAT_COMPLETION === '1') {
|
|
34
|
+
debugStream(debug.toReadableStream()).catch(console.error);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return new StreamingTextResponse(OpenAIStream(prod, options?.callback), {
|
|
38
|
+
headers: options?.headers,
|
|
39
|
+
});
|
|
40
|
+
} catch (error) {
|
|
41
|
+
let desensitizedEndpoint = this.baseURL;
|
|
42
|
+
|
|
43
|
+
if (this.baseURL !== DEFAULT_BASE_URL) {
|
|
44
|
+
desensitizedEndpoint = desensitizeUrl(this.baseURL);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if ('status' in (error as any)) {
|
|
48
|
+
switch ((error as Response).status) {
|
|
49
|
+
case 401: {
|
|
50
|
+
throw AgentRuntimeError.chat({
|
|
51
|
+
endpoint: desensitizedEndpoint,
|
|
52
|
+
error: error as any,
|
|
53
|
+
errorType: AgentRuntimeErrorType.InvalidZeroOneAPIKey,
|
|
54
|
+
provider: ModelProvider.ZeroOne,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
default: {
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const { errorResult, RuntimeError } = handleOpenAIError(error);
|
|
65
|
+
|
|
66
|
+
const errorType = RuntimeError || AgentRuntimeErrorType.ZeroOneBizError;
|
|
67
|
+
|
|
68
|
+
throw AgentRuntimeError.chat({
|
|
69
|
+
endpoint: desensitizedEndpoint,
|
|
70
|
+
error: errorResult,
|
|
71
|
+
errorType,
|
|
72
|
+
provider: ModelProvider.ZeroOne,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export default LobeZeroOneAI;
|
|
@@ -84,10 +84,13 @@ export default {
|
|
|
84
84
|
|
|
85
85
|
InvalidGroqAPIKey: 'Groq API Key 不正确或为空,请检查 Groq API Key 后重试',
|
|
86
86
|
GroqBizError: '请求 Groq 服务出错,请根据以下信息排查或重试',
|
|
87
|
-
|
|
87
|
+
|
|
88
88
|
InvalidOpenRouterAPIKey: 'OpenRouter API Key 不正确或为空,请检查 OpenRouter API Key 后重试',
|
|
89
89
|
OpenRouterBizError: '请求 OpenRouter AI 服务出错,请根据以下信息排查或重试',
|
|
90
90
|
|
|
91
|
+
ZeroOneBizError: '请求零一万物服务出错,请根据以下信息排查或重试',
|
|
92
|
+
InvalidZeroOneAPIKey: '零一万物 API Key 不正确或为空,请检查零一万物 API Key 后重试',
|
|
93
|
+
|
|
91
94
|
InvalidOllamaArgs: 'Ollama 配置不正确,请检查 Ollama 配置后重试',
|
|
92
95
|
OllamaBizError: '请求 Ollama 服务出错,请根据以下信息排查或重试',
|
|
93
96
|
OllamaServiceUnavailable: '未检测到 Ollama 服务,请检查是否正常启动',
|
|
@@ -142,6 +145,10 @@ export default {
|
|
|
142
145
|
description: '输入你的 Perplexity API Key 即可开始会话。应用不会记录你的 API Key',
|
|
143
146
|
title: '使用自定义 Perplexity API Key',
|
|
144
147
|
},
|
|
148
|
+
ZeroOne: {
|
|
149
|
+
description: '输入你的零一万物 API Key 即可开始会话。应用不会记录你的 API Key',
|
|
150
|
+
title: '使用自定义零一万物 API Key',
|
|
151
|
+
},
|
|
145
152
|
Zhipu: {
|
|
146
153
|
description: '输入你的 Zhipu API Key 即可开始会话。应用不会记录你的 API Key',
|
|
147
154
|
title: '使用自定义 Zhipu API Key',
|
|
@@ -202,6 +202,14 @@ export default {
|
|
|
202
202
|
title: 'API Key',
|
|
203
203
|
},
|
|
204
204
|
},
|
|
205
|
+
ZeroOne: {
|
|
206
|
+
title: '01.AI 零一万物',
|
|
207
|
+
token: {
|
|
208
|
+
desc: '填入来自 01.AI 零一万物的 API Key',
|
|
209
|
+
placeholder: '01.AI 零一万物 API Key',
|
|
210
|
+
title: 'API Key',
|
|
211
|
+
}
|
|
212
|
+
},
|
|
205
213
|
Zhipu: {
|
|
206
214
|
title: '智谱',
|
|
207
215
|
token: {
|
package/src/services/_auth.ts
CHANGED
|
@@ -65,11 +65,15 @@ export const getProviderAuthPayload = (provider: string) => {
|
|
|
65
65
|
case ModelProvider.Groq: {
|
|
66
66
|
return { apiKey: modelProviderSelectors.groqAPIKey(useGlobalStore.getState()) };
|
|
67
67
|
}
|
|
68
|
-
|
|
68
|
+
|
|
69
69
|
case ModelProvider.OpenRouter: {
|
|
70
70
|
return { apiKey: modelProviderSelectors.openrouterAPIKey(useGlobalStore.getState()) };
|
|
71
71
|
}
|
|
72
72
|
|
|
73
|
+
case ModelProvider.ZeroOne: {
|
|
74
|
+
return { apiKey: modelProviderSelectors.zerooneAPIKey(useGlobalStore.getState()) };
|
|
75
|
+
}
|
|
76
|
+
|
|
73
77
|
default:
|
|
74
78
|
case ModelProvider.OpenAI: {
|
|
75
79
|
const openai = modelProviderSelectors.openAIConfig(useGlobalStore.getState());
|
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
OpenAIProvider,
|
|
13
13
|
OpenRouterProvider,
|
|
14
14
|
PerplexityProvider,
|
|
15
|
+
ZeroOneProvider,
|
|
15
16
|
ZhiPuProvider,
|
|
16
17
|
} from '@/config/modelProviders';
|
|
17
18
|
import { ChatModelCard, ModelProviderCard } from '@/types/llm';
|
|
@@ -66,6 +67,9 @@ const groqAPIKey = (s: GlobalStore) => modelProvider(s).groq.apiKey;
|
|
|
66
67
|
const enableOpenrouter = (s: GlobalStore) => modelProvider(s).openrouter.enabled;
|
|
67
68
|
const openrouterAPIKey = (s: GlobalStore) => modelProvider(s).openrouter.apiKey;
|
|
68
69
|
|
|
70
|
+
const enableZeroone = (s: GlobalStore) => modelProvider(s).zeroone.enabled;
|
|
71
|
+
const zerooneAPIKey = (s: GlobalStore) => modelProvider(s).zeroone.apiKey;
|
|
72
|
+
|
|
69
73
|
// const azureModelList = (s: GlobalStore): ModelProviderCard => {
|
|
70
74
|
// const azure = azureConfig(s);
|
|
71
75
|
// return {
|
|
@@ -165,7 +169,8 @@ const modelSelectList = (s: GlobalStore): ModelProviderCard[] => {
|
|
|
165
169
|
{ ...GroqProvider, enabled: enableGroq(s) },
|
|
166
170
|
{ ...ZhiPuProvider, enabled: enableZhipu(s) },
|
|
167
171
|
{ ...MoonshotProvider, enabled: enableMoonshot(s) },
|
|
168
|
-
{ ...OpenRouterProvider, chatModels: openrouterChatModels, enabled: enableOpenrouter(s)}
|
|
172
|
+
{ ...OpenRouterProvider, chatModels: openrouterChatModels, enabled: enableOpenrouter(s)},
|
|
173
|
+
{ ...ZeroOneProvider, enabled: enableZeroone(s) }
|
|
169
174
|
];
|
|
170
175
|
};
|
|
171
176
|
|
|
@@ -252,8 +257,12 @@ export const modelProviderSelectors = {
|
|
|
252
257
|
// Groq
|
|
253
258
|
enableGroq,
|
|
254
259
|
groqAPIKey,
|
|
255
|
-
|
|
260
|
+
|
|
256
261
|
// OpenRouter
|
|
257
262
|
enableOpenrouter,
|
|
258
263
|
openrouterAPIKey,
|
|
264
|
+
|
|
265
|
+
// ZeroOne 零一万物
|
|
266
|
+
enableZeroone,
|
|
267
|
+
zerooneAPIKey,
|
|
259
268
|
};
|
|
@@ -82,6 +82,12 @@ export interface OpenRouterConfig {
|
|
|
82
82
|
enabled?: boolean;
|
|
83
83
|
}
|
|
84
84
|
|
|
85
|
+
export interface ZeroOneConfig {
|
|
86
|
+
apiKey?: string;
|
|
87
|
+
customModelName?: string;
|
|
88
|
+
enabled?: boolean;
|
|
89
|
+
}
|
|
90
|
+
|
|
85
91
|
export interface GlobalLLMConfig {
|
|
86
92
|
anthropic: AnthropicConfig;
|
|
87
93
|
azure: AzureOpenAIConfig;
|
|
@@ -94,6 +100,7 @@ export interface GlobalLLMConfig {
|
|
|
94
100
|
openAI: OpenAIConfig;
|
|
95
101
|
openrouter: OpenRouterConfig;
|
|
96
102
|
perplexity: PerplexityConfig;
|
|
103
|
+
zeroone: ZeroOneConfig;
|
|
97
104
|
zhipu: ZhiPuConfig;
|
|
98
105
|
}
|
|
99
106
|
|