From 7c322b75364de5f6b9dedc61c7a71c2ed05c9a47 Mon Sep 17 00:00:00 2001 From: kangfenmao Date: Thu, 11 Jul 2024 16:11:34 +0800 Subject: [PATCH] feat: add openrouter provider --- .../src/assets/images/models/microsoft.png | Bin 0 -> 2051 bytes .../assets/images/providers/openrouter.png | Bin 0 -> 6715 bytes src/renderer/src/config/models.ts | 42 ++++++++++++++++++ .../src/pages/home/components/Navigation.tsx | 2 +- .../settings/components/ModelListPopup.tsx | 4 +- .../settings/components/ProviderSetting.tsx | 4 +- src/renderer/src/services/provider.ts | 8 +++- src/renderer/src/store/index.ts | 2 +- src/renderer/src/store/llm.ts | 9 ++++ src/renderer/src/store/migrate.ts | 20 +++++++++ 10 files changed, 85 insertions(+), 6 deletions(-) create mode 100644 src/renderer/src/assets/images/models/microsoft.png create mode 100644 src/renderer/src/assets/images/providers/openrouter.png diff --git a/src/renderer/src/assets/images/models/microsoft.png b/src/renderer/src/assets/images/models/microsoft.png new file mode 100644 index 0000000000000000000000000000000000000000..43af01e98c72c9db772426dfcdaa986c54e1dcb3 GIT binary patch literal 2051 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 Ofu1R;Kfx-zLjM<=DJyaS literal 0 HcmV?d00001 diff --git a/src/renderer/src/config/models.ts b/src/renderer/src/config/models.ts index c9ececd6..5fdd5036 100644 --- a/src/renderer/src/config/models.ts +++ b/src/renderer/src/config/models.ts @@ -311,6 +311,48 @@ export const SYSTEM_MODELS: Record = { defaultEnabled: true } ], + openrouter: [ + { + id: 'google/gemma-2-9b-it:free', + provider: 'openrouter', + name: 'Google: Gemma 2 9B', + group: 'Gemma', + temperature: 0.7, + defaultEnabled: true + }, + { + id: 'microsoft/phi-3-mini-128k-instruct:free', + provider: 'openrouter', + name: 'Phi-3 Mini 128K Instruct', + group: 'Phi', + temperature: 0.7, + defaultEnabled: true + }, + { + id: 'microsoft/phi-3-medium-128k-instruct:free', + provider: 'openrouter', + name: 'Phi-3 Medium 128K Instruct', + group: 'Phi', + temperature: 0.7, + defaultEnabled: true + }, + { + id: 'meta-llama/llama-3-8b-instruct:free', + provider: 'openrouter', + name: 'Meta: Llama 3 8B Instruct', + group: 'Llama3', + temperature: 0.7, + defaultEnabled: true + }, + { + id: 'mistralai/mistral-7b-instruct:free', + provider: 'openrouter', + name: 'Mistral: Mistral 7B Instruct', + group: 'Mistral', + temperature: 0.7, + defaultEnabled: true + } + ], groq: [ { id: 'llama3-8b-8192', diff --git a/src/renderer/src/pages/home/components/Navigation.tsx b/src/renderer/src/pages/home/components/Navigation.tsx index 4196ccfc..00914bce 100644 --- a/src/renderer/src/pages/home/components/Navigation.tsx +++ b/src/renderer/src/pages/home/components/Navigation.tsx @@ -32,7 +32,7 @@ const Navigation: FC = ({ activeAssistant }) => { return ( {activeAssistant?.name} - + diff --git a/src/renderer/src/pages/settings/components/ModelListPopup.tsx b/src/renderer/src/pages/settings/components/ModelListPopup.tsx index 1cf80cfb..6b0ea8da 100644 --- a/src/renderer/src/pages/settings/components/ModelListPopup.tsx +++ b/src/renderer/src/pages/settings/components/ModelListPopup.tsx @@ -67,7 +67,9 @@ const PopupContainer: React.FC = ({ provider: _provider, resolve }) => { return ( - + + {model.name[0].toUpperCase()} + {model.name} {hasModel ? ( diff --git a/src/renderer/src/pages/settings/components/ProviderSetting.tsx b/src/renderer/src/pages/settings/components/ProviderSetting.tsx index 88d69143..8d9eac15 100644 --- a/src/renderer/src/pages/settings/components/ProviderSetting.tsx +++ b/src/renderer/src/pages/settings/components/ProviderSetting.tsx @@ -49,7 +49,7 @@ const ProviderSetting: FC = ({ provider }) => { updateProvider({ ...provider, enabled })} + onChange={(enabled) => updateProvider({ ...provider, apiKey, apiHost, enabled })} /> @@ -74,7 +74,7 @@ const ProviderSetting: FC = ({ provider }) => { {modelGroups[group].map((model) => ( - {model.name[0]} + {model.name[0].toUpperCase()} {model.name} diff --git a/src/renderer/src/services/provider.ts b/src/renderer/src/services/provider.ts index 1a5d01d1..88ef6ff6 100644 --- a/src/renderer/src/services/provider.ts +++ b/src/renderer/src/services/provider.ts @@ -6,6 +6,7 @@ import GroqProviderLogo from '@renderer/assets/images/providers/groq.png' import ZhipuProviderLogo from '@renderer/assets/images/providers/zhipu.png' import OllamaProviderLogo from '@renderer/assets/images/providers/ollama.png' import MoonshotProviderLogo from '@renderer/assets/images/providers/moonshot.jpeg' +import OpenRouterProviderLogo from '@renderer/assets/images/providers/openrouter.png' import ChatGPTModelLogo from '@renderer/assets/images/models/chatgpt.jpeg' import ChatGLMModelLogo from '@renderer/assets/images/models/chatglm.jpeg' import DeepSeekModelLogo from '@renderer/assets/images/models/deepseek.png' @@ -15,6 +16,7 @@ import YiModelLogo from '@renderer/assets/images/models/yi.svg' import LlamaModelLogo from '@renderer/assets/images/models/llama.jpeg' import MixtralModelLogo from '@renderer/assets/images/models/mixtral.jpeg' import MoonshotModelLogo from '@renderer/assets/images/providers/moonshot.jpeg' +import MicrosoftModelLogo from '@renderer/assets/images/models/microsoft.png' export function getProviderLogo(providerId: string) { switch (providerId) { @@ -34,6 +36,8 @@ export function getProviderLogo(providerId: string) { return OllamaProviderLogo case 'moonshot': return MoonshotProviderLogo + case 'openrouter': + return OpenRouterProviderLogo default: return undefined } @@ -49,7 +53,9 @@ export function getModelLogo(modelId: string) { 'yi-': YiModelLogo, llama: LlamaModelLogo, mixtral: MixtralModelLogo, - moonshot: MoonshotModelLogo + mistral: MixtralModelLogo, + moonshot: MoonshotModelLogo, + phi: MicrosoftModelLogo } for (const key in logoMap) { diff --git a/src/renderer/src/store/index.ts b/src/renderer/src/store/index.ts index 155e3dc3..7d4f693a 100644 --- a/src/renderer/src/store/index.ts +++ b/src/renderer/src/store/index.ts @@ -19,7 +19,7 @@ const persistedReducer = persistReducer( { key: 'cherry-studio', storage, - version: 5, + version: 6, blacklist: ['runtime'], migrate }, diff --git a/src/renderer/src/store/llm.ts b/src/renderer/src/store/llm.ts index d0e61f22..20a4de80 100644 --- a/src/renderer/src/store/llm.ts +++ b/src/renderer/src/store/llm.ts @@ -67,6 +67,15 @@ const initialState: LlmState = { isSystem: true, enabled: false }, + { + id: 'openrouter', + name: 'OpenRouter', + apiKey: '', + apiHost: 'https://openrouter.ai/api/v1/', + models: SYSTEM_MODELS.openrouter.filter((m) => m.defaultEnabled), + isSystem: true, + enabled: false + }, { id: 'groq', name: 'Groq', diff --git a/src/renderer/src/store/migrate.ts b/src/renderer/src/store/migrate.ts index 786eda1e..b5c21145 100644 --- a/src/renderer/src/store/migrate.ts +++ b/src/renderer/src/store/migrate.ts @@ -82,6 +82,26 @@ const migrate = createMigrate({ ] } } + }, + // @ts-ignore store type is unknown + '6': (state: RootState) => { + return { + ...state, + llm: { + ...state.llm, + providers: [ + ...state.llm.providers, + { + id: 'openrouter', + name: 'OpenRouter', + apiKey: '', + apiHost: 'https://openrouter.ai/api/v1/', + models: SYSTEM_MODELS.openrouter.filter((m) => m.defaultEnabled), + isSystem: true + } + ] + } + } } })