diff --git a/src/main/index.ts b/src/main/index.ts index 1888d7cc..4af33c61 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -30,7 +30,8 @@ function createWindow() { webPreferences: { preload: join(__dirname, '../preload/index.js'), sandbox: false, - devTools: !app.isPackaged + devTools: !app.isPackaged, + webSecurity: false } }) diff --git a/src/renderer/src/assets/images/providers/dashscope.png b/src/renderer/src/assets/images/providers/dashscope.png new file mode 100644 index 00000000..bf55dfac Binary files /dev/null and b/src/renderer/src/assets/images/providers/dashscope.png differ diff --git a/src/renderer/src/config/models.ts b/src/renderer/src/config/models.ts index 958527ac..33d1503e 100644 --- a/src/renderer/src/config/models.ts +++ b/src/renderer/src/config/models.ts @@ -1,6 +1,6 @@ import { Model } from '@renderer/types' -type SystemModel = Model & { defaultEnabled: boolean } +type SystemModel = Model & { enabled: boolean } export const SYSTEM_MODELS: Record = { openai: [ @@ -9,28 +9,28 @@ export const SYSTEM_MODELS: Record = { provider: 'openai', name: 'GPT-3.5 Turbo', group: 'GPT 3.5', - defaultEnabled: true + enabled: true }, { id: 'gpt-4-turbo', provider: 'openai', name: ' GPT-4 Turbo', group: 'GPT 4', - defaultEnabled: true + enabled: true }, { id: 'gpt-4', provider: 'openai', name: ' GPT-4', group: 'GPT 4', - defaultEnabled: true + enabled: true }, { id: 'gpt-4o', provider: 'openai', name: ' GPT-4o', group: 'GPT 4o', - defaultEnabled: true + enabled: true } ], silicon: [ @@ -39,112 +39,112 @@ export const SYSTEM_MODELS: Record = { provider: 'silicon', name: 'Qwen2-7B-Instruct', group: 'Qwen2', - defaultEnabled: true + enabled: true }, { id: 'Qwen/Qwen2-1.5B-Instruct', provider: 'silicon', name: 'Qwen2-1.5B-Instruct', group: 'Qwen2', - defaultEnabled: false + enabled: false }, { id: 'Qwen/Qwen1.5-7B-Chat', provider: 'silicon', name: 'Qwen1.5-7B-Chat', group: 'Qwen1.5', - defaultEnabled: false + enabled: false }, { id: 'Qwen/Qwen2-72B-Instruct', provider: 'silicon', name: 'Qwen2-72B-Instruct', group: 'Qwen2', - defaultEnabled: true + enabled: true }, { id: 'Qwen/Qwen2-57B-A14B-Instruct', provider: 'silicon', name: 'Qwen2-57B-A14B-Instruct', group: 'Qwen2', - defaultEnabled: false + enabled: false }, { id: 'Qwen/Qwen1.5-110B-Chat', provider: 'silicon', name: 'Qwen1.5-110B-Chat', group: 'Qwen1.5', - defaultEnabled: false + enabled: false }, { id: 'Qwen/Qwen1.5-32B-Chat', provider: 'silicon', name: 'Qwen1.5-32B-Chat', group: 'Qwen1.5', - defaultEnabled: false + enabled: false }, { id: 'Qwen/Qwen1.5-14B-Chat', provider: 'silicon', name: 'Qwen1.5-14B-Chat', group: 'Qwen1.5', - defaultEnabled: false + enabled: false }, { id: 'deepseek-ai/DeepSeek-V2-Chat', provider: 'silicon', name: 'DeepSeek-V2-Chat', group: 'DeepSeek', - defaultEnabled: false + enabled: false }, { id: 'deepseek-ai/DeepSeek-Coder-V2-Instruct', provider: 'silicon', name: 'DeepSeek-Coder-V2-Instruct', group: 'DeepSeek', - defaultEnabled: false + enabled: false }, { id: 'deepseek-ai/deepseek-llm-67b-chat', provider: 'silicon', name: 'Deepseek-LLM-67B-Chat', group: 'DeepSeek', - defaultEnabled: false + enabled: false }, { id: 'THUDM/glm-4-9b-chat', provider: 'silicon', name: 'GLM-4-9B-Chat', group: 'GLM', - defaultEnabled: true + enabled: true }, { id: 'THUDM/chatglm3-6b', provider: 'silicon', name: 'GhatGLM3-6B', group: 'GLM', - defaultEnabled: false + enabled: false }, { id: '01-ai/Yi-1.5-9B-Chat-16K', provider: 'silicon', name: 'Yi-1.5-9B-Chat-16K', group: 'Yi', - defaultEnabled: false + enabled: false }, { id: '01-ai/Yi-1.5-6B-Chat', provider: 'silicon', name: 'Yi-1.5-6B-Chat', group: 'Yi', - defaultEnabled: false + enabled: false }, { id: '01-ai/Yi-1.5-34B-Chat-16K', provider: 'silicon', name: 'Yi-1.5-34B-Chat-16K', group: 'Yi', - defaultEnabled: false + enabled: false } ], deepseek: [ @@ -153,14 +153,14 @@ export const SYSTEM_MODELS: Record = { provider: 'deepseek', name: 'DeepSeek Chat', group: 'DeepSeek Chat', - defaultEnabled: true + enabled: true }, { id: 'deepseek-coder', provider: 'deepseek', name: 'DeepSeek Coder', group: 'DeepSeek Coder', - defaultEnabled: true + enabled: true } ], yi: [ @@ -169,42 +169,42 @@ export const SYSTEM_MODELS: Record = { provider: 'yi', name: 'Yi-Large', group: 'Yi', - defaultEnabled: false + enabled: false }, { id: 'yi-large-turbo', provider: 'yi', name: 'Yi-Large-Turbo', group: 'Yi', - defaultEnabled: true + enabled: true }, { id: 'yi-large-rag', provider: 'yi', name: 'Yi-Large-Rag', group: 'Yi', - defaultEnabled: false + enabled: false }, { id: 'yi-medium', provider: 'yi', name: 'Yi-Medium', group: 'Yi', - defaultEnabled: true + enabled: true }, { id: 'yi-medium-200k', provider: 'yi', name: 'Yi-Medium-200k', group: 'Yi', - defaultEnabled: false + enabled: false }, { id: 'yi-spark', provider: 'yi', name: 'Yi-Spark', group: 'Yi', - defaultEnabled: false + enabled: false } ], zhipu: [ @@ -213,42 +213,42 @@ export const SYSTEM_MODELS: Record = { provider: 'zhipu', name: 'GLM-4-0520', group: 'GLM', - defaultEnabled: true + enabled: true }, { id: 'glm-4', provider: 'zhipu', name: 'GLM-4', group: 'GLM', - defaultEnabled: false + enabled: false }, { id: 'glm-4-airx', provider: 'zhipu', name: 'GLM-4-AirX', group: 'GLM', - defaultEnabled: false + enabled: false }, { id: 'glm-4-air', provider: 'zhipu', name: 'GLM-4-Air', group: 'GLM', - defaultEnabled: true + enabled: true }, { id: 'glm-4v', provider: 'zhipu', name: 'GLM-4V', group: 'GLM', - defaultEnabled: false + enabled: false }, { id: 'glm-4-alltools', provider: 'zhipu', name: 'GLM-4-AllTools', group: 'GLM', - defaultEnabled: false + enabled: false } ], moonshot: [ @@ -257,88 +257,21 @@ export const SYSTEM_MODELS: Record = { provider: 'moonshot', name: 'Moonshot V1 8k', group: 'Moonshot V1', - defaultEnabled: true + enabled: true }, { id: 'moonshot-v1-32k', provider: 'moonshot', name: 'Moonshot V1 32k', group: 'Moonshot V1', - defaultEnabled: true + enabled: true }, { id: 'moonshot-v1-128k', provider: 'moonshot', name: 'Moonshot V1 128k', group: 'Moonshot V1', - defaultEnabled: true - } - ], - openrouter: [ - { - id: 'google/gemma-2-9b-it:free', - provider: 'openrouter', - name: 'Google: Gemma 2 9B', - group: 'Gemma', - defaultEnabled: true - }, - { - id: 'microsoft/phi-3-mini-128k-instruct:free', - provider: 'openrouter', - name: 'Phi-3 Mini 128K Instruct', - group: 'Phi', - defaultEnabled: true - }, - { - id: 'microsoft/phi-3-medium-128k-instruct:free', - provider: 'openrouter', - name: 'Phi-3 Medium 128K Instruct', - group: 'Phi', - defaultEnabled: true - }, - { - id: 'meta-llama/llama-3-8b-instruct:free', - provider: 'openrouter', - name: 'Meta: Llama 3 8B Instruct', - group: 'Llama3', - defaultEnabled: true - }, - { - id: 'mistralai/mistral-7b-instruct:free', - provider: 'openrouter', - name: 'Mistral: Mistral 7B Instruct', - group: 'Mistral', - defaultEnabled: true - } - ], - groq: [ - { - id: 'llama3-8b-8192', - provider: 'groq', - name: 'LLaMA3 8B', - group: 'Llama3', - defaultEnabled: false - }, - { - id: 'llama3-70b-8192', - provider: 'groq', - name: 'LLaMA3 70B', - group: 'Llama3', - defaultEnabled: true - }, - { - id: 'mixtral-8x7b-32768', - provider: 'groq', - name: 'Mixtral 8x7B', - group: 'Mixtral', - defaultEnabled: false - }, - { - id: 'gemma-7b-it', - provider: 'groq', - name: 'Gemma 7B', - group: 'Gemma', - defaultEnabled: false + enabled: true } ], baichuan: [ @@ -347,21 +280,111 @@ export const SYSTEM_MODELS: Record = { provider: 'baichuan', name: 'Baichuan4', group: 'Baichuan4', - defaultEnabled: true + enabled: true }, { id: 'Baichuan3-Turbo', provider: 'baichuan', name: 'Baichuan3 Turbo', group: 'Baichuan3', - defaultEnabled: true + enabled: true }, { id: 'Baichuan3-Turbo-128k', provider: 'baichuan', name: 'Baichuan3 Turbo 128k', group: 'Baichuan3', - defaultEnabled: true + enabled: true + } + ], + dashscope: [ + { + id: 'qwen-turbo', + provider: 'dashscope', + name: 'Qwen Turbo', + group: 'Qwen', + enabled: true + }, + { + id: 'qwen-plus', + provider: 'dashscope', + name: 'Qwen Plus', + group: 'Qwen', + enabled: true + }, + { + id: 'qwen-max', + provider: 'dashscope', + name: 'Qwen Max', + group: 'Qwen', + enabled: true + } + ], + openrouter: [ + { + id: 'google/gemma-2-9b-it:free', + provider: 'openrouter', + name: 'Google: Gemma 2 9B', + group: 'Gemma', + enabled: true + }, + { + id: 'microsoft/phi-3-mini-128k-instruct:free', + provider: 'openrouter', + name: 'Phi-3 Mini 128K Instruct', + group: 'Phi', + enabled: true + }, + { + id: 'microsoft/phi-3-medium-128k-instruct:free', + provider: 'openrouter', + name: 'Phi-3 Medium 128K Instruct', + group: 'Phi', + enabled: true + }, + { + id: 'meta-llama/llama-3-8b-instruct:free', + provider: 'openrouter', + name: 'Meta: Llama 3 8B Instruct', + group: 'Llama3', + enabled: true + }, + { + id: 'mistralai/mistral-7b-instruct:free', + provider: 'openrouter', + name: 'Mistral: Mistral 7B Instruct', + group: 'Mistral', + enabled: true + } + ], + groq: [ + { + id: 'llama3-8b-8192', + provider: 'groq', + name: 'LLaMA3 8B', + group: 'Llama3', + enabled: false + }, + { + id: 'llama3-70b-8192', + provider: 'groq', + name: 'LLaMA3 70B', + group: 'Llama3', + enabled: true + }, + { + id: 'mixtral-8x7b-32768', + provider: 'groq', + name: 'Mixtral 8x7B', + group: 'Mixtral', + enabled: false + }, + { + id: 'gemma-7b-it', + provider: 'groq', + name: 'Gemma 7B', + group: 'Gemma', + enabled: false } ] } diff --git a/src/renderer/src/config/provider.ts b/src/renderer/src/config/provider.ts index 969659e8..c271ddcd 100644 --- a/src/renderer/src/config/provider.ts +++ b/src/renderer/src/config/provider.ts @@ -1,3 +1,80 @@ +import OpenAiProviderLogo from '@renderer/assets/images/providers/openai.jpeg' +import SiliconFlowProviderLogo from '@renderer/assets/images/providers/silicon.png' +import DeepSeekProviderLogo from '@renderer/assets/images/providers/deepseek.png' +import YiProviderLogo from '@renderer/assets/images/providers/yi.svg' +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 BaichuanProviderLogo from '@renderer/assets/images/providers/baichuan.png' +import DashScopeProviderLogo from '@renderer/assets/images/providers/dashscope.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' +import GemmaModelLogo from '@renderer/assets/images/models/gemma.jpeg' +import QwenModelLogo from '@renderer/assets/images/models/qwen.jpeg' +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' +import BaichuanModelLogo from '@renderer/assets/images/models/baichuan.png' + +export function getProviderLogo(providerId: string) { + switch (providerId) { + case 'openai': + return OpenAiProviderLogo + case 'silicon': + return SiliconFlowProviderLogo + case 'deepseek': + return DeepSeekProviderLogo + case 'yi': + return YiProviderLogo + case 'groq': + return GroqProviderLogo + case 'zhipu': + return ZhipuProviderLogo + case 'ollama': + return OllamaProviderLogo + case 'moonshot': + return MoonshotProviderLogo + case 'openrouter': + return OpenRouterProviderLogo + case 'baichuan': + return BaichuanProviderLogo + case 'dashscope': + return DashScopeProviderLogo + default: + return undefined + } +} + +export function getModelLogo(modelId: string) { + const logoMap = { + gpt: ChatGPTModelLogo, + glm: ChatGLMModelLogo, + deepseek: DeepSeekModelLogo, + qwen: QwenModelLogo, + gemma: GemmaModelLogo, + 'yi-': YiModelLogo, + llama: LlamaModelLogo, + mixtral: MixtralModelLogo, + mistral: MixtralModelLogo, + moonshot: MoonshotModelLogo, + phi: MicrosoftModelLogo, + baichuan: BaichuanModelLogo + } + + for (const key in logoMap) { + if (modelId.toLowerCase().includes(key)) { + return logoMap[key] + } + } + + return undefined +} + export const PROVIDER_CONFIG = { openai: { websites: { @@ -47,6 +124,22 @@ export const PROVIDER_CONFIG = { models: 'https://platform.moonshot.cn/docs/intro#%E6%A8%A1%E5%9E%8B%E5%88%97%E8%A1%A8' } }, + baichuan: { + websites: { + official: 'https://www.baichuan-ai.com/', + apiKey: 'https://platform.baichuan-ai.com/console/apikey', + docs: 'https://platform.baichuan-ai.com/docs', + models: 'https://platform.baichuan-ai.com/price' + } + }, + dashscope: { + websites: { + official: 'https://dashscope.aliyun.com/', + apiKey: 'https://help.aliyun.com/zh/dashscope/developer-reference/acquisition-and-configuration-of-api-key', + docs: 'https://help.aliyun.com/zh/dashscope/', + models: 'https://dashscope.console.aliyun.com/model' + } + }, openrouter: { websites: { official: 'https://openrouter.ai/', @@ -69,13 +162,5 @@ export const PROVIDER_CONFIG = { docs: 'https://github.com/ollama/ollama/tree/main/docs', models: 'https://ollama.com/library' } - }, - baichuan: { - websites: { - official: 'https://www.baichuan-ai.com/', - apiKey: 'https://platform.baichuan-ai.com/console/apikey', - docs: 'https://platform.baichuan-ai.com/docs', - models: 'https://platform.baichuan-ai.com/price' - } } } diff --git a/src/renderer/src/i18n/index.ts b/src/renderer/src/i18n/index.ts index d249e53a..a51118d0 100644 --- a/src/renderer/src/i18n/index.ts +++ b/src/renderer/src/i18n/index.ts @@ -79,7 +79,8 @@ const resources = { zhipu: 'ZHIPU AI', groq: 'Groq', ollama: 'Ollama', - baichuan: 'Baichuan' + baichuan: 'Baichuan', + dashscope: 'DashScope' }, settings: { title: 'Settings', @@ -156,7 +157,7 @@ const resources = { 'error.enter.api.host': '请输入您的 API 地址', 'error.enter.model': '请选择一个模型', 'api.connection.failed': '连接失败', - 'api.connection.successful': '连接成功', + 'api.connection.success': '连接成功', 'chat.completion.paused': '会话已停止' }, assistant: { @@ -195,7 +196,8 @@ const resources = { zhipu: '智谱AI', groq: 'Groq', ollama: 'Ollama', - baichuan: '百川' + baichuan: '百川', + dashscope: '阿里云灵积' }, settings: { title: '设置', diff --git a/src/renderer/src/pages/home/components/Message.tsx b/src/renderer/src/pages/home/components/Message.tsx index 47dbd6fc..068ae323 100644 --- a/src/renderer/src/pages/home/components/Message.tsx +++ b/src/renderer/src/pages/home/components/Message.tsx @@ -7,7 +7,7 @@ import { CopyOutlined, DeleteOutlined, EditOutlined } from '@ant-design/icons' import Markdown from 'react-markdown' import CodeBlock from './CodeBlock' import { EVENT_NAMES, EventEmitter } from '@renderer/services/event' -import { getModelLogo } from '@renderer/services/provider' +import { getModelLogo } from '@renderer/config/provider' import Logo from '@renderer/assets/images/logo.png' import { SyncOutlined } from '@ant-design/icons' import { firstLetter } from '@renderer/utils' diff --git a/src/renderer/src/pages/settings/ProviderSettings.tsx b/src/renderer/src/pages/settings/ProviderSettings.tsx index dd73a229..62fc56cf 100644 --- a/src/renderer/src/pages/settings/ProviderSettings.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings.tsx @@ -1,6 +1,6 @@ import { DragDropContext, Draggable, Droppable, DropResult } from '@hello-pangea/dnd' import { useProviders, useSystemProviders } from '@renderer/hooks/useProvider' -import { getProviderLogo } from '@renderer/services/provider' +import { getProviderLogo } from '@renderer/config/provider' import { Provider } from '@renderer/types' import { droppableReorder } from '@renderer/utils' import { Avatar, Tag } from 'antd' @@ -39,7 +39,7 @@ const ProviderSettings: FC = () => { key={JSON.stringify(provider)} className={provider.id === selectedProvider?.id ? 'active' : ''} onClick={() => setSelectedProvider(provider)}> - + {t(`provider.${provider.id}`)} {provider.enabled && ( diff --git a/src/renderer/src/pages/settings/components/EditModelsPopup.tsx b/src/renderer/src/pages/settings/components/EditModelsPopup.tsx index 4621883f..28439edc 100644 --- a/src/renderer/src/pages/settings/components/EditModelsPopup.tsx +++ b/src/renderer/src/pages/settings/components/EditModelsPopup.tsx @@ -2,7 +2,7 @@ import { LoadingOutlined, MinusOutlined, PlusOutlined, QuestionCircleOutlined } import { SYSTEM_MODELS } from '@renderer/config/models' import { useProvider } from '@renderer/hooks/useProvider' import { fetchModels } from '@renderer/services/api' -import { getModelLogo } from '@renderer/services/provider' +import { getModelLogo } from '@renderer/config/provider' import { Model, Provider } from '@renderer/types' import { getDefaultGroupName, isFreeModel, runAsyncFunction } from '@renderer/utils' import { Avatar, Button, Empty, Flex, Modal, Tag } from 'antd' diff --git a/src/renderer/src/pages/settings/components/ProviderSetting.tsx b/src/renderer/src/pages/settings/components/ProviderSetting.tsx index fd5057b5..87ffb367 100644 --- a/src/renderer/src/pages/settings/components/ProviderSetting.tsx +++ b/src/renderer/src/pages/settings/components/ProviderSetting.tsx @@ -5,7 +5,7 @@ import { Avatar, Button, Card, Divider, Flex, Input, Space, Switch } from 'antd' import { useProvider } from '@renderer/hooks/useProvider' import { groupBy } from 'lodash' import { SettingContainer, SettingSubtitle, SettingTitle } from '.' -import { getModelLogo } from '@renderer/services/provider' +import { getModelLogo } from '@renderer/config/provider' import { CheckOutlined, EditOutlined, ExportOutlined, LoadingOutlined, PlusOutlined } from '@ant-design/icons' import AddModelPopup from './AddModelPopup' import EditModelsPopup from './EditModelsPopup' diff --git a/src/renderer/src/services/provider.ts b/src/renderer/src/services/provider.ts deleted file mode 100644 index 8f4c2642..00000000 --- a/src/renderer/src/services/provider.ts +++ /dev/null @@ -1,73 +0,0 @@ -import OpenAiProviderLogo from '@renderer/assets/images/providers/openai.jpeg' -import SiliconFlowProviderLogo from '@renderer/assets/images/providers/silicon.png' -import DeepSeekProviderLogo from '@renderer/assets/images/providers/deepseek.png' -import YiProviderLogo from '@renderer/assets/images/providers/yi.svg' -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 BaichuanProviderLogo from '@renderer/assets/images/providers/baichuan.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' -import GemmaModelLogo from '@renderer/assets/images/models/gemma.jpeg' -import QwenModelLogo from '@renderer/assets/images/models/qwen.jpeg' -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' -import BaichuanModelLogo from '@renderer/assets/images/models/baichuan.png' - -export function getProviderLogo(providerId: string) { - switch (providerId) { - case 'openai': - return OpenAiProviderLogo - case 'silicon': - return SiliconFlowProviderLogo - case 'deepseek': - return DeepSeekProviderLogo - case 'yi': - return YiProviderLogo - case 'groq': - return GroqProviderLogo - case 'zhipu': - return ZhipuProviderLogo - case 'ollama': - return OllamaProviderLogo - case 'moonshot': - return MoonshotProviderLogo - case 'openrouter': - return OpenRouterProviderLogo - case 'baichuan': - return BaichuanProviderLogo - default: - return undefined - } -} - -export function getModelLogo(modelId: string) { - const logoMap = { - gpt: ChatGPTModelLogo, - glm: ChatGLMModelLogo, - deepseek: DeepSeekModelLogo, - qwen: QwenModelLogo, - gemma: GemmaModelLogo, - 'yi-': YiModelLogo, - llama: LlamaModelLogo, - mixtral: MixtralModelLogo, - mistral: MixtralModelLogo, - moonshot: MoonshotModelLogo, - phi: MicrosoftModelLogo, - baichuan: BaichuanModelLogo - } - - for (const key in logoMap) { - if (modelId.toLowerCase().includes(key)) { - return logoMap[key] - } - } - - return undefined -} diff --git a/src/renderer/src/store/index.ts b/src/renderer/src/store/index.ts index 5ee7b590..7e14d429 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: 10, + version: 11, blacklist: ['runtime'], migrate }, diff --git a/src/renderer/src/store/llm.ts b/src/renderer/src/store/llm.ts index 657549f4..fbe5fe7f 100644 --- a/src/renderer/src/store/llm.ts +++ b/src/renderer/src/store/llm.ts @@ -18,7 +18,7 @@ const initialState: LlmState = { name: 'OpenAI', apiKey: '', apiHost: 'https://api.openai.com', - models: SYSTEM_MODELS.openai.filter((m) => m.defaultEnabled), + models: SYSTEM_MODELS.openai.filter((m) => m.enabled), isSystem: true, enabled: true }, @@ -27,7 +27,7 @@ const initialState: LlmState = { name: 'Silicon', apiKey: '', apiHost: 'https://api.siliconflow.cn', - models: SYSTEM_MODELS.silicon.filter((m) => m.defaultEnabled), + models: SYSTEM_MODELS.silicon.filter((m) => m.enabled), isSystem: true, enabled: false }, @@ -36,7 +36,7 @@ const initialState: LlmState = { name: 'deepseek', apiKey: '', apiHost: 'https://api.deepseek.com', - models: SYSTEM_MODELS.deepseek.filter((m) => m.defaultEnabled), + models: SYSTEM_MODELS.deepseek.filter((m) => m.enabled), isSystem: true, enabled: false }, @@ -45,7 +45,7 @@ const initialState: LlmState = { name: 'Yi', apiKey: '', apiHost: 'https://api.lingyiwanwu.com', - models: SYSTEM_MODELS.yi.filter((m) => m.defaultEnabled), + models: SYSTEM_MODELS.yi.filter((m) => m.enabled), isSystem: true, enabled: false }, @@ -54,7 +54,7 @@ const initialState: LlmState = { name: 'ZhiPu', apiKey: '', apiHost: 'https://open.bigmodel.cn/api/paas/v4/', - models: SYSTEM_MODELS.zhipu.filter((m) => m.defaultEnabled), + models: SYSTEM_MODELS.zhipu.filter((m) => m.enabled), isSystem: true, enabled: false }, @@ -63,7 +63,25 @@ const initialState: LlmState = { name: 'Moonshot AI', apiKey: '', apiHost: 'https://api.moonshot.cn', - models: SYSTEM_MODELS.moonshot.filter((m) => m.defaultEnabled), + models: SYSTEM_MODELS.moonshot.filter((m) => m.enabled), + isSystem: true, + enabled: false + }, + { + id: 'baichuan', + name: 'BAICHUAN AI', + apiKey: '', + apiHost: 'https://api.baichuan-ai.com', + models: SYSTEM_MODELS.baichuan.filter((m) => m.enabled), + isSystem: true, + enabled: false + }, + { + id: 'dashscope', + name: 'DashScope', + apiKey: '', + apiHost: 'https://dashscope.aliyuncs.com/compatible-mode/v1/', + models: SYSTEM_MODELS.dashscope.filter((m) => m.enabled), isSystem: true, enabled: false }, @@ -72,7 +90,7 @@ const initialState: LlmState = { name: 'OpenRouter', apiKey: '', apiHost: 'https://openrouter.ai/api/v1/', - models: SYSTEM_MODELS.openrouter.filter((m) => m.defaultEnabled), + models: SYSTEM_MODELS.openrouter.filter((m) => m.enabled), isSystem: true, enabled: false }, @@ -81,7 +99,7 @@ const initialState: LlmState = { name: 'Groq', apiKey: '', apiHost: 'https://api.groq.com/openai', - models: SYSTEM_MODELS.groq.filter((m) => m.defaultEnabled), + models: SYSTEM_MODELS.groq.filter((m) => m.enabled), isSystem: true, enabled: false }, @@ -93,15 +111,6 @@ const initialState: LlmState = { models: [], isSystem: true, enabled: false - }, - { - id: 'baichuan', - name: 'BAICHUAN AI', - apiKey: '', - apiHost: 'https://api.baichuan-ai.com', - models: SYSTEM_MODELS.baichuan.filter((m) => m.defaultEnabled), - isSystem: true, - enabled: false } ] } diff --git a/src/renderer/src/store/migrate.ts b/src/renderer/src/store/migrate.ts index 95554133..1a177601 100644 --- a/src/renderer/src/store/migrate.ts +++ b/src/renderer/src/store/migrate.ts @@ -20,7 +20,7 @@ const migrate = createMigrate({ apiKey: '', apiHost: 'https://api.lingyiwanwu.com', isSystem: true, - models: SYSTEM_MODELS.yi.filter((m) => m.defaultEnabled) + models: SYSTEM_MODELS.yi.filter((m) => m.enabled) } ] } @@ -40,7 +40,7 @@ const migrate = createMigrate({ apiKey: '', apiHost: 'https://open.bigmodel.cn/api/paas/v4/', isSystem: true, - models: SYSTEM_MODELS.zhipu.filter((m) => m.defaultEnabled) + models: SYSTEM_MODELS.zhipu.filter((m) => m.enabled) } ] } @@ -80,7 +80,7 @@ const migrate = createMigrate({ apiKey: '', apiHost: 'https://api.moonshot.cn', isSystem: true, - models: SYSTEM_MODELS.moonshot.filter((m) => m.defaultEnabled) + models: SYSTEM_MODELS.moonshot.filter((m) => m.enabled) } ] } @@ -99,7 +99,7 @@ const migrate = createMigrate({ name: 'OpenRouter', apiKey: '', apiHost: 'https://openrouter.ai/api/v1/', - models: SYSTEM_MODELS.openrouter.filter((m) => m.defaultEnabled), + models: SYSTEM_MODELS.openrouter.filter((m) => m.enabled), isSystem: true } ] @@ -150,7 +150,7 @@ const migrate = createMigrate({ ...state.llm, providers: state.llm.providers.map((provider) => { if (provider.id === 'zhipu' && provider.models[0] && provider.models[0].id === 'llama3-70b-8192') { - provider.models = SYSTEM_MODELS.zhipu.filter((m) => m.defaultEnabled) + provider.models = SYSTEM_MODELS.zhipu.filter((m) => m.enabled) } return provider }) @@ -170,7 +170,28 @@ const migrate = createMigrate({ name: 'BAICHUAN AI', apiKey: '', apiHost: 'https://api.baichuan-ai.com', - models: SYSTEM_MODELS.baichuan.filter((m) => m.defaultEnabled), + models: SYSTEM_MODELS.baichuan.filter((m) => m.enabled), + isSystem: true, + enabled: false + } + ] + } + } + }, + // @ts-ignore store type is unknown + '11': (state: RootState) => { + return { + ...state, + llm: { + ...state.llm, + providers: [ + ...state.llm.providers, + { + id: 'dashscope', + name: 'DashScope', + apiKey: '', + apiHost: 'https://dashscope.aliyuncs.com/compatible-mode/v1/', + models: SYSTEM_MODELS.dashscope.filter((m) => m.enabled), isSystem: true, enabled: false }