diff --git a/src/renderer/src/components/Popups/AddAssistantPopup.tsx b/src/renderer/src/components/Popups/AddAssistantPopup.tsx index d527d192..78ec54bb 100644 --- a/src/renderer/src/components/Popups/AddAssistantPopup.tsx +++ b/src/renderer/src/components/Popups/AddAssistantPopup.tsx @@ -25,24 +25,30 @@ const PopupContainer: React.FC = ({ resolve }) => { () => ({ id: defaultAssistant.id, name: defaultAssistant.name, - emoji: '', + emoji: defaultAssistant.emoji || '', prompt: defaultAssistant.prompt, group: 'system' }), - [defaultAssistant.id, defaultAssistant.name, defaultAssistant.prompt] + [defaultAssistant.emoji, defaultAssistant.id, defaultAssistant.name, defaultAssistant.prompt] ) const agents = useMemo(() => { - const allAgents = [defaultAgent, ...userAgents, ...systemAgents] as Agent[] - const list = allAgents.filter((agent) => !assistants.map((a) => a.id).includes(agent.id)) + const allAgents = [...userAgents, ...systemAgents] as Agent[] + const list = [defaultAgent, ...allAgents.filter((agent) => !assistants.map((a) => a.id).includes(agent.id))] return searchText ? list.filter((agent) => agent.name.toLowerCase().includes(searchText.trim().toLocaleLowerCase())) : list }, [assistants, defaultAgent, searchText, userAgents]) const onCreateAssistant = (agent: Agent) => { - if (assistants.map((a) => a.id).includes(String(agent.id))) return + if (agent.id !== 'default') { + if (assistants.map((a) => a.id).includes(String(agent.id))) { + return + } + } + const assistant = covertAgentToAssistant(agent) + addAssistant(assistant) resolve(assistant) setOpen(false) diff --git a/src/renderer/src/config/models.ts b/src/renderer/src/config/models.ts index 605446c4..95baa96c 100644 --- a/src/renderer/src/config/models.ts +++ b/src/renderer/src/config/models.ts @@ -3,6 +3,15 @@ import { Model } from '@renderer/types' type SystemModel = Model & { enabled: boolean } export const SYSTEM_MODELS: Record = { + ollama: [ + { + id: 'qwen2:0.5b', + provider: 'ollama', + name: ' Qwen2 0.5b', + group: 'Qwen2', + enabled: true + } + ], openai: [ { id: 'gpt-4o', @@ -49,6 +58,36 @@ export const SYSTEM_MODELS: Record = { enabled: true } ], + anthropic: [ + { + id: 'claude-3-5-sonnet-20240620', + provider: 'anthropic', + name: 'Claude 3.5 Sonnet', + group: 'Claude 3.5', + enabled: true + }, + { + id: 'claude-3-opus-20240229', + provider: 'anthropic', + name: 'Claude 3 Opus', + group: 'Claude 3', + enabled: true + }, + { + id: 'claude-3-sonnet-20240229', + provider: 'anthropic', + name: 'Claude 3 Sonnet', + group: 'Claude 3', + enabled: true + }, + { + id: 'claude-3-haiku-20240307', + provider: 'anthropic', + name: 'Claude 3 Haiku', + group: 'Claude 3', + enabled: true + } + ], silicon: [ { id: 'Qwen/Qwen2-7B-Instruct', @@ -465,35 +504,5 @@ export const SYSTEM_MODELS: Record = { group: 'Gemma', enabled: false } - ], - anthropic: [ - { - id: 'claude-3-5-sonnet-20240620', - provider: 'anthropic', - name: 'Claude 3.5 Sonnet', - group: 'Claude 3.5', - enabled: true - }, - { - id: 'claude-3-opus-20240229', - provider: 'anthropic', - name: 'Claude 3 Opus', - group: 'Claude 3', - enabled: true - }, - { - id: 'claude-3-sonnet-20240229', - provider: 'anthropic', - name: 'Claude 3 Sonnet', - group: 'Claude 3', - enabled: true - }, - { - id: 'claude-3-haiku-20240307', - provider: 'anthropic', - name: 'Claude 3 Haiku', - group: 'Claude 3', - enabled: true - } ] } diff --git a/src/renderer/src/i18n/index.ts b/src/renderer/src/i18n/index.ts index 87307e20..a996ca78 100644 --- a/src/renderer/src/i18n/index.ts +++ b/src/renderer/src/i18n/index.ts @@ -57,7 +57,7 @@ const resources = { }, chat: { save: 'Save', - 'default.name': '🔆 Default Assistant', + 'default.name': 'Default Assistant', 'default.description': "Hello, I'm Default Assistant. You can start chatting with me right away", 'default.topic.name': 'Default Topic', 'topics.title': 'Topics', @@ -294,7 +294,7 @@ const resources = { }, chat: { save: '保存', - 'default.name': '🔆 默认助手 - Assistant', + 'default.name': '默认助手', 'default.description': '你好,我是默认助手。你可以立刻开始跟我聊天。', 'default.topic.name': '默认话题', 'topics.title': '话题', diff --git a/src/renderer/src/services/api.ts b/src/renderer/src/services/api.ts index 896f427a..a4a7166b 100644 --- a/src/renderer/src/services/api.ts +++ b/src/renderer/src/services/api.ts @@ -166,9 +166,11 @@ export async function checkApi(provider: Provider) { const key = 'api-check' const style = { marginTop: '3vh' } - if (!provider.apiKey) { - window.message.error({ content: i18n.t('message.error.enter.api.key'), key, style }) - return false + if (provider.id !== 'ollama') { + if (!provider.apiKey) { + window.message.error({ content: i18n.t('message.error.enter.api.key'), key, style }) + return false + } } if (!provider.apiHost) { diff --git a/src/renderer/src/store/llm.ts b/src/renderer/src/store/llm.ts index 4d28b686..a7cc0b6e 100644 --- a/src/renderer/src/store/llm.ts +++ b/src/renderer/src/store/llm.ts @@ -18,10 +18,19 @@ export interface LlmState { } const initialState: LlmState = { - defaultModel: SYSTEM_MODELS.openai[0], - topicNamingModel: SYSTEM_MODELS.openai[0], - translateModel: SYSTEM_MODELS.openai[0], + defaultModel: SYSTEM_MODELS.ollama[0], + topicNamingModel: SYSTEM_MODELS.ollama[0], + translateModel: SYSTEM_MODELS.ollama[0], providers: [ + { + id: 'ollama', + name: 'Ollama', + apiKey: '', + apiHost: 'http://localhost:11434/v1/', + models: SYSTEM_MODELS.ollama.filter((m) => m.enabled), + isSystem: true, + enabled: true + }, { id: 'openai', name: 'OpenAI', @@ -29,7 +38,7 @@ const initialState: LlmState = { apiHost: 'https://api.openai.com', models: SYSTEM_MODELS.openai.filter((m) => m.enabled), isSystem: true, - enabled: true + enabled: false }, { id: 'gemini', @@ -40,6 +49,15 @@ const initialState: LlmState = { isSystem: true, enabled: false }, + { + id: 'anthropic', + name: 'Anthropic', + apiKey: '', + apiHost: 'https://api.anthropic.com/', + models: SYSTEM_MODELS.anthropic.filter((m) => m.enabled), + isSystem: true, + enabled: false + }, { id: 'silicon', name: 'Silicon', @@ -165,24 +183,6 @@ const initialState: LlmState = { models: SYSTEM_MODELS.groq.filter((m) => m.enabled), isSystem: true, enabled: false - }, - { - id: 'anthropic', - name: 'Anthropic', - apiKey: '', - apiHost: 'https://api.anthropic.com/', - models: SYSTEM_MODELS.anthropic.filter((m) => m.enabled), - isSystem: true, - enabled: false - }, - { - id: 'ollama', - name: 'Ollama', - apiKey: '', - apiHost: 'http://localhost:11434/v1/', - models: [], - isSystem: true, - enabled: false } ], settings: {