From 44eaf62e6cf553353543bbe1bb75994aebce678a Mon Sep 17 00:00:00 2001 From: VLOU <919070296@qq.com> Date: Sat, 13 Apr 2024 20:07:59 +0800 Subject: [PATCH] =?UTF-8?q?[update]=E8=A1=A5=E5=85=85chatchat=20model?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/.env.example | 25 ++++++++------- .../app/api/chat/[provider]/agentRuntime.ts | 4 +-- frontend/src/components/ModelIcon/index.tsx | 2 +- .../components/ModelProviderIcon/index.tsx | 12 +++++++ .../src/config/modelProviders/chatchat.ts | 20 ++++++++++++ frontend/src/config/modelProviders/index.ts | 3 ++ frontend/src/config/server/provider.ts | 5 ++- .../src/libs/agent-runtime/chatchat/index.ts | 32 ++++++++++--------- frontend/src/libs/agent-runtime/types/type.ts | 2 +- frontend/src/locales/default/common.ts | 1 + frontend/src/services/_auth.ts | 4 +++ .../settings/selectors/modelProvider.ts | 9 ++++++ 12 files changed, 88 insertions(+), 31 deletions(-) create mode 100644 frontend/src/config/modelProviders/chatchat.ts diff --git a/frontend/.env.example b/frontend/.env.example index 149cc8e8..e072464f 100644 --- a/frontend/.env.example +++ b/frontend/.env.example @@ -1,5 +1,5 @@ # add a access code to lock your lobe-chat application, you can set a long password to avoid leaking. If this value contains a comma, it is a password array. -#ACCESS_CODE=lobe66 +# ACCESS_CODE=lobe66 # add your custom model name, multi model separate by comma. for example gpt-3.5-1106,gpt-4-1106 # CUSTOM_MODELS=model1,model2,model3 @@ -14,7 +14,7 @@ ######################################## # you openai api key -OPENAI_API_KEY=sk-xxxxxxxxx +OPENAI_API_KEY = sk-xxxxxxxxx # use a proxy to connect to the OpenAI API # OPENAI_PROXY_URL=https://api.openai.com/v1 @@ -40,27 +40,27 @@ OPENAI_API_KEY=sk-xxxxxxxxx ############ ZhiPu AI Service ########## ######################################## -#ZHIPU_API_KEY=xxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxx +# ZHIPU_API_KEY=xxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxx ######################################## ########## Moonshot AI Service ######### ######################################## -#MOONSHOT_API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +# MOONSHOT_API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ######################################## ########### Google AI Service ########## ######################################## -#GOOGLE_API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx +# GOOGLE_API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx ######################################## ######### AWS Bedrock Service ########## ######################################## -#AWS_REGION=us-east-1 -#AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxxxxx -#AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +# AWS_REGION=us-east-1 +# AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxxxxx +# AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ######################################## ######### Ollama AI Service ########## @@ -73,19 +73,19 @@ OPENAI_API_KEY=sk-xxxxxxxxx ########### Mistral AI Service ########## ######################################## -#MISTRAL_API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx +# MISTRAL_API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx ######################################## ######### Perplexity Service ########## ######################################## -#PERPLEXITY_API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx +# PERPLEXITY_API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx ######################################## ######### Anthropic Service ########## ######################################## -#ANTHROPIC_API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx +# ANTHROPIC_API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx ######################################## ############ Market Service ############ @@ -98,6 +98,9 @@ OPENAI_API_KEY=sk-xxxxxxxxx ############ Plugin Service ############ ######################################## +# you can use ChatChat.The local/remote ChatChat service url +CHATCHAT_PROXY_URL = 'http://localhost:7861/v1' + # The LobeChat plugins store index url # PLUGINS_INDEX_URL=https://chat-plugins.lobehub.com diff --git a/frontend/src/app/api/chat/[provider]/agentRuntime.ts b/frontend/src/app/api/chat/[provider]/agentRuntime.ts index 2622d602..8bef5918 100644 --- a/frontend/src/app/api/chat/[provider]/agentRuntime.ts +++ b/frontend/src/app/api/chat/[provider]/agentRuntime.ts @@ -276,8 +276,8 @@ class AgentRuntime { } private static initChatChat(payload: JWTPayload) { - const { KNOWLEDGE_PROXY_URL } = getServerConfig(); - const baseURL = payload?.endpoint || KNOWLEDGE_PROXY_URL; + const { CHATCHAT_PROXY_URL } = getServerConfig(); + const baseURL = payload?.endpoint || CHATCHAT_PROXY_URL; return new LobeChatChatAI({ baseURL }); } diff --git a/frontend/src/components/ModelIcon/index.tsx b/frontend/src/components/ModelIcon/index.tsx index cd281f61..c8243fed 100644 --- a/frontend/src/components/ModelIcon/index.tsx +++ b/frontend/src/components/ModelIcon/index.tsx @@ -25,7 +25,7 @@ const ModelIcon = memo(({ model, size = 12 }) => { if (model.startsWith('gpt-3')) return ; if (model.startsWith('gpt-4')) return ; - if (model.startsWith('glm')) return ; + if (model.includes('glm')) return ; if (model.includes('claude')) return ; if (model.includes('titan')) return ; if (model.includes('llama')) return ; diff --git a/frontend/src/components/ModelProviderIcon/index.tsx b/frontend/src/components/ModelProviderIcon/index.tsx index 456b9f3d..834bc300 100644 --- a/frontend/src/components/ModelProviderIcon/index.tsx +++ b/frontend/src/components/ModelProviderIcon/index.tsx @@ -12,9 +12,12 @@ import { } from '@lobehub/icons'; import { memo } from 'react'; import { Center } from 'react-layout-kit'; +import Avatar from 'next/image'; import { ModelProvider } from '@/libs/agent-runtime'; +import { imageUrl } from '@/const/url'; + interface ModelProviderIconProps { provider?: string; } @@ -69,6 +72,15 @@ const ModelProviderIcon = memo(({ provider }) => { return ; } + case ModelProvider.ChatChat: { + return + } + default: { return null; } diff --git a/frontend/src/config/modelProviders/chatchat.ts b/frontend/src/config/modelProviders/chatchat.ts new file mode 100644 index 00000000..83af503f --- /dev/null +++ b/frontend/src/config/modelProviders/chatchat.ts @@ -0,0 +1,20 @@ +import { ModelProviderCard } from '@/types/llm'; + +const ChatChat: ModelProviderCard = { + id: 'chatchat', + chatModels: [ + { + id: 'chatglm_pro', + tokens: 128_000, + displayName: 'chatglm_pro' + }, + { + id: 'gpt-4-turbo-2024-04-09', + tokens: 128_000, + displayName: 'gpt-4-turbo-2024-04-09', + vision: true, + } + ] +} + +export default ChatChat; \ No newline at end of file diff --git a/frontend/src/config/modelProviders/index.ts b/frontend/src/config/modelProviders/index.ts index e30bd72e..12e6552a 100644 --- a/frontend/src/config/modelProviders/index.ts +++ b/frontend/src/config/modelProviders/index.ts @@ -9,6 +9,7 @@ import OllamaProvider from './ollama'; import OpenAIProvider from './openai'; import PerplexityProvider from './perplexity'; import ZhiPuProvider from './zhipu'; +import ChatChatProvider from './chatchat' export const LOBE_DEFAULT_MODEL_LIST: ChatModelCard[] = [ OpenAIProvider.chatModels, @@ -20,6 +21,7 @@ export const LOBE_DEFAULT_MODEL_LIST: ChatModelCard[] = [ OllamaProvider.chatModels, PerplexityProvider.chatModels, AnthropicProvider.chatModels, + ChatChatProvider.chatModels, ].flat(); export { default as AnthropicProvider } from './anthropic'; @@ -31,3 +33,4 @@ export { default as OllamaProvider } from './ollama'; export { default as OpenAIProvider } from './openai'; export { default as PerplexityProvider } from './perplexity'; export { default as ZhiPuProvider } from './zhipu'; +export { default as ChatChatProvider } from './chatchat' diff --git a/frontend/src/config/server/provider.ts b/frontend/src/config/server/provider.ts index aa0cc569..037d9bc6 100644 --- a/frontend/src/config/server/provider.ts +++ b/frontend/src/config/server/provider.ts @@ -46,6 +46,9 @@ declare global { // Ollama Provider; OLLAMA_PROXY_URL?: string; + + // ChatChat + CHATCHAT_PROXY_URL?: string; } } } @@ -115,6 +118,6 @@ export const getProviderConfig = () => { ENABLE_OLLAMA: !!process.env.OLLAMA_PROXY_URL, OLLAMA_PROXY_URL: process.env.OLLAMA_PROXY_URL || '', - KNOWLEDGE_PROXY_URL: process.env.OLLAMA_PROXY_URL || '', + CHATCHAT_PROXY_URL: process.env.CHATCHAT_PROXY_URL || '', }; }; diff --git a/frontend/src/libs/agent-runtime/chatchat/index.ts b/frontend/src/libs/agent-runtime/chatchat/index.ts index 266e9ff8..fb605fb3 100644 --- a/frontend/src/libs/agent-runtime/chatchat/index.ts +++ b/frontend/src/libs/agent-runtime/chatchat/index.ts @@ -26,24 +26,26 @@ export class LobeChatChatAI implements LobeRuntimeAI { } async chat(payload: ChatStreamPayload, options?: ChatCompetitionOptions) { + + console.log('payload---', payload) try { const response = await this.client.chat.completions.create( payload as unknown as (OpenAI.ChatCompletionCreateParamsStreaming | OpenAI.ChatCompletionCreateParamsNonStreaming), ); if (LobeChatChatAI.isStream(response)) { - + const [prod, debug] = response.tee(); - + if (process.env.DEBUG_OLLAMA_CHAT_COMPLETION === '1') { - debugStream(debug.toReadableStream()).catch(console.error); - } - + debugStream(debug.toReadableStream()).catch(console.error); + } + return new StreamingTextResponse(OpenAIStream(prod, options?.callback), { headers: options?.headers, }); } else { - + if (process.env.DEBUG_OLLAMA_CHAT_COMPLETION === '1') { console.debug(JSON.stringify(response)); } @@ -93,18 +95,18 @@ export class LobeChatChatAI implements LobeRuntimeAI { return typeof Stream !== 'undefined' && (obj instanceof Stream || obj instanceof ReadableStream); } - + // 创建一个类型为 Stream 的流 static createChatCompletionStream(text: string): ReadableStream { - const stream = new ReadableStream({ - start(controller) { - controller.enqueue(text); - controller.close(); - }, - }); - - return stream; + const stream = new ReadableStream({ + start(controller) { + controller.enqueue(text); + controller.close(); + }, + }); + + return stream; } } \ No newline at end of file diff --git a/frontend/src/libs/agent-runtime/types/type.ts b/frontend/src/libs/agent-runtime/types/type.ts index bfa1e3ca..f7cb2576 100644 --- a/frontend/src/libs/agent-runtime/types/type.ts +++ b/frontend/src/libs/agent-runtime/types/type.ts @@ -25,7 +25,7 @@ export enum ModelProvider { Anthropic = 'anthropic', Azure = 'azure', Bedrock = 'bedrock', - ChatChat = 'chatChat', + ChatChat = 'chatchat', ChatGLM = 'chatglm', Google = 'google', Mistral = 'mistral', diff --git a/frontend/src/locales/default/common.ts b/frontend/src/locales/default/common.ts index 49514f7c..d0b3e699 100644 --- a/frontend/src/locales/default/common.ts +++ b/frontend/src/locales/default/common.ts @@ -111,6 +111,7 @@ export default { openai: 'OpenAI', perplexity: 'Perplexity', zhipu: '智谱AI', + chatchat: 'ChatChat', }, noDescription: '暂无描述', oauth: 'SSO 登录', diff --git a/frontend/src/services/_auth.ts b/frontend/src/services/_auth.ts index e056a09c..b889538c 100644 --- a/frontend/src/services/_auth.ts +++ b/frontend/src/services/_auth.ts @@ -60,6 +60,10 @@ export const getProviderAuthPayload = (provider: string) => { return { apiKey: modelProviderSelectors.mistralAPIKey(useGlobalStore.getState()) }; } + case ModelProvider.ChatChat: { + return { endpoint: modelProviderSelectors.chatChatProxyUrl(useGlobalStore.getState()) } + } + default: case ModelProvider.OpenAI: { const openai = modelProviderSelectors.openAIConfig(useGlobalStore.getState()); diff --git a/frontend/src/store/global/slices/settings/selectors/modelProvider.ts b/frontend/src/store/global/slices/settings/selectors/modelProvider.ts index 09ae50f8..c0738ce5 100644 --- a/frontend/src/store/global/slices/settings/selectors/modelProvider.ts +++ b/frontend/src/store/global/slices/settings/selectors/modelProvider.ts @@ -11,6 +11,7 @@ import { OpenAIProvider, PerplexityProvider, ZhiPuProvider, + ChatChatProvider, } from '@/config/modelProviders'; import { ChatModelCard, ModelProviderCard } from '@/types/llm'; import { GlobalLLMProviderKey } from '@/types/settings'; @@ -60,6 +61,9 @@ const perplexityAPIKey = (s: GlobalStore) => modelProvider(s).perplexity.apiKey; const enableAnthropic = (s: GlobalStore) => modelProvider(s).anthropic.enabled; const anthropicAPIKey = (s: GlobalStore) => modelProvider(s).anthropic.apiKey; +const enableChatChat = (s: GlobalStore) => modelProvider(s).chatchat.enabled; +const chatChatProxyUrl = (s: GlobalStore) => modelProvider(s).chatchat.endpoint; + // const azureModelList = (s: GlobalStore): ModelProviderCard => { // const azure = azureConfig(s); // return { @@ -148,6 +152,7 @@ const modelSelectList = (s: GlobalStore): ModelProviderCard[] => { { ...PerplexityProvider, enabled: enablePerplexity(s) }, { ...AnthropicProvider, enabled: enableAnthropic(s) }, { ...MistralProvider, enabled: enableMistral(s) }, + { ...ChatChatProvider, enabled: enableChatChat(s) }, ]; }; @@ -230,4 +235,8 @@ export const modelProviderSelectors = { // Mistral enableMistral, mistralAPIKey, + + // ChatChat + enableChatChat, + chatChatProxyUrl, };