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 00000000..43af01e9 Binary files /dev/null and b/src/renderer/src/assets/images/models/microsoft.png differ diff --git a/src/renderer/src/assets/images/providers/openrouter.png b/src/renderer/src/assets/images/providers/openrouter.png new file mode 100644 index 00000000..7f2c18d1 Binary files /dev/null and b/src/renderer/src/assets/images/providers/openrouter.png differ 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 + } + ] + } + } } })