From 7dc0b98f3a7d33db16b30b504b7a96fddaacc7d6 Mon Sep 17 00:00:00 2001 From: kangfenmao Date: Fri, 5 Jul 2024 13:17:54 +0800 Subject: [PATCH] feat(settings): default modal settings --- src/renderer/src/components/app/Sidebar.tsx | 2 +- src/renderer/src/config/models.ts | 80 +++++++++---------- src/renderer/src/hooks/useAssistant.ts | 36 ++++----- src/renderer/src/hooks/useProvider.ts | 2 +- ...stantSetting.tsx => AssistantSettings.tsx} | 4 +- .../src/pages/settings/DeveloperSetting.tsx | 11 --- ...CommonSettings.tsx => GeneralSettings.tsx} | 6 +- .../src/pages/settings/ModelSettings.tsx | 51 ++++++++++++ ...odelsSettings.tsx => ProviderSettings.tsx} | 5 +- .../src/pages/settings/SettingsPage.tsx | 32 ++++---- .../settings/SystemAssistantSettings.tsx | 11 --- .../components/ModalProviderSetting.tsx | 39 ++------- .../settings/components/SettingComponent.tsx | 32 ++++++++ src/renderer/src/store/llm.ts | 18 ++++- 14 files changed, 189 insertions(+), 140 deletions(-) rename src/renderer/src/pages/settings/{DefaultAssistantSetting.tsx => AssistantSettings.tsx} (67%) delete mode 100644 src/renderer/src/pages/settings/DeveloperSetting.tsx rename src/renderer/src/pages/settings/{CommonSettings.tsx => GeneralSettings.tsx} (50%) create mode 100644 src/renderer/src/pages/settings/ModelSettings.tsx rename src/renderer/src/pages/settings/{LanguageModelsSettings.tsx => ProviderSettings.tsx} (93%) delete mode 100644 src/renderer/src/pages/settings/SystemAssistantSettings.tsx create mode 100644 src/renderer/src/pages/settings/components/SettingComponent.tsx diff --git a/src/renderer/src/components/app/Sidebar.tsx b/src/renderer/src/components/app/Sidebar.tsx index 281d129a..127d71fb 100644 --- a/src/renderer/src/components/app/Sidebar.tsx +++ b/src/renderer/src/components/app/Sidebar.tsx @@ -28,7 +28,7 @@ const Sidebar: FC = () => { - + diff --git a/src/renderer/src/config/models.ts b/src/renderer/src/config/models.ts index 1d97ba82..e3d8c201 100644 --- a/src/renderer/src/config/models.ts +++ b/src/renderer/src/config/models.ts @@ -38,46 +38,6 @@ export const SYSTEM_MODELS: Record = { } ], silicon: [ - { - id: 'deepseek-ai/DeepSeek-V2-Chat', - provider: 'silicon', - name: 'DeepSeek-V2-Chat', - group: 'DeepSeek', - temperature: 0.7, - defaultEnabled: true - }, - { - id: 'deepseek-ai/DeepSeek-Coder-V2-Instruct', - provider: 'silicon', - name: 'DeepSeek-Coder-V2-Instruct', - group: 'DeepSeek', - temperature: 0.7, - defaultEnabled: true - }, - { - id: 'deepseek-ai/deepseek-llm-67b-chat', - provider: 'silicon', - name: 'deepseek-llm-67b-chat', - group: 'DeepSeek', - temperature: 0.7, - defaultEnabled: false - }, - { - id: 'google/gemma-2-27b-it', - provider: 'silicon', - name: 'gemma-2-27b-it', - group: 'Gemma', - temperature: 0.7, - defaultEnabled: false - }, - { - id: 'google/gemma-2-9b-it', - provider: 'silicon', - name: 'gemma-2-9b-it', - group: 'Gemma', - temperature: 0.7, - defaultEnabled: false - }, { id: 'Qwen/Qwen2-7B-Instruct', provider: 'silicon', @@ -142,6 +102,46 @@ export const SYSTEM_MODELS: Record = { temperature: 0.7, defaultEnabled: false }, + { + id: 'deepseek-ai/DeepSeek-V2-Chat', + provider: 'silicon', + name: 'DeepSeek-V2-Chat', + group: 'DeepSeek', + temperature: 0.7, + defaultEnabled: false + }, + { + id: 'deepseek-ai/DeepSeek-Coder-V2-Instruct', + provider: 'silicon', + name: 'DeepSeek-Coder-V2-Instruct', + group: 'DeepSeek', + temperature: 0.7, + defaultEnabled: false + }, + { + id: 'deepseek-ai/deepseek-llm-67b-chat', + provider: 'silicon', + name: 'deepseek-llm-67b-chat', + group: 'DeepSeek', + temperature: 0.7, + defaultEnabled: false + }, + { + id: 'google/gemma-2-27b-it', + provider: 'silicon', + name: 'gemma-2-27b-it', + group: 'Gemma', + temperature: 0.7, + defaultEnabled: false + }, + { + id: 'google/gemma-2-9b-it', + provider: 'silicon', + name: 'gemma-2-9b-it', + group: 'Gemma', + temperature: 0.7, + defaultEnabled: false + }, { id: 'THUDM/glm-4-9b-chat', provider: 'silicon', diff --git a/src/renderer/src/hooks/useAssistant.ts b/src/renderer/src/hooks/useAssistant.ts index a7c37e04..d271f66f 100644 --- a/src/renderer/src/hooks/useAssistant.ts +++ b/src/renderer/src/hooks/useAssistant.ts @@ -9,6 +9,7 @@ import { removeAssistant, updateAssistant } from '@renderer/store/assistants' +import { setDefaultModel as _setDefaultModel, setTopicNamingModel as _setTopicNamingModel } from '@renderer/store/llm' import { Assistant, Model, Topic } from '@renderer/types' import localforage from 'localforage' @@ -19,14 +20,14 @@ export function useAssistants() { return { assistants, addAssistant: (assistant: Assistant) => dispatch(addAssistant(assistant)), + updateAssistant: (assistant: Assistant) => dispatch(updateAssistant(assistant)), removeAssistant: (id: string) => { dispatch(removeAssistant({ id })) const assistant = assistants.find((a) => a.id === id) if (assistant) { assistant.topics.forEach((id) => localforage.removeItem(`topic:${id}`)) } - }, - updateAssistant: (assistant: Assistant) => dispatch(updateAssistant(assistant)) + } } } @@ -38,25 +39,22 @@ export function useAssistant(id: string) { return { assistant, model: assistant?.model ?? defaultModel, - addTopic: (topic: Topic) => { - dispatch(_addTopic({ assistantId: assistant.id, topic })) - }, - removeTopic: (topic: Topic) => { - dispatch(_removeTopic({ assistantId: assistant.id, topic })) - }, - updateTopic: (topic: Topic) => { - dispatch(_updateTopic({ assistantId: assistant.id, topic })) - }, - removeAllTopics: () => { - dispatch(_removeAllTopics({ assistantId: assistant.id })) - }, - setModel: (model: Model) => { - dispatch(_setModel({ assistantId: assistant.id, model })) - } + addTopic: (topic: Topic) => dispatch(_addTopic({ assistantId: assistant.id, topic })), + removeTopic: (topic: Topic) => dispatch(_removeTopic({ assistantId: assistant.id, topic })), + updateTopic: (topic: Topic) => dispatch(_updateTopic({ assistantId: assistant.id, topic })), + removeAllTopics: () => dispatch(_removeAllTopics({ assistantId: assistant.id })), + setModel: (model: Model) => dispatch(_setModel({ assistantId: assistant.id, model })) } } export function useDefaultModel() { - const defaultModel = useAppSelector((state) => state.llm.defaultModel) - return { defaultModel } + const { defaultModel, topicNamingModel } = useAppSelector((state) => state.llm) + const dispatch = useAppDispatch() + + return { + defaultModel, + topicNamingModel, + setDefaultModel: (model: Model) => dispatch(_setDefaultModel({ model })), + setTopicNamingModel: (model: Model) => dispatch(_setTopicNamingModel({ model })) + } } diff --git a/src/renderer/src/hooks/useProvider.ts b/src/renderer/src/hooks/useProvider.ts index 6427ecbc..50bb9587 100644 --- a/src/renderer/src/hooks/useProvider.ts +++ b/src/renderer/src/hooks/useProvider.ts @@ -32,5 +32,5 @@ export function useProviderByAssistant(assistant: Assistant) { } export function useSystemProviders() { - return useAppSelector((state) => state.llm.providers.filter((p) => p.isSystem)) as unknown as Provider + return useAppSelector((state) => state.llm.providers.filter((p) => p.isSystem)) } diff --git a/src/renderer/src/pages/settings/DefaultAssistantSetting.tsx b/src/renderer/src/pages/settings/AssistantSettings.tsx similarity index 67% rename from src/renderer/src/pages/settings/DefaultAssistantSetting.tsx rename to src/renderer/src/pages/settings/AssistantSettings.tsx index ee23caa1..8c104459 100644 --- a/src/renderer/src/pages/settings/DefaultAssistantSetting.tsx +++ b/src/renderer/src/pages/settings/AssistantSettings.tsx @@ -1,11 +1,11 @@ import { FC } from 'react' import styled from 'styled-components' -const DefaultAssistantSetting: FC = () => { +const AssistantSettings: FC = () => { return Default Assistant } const Container = styled.div` padding: 20px; ` -export default DefaultAssistantSetting +export default AssistantSettings diff --git a/src/renderer/src/pages/settings/DeveloperSetting.tsx b/src/renderer/src/pages/settings/DeveloperSetting.tsx deleted file mode 100644 index 6c1ba5d6..00000000 --- a/src/renderer/src/pages/settings/DeveloperSetting.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { FC } from 'react' -import styled from 'styled-components' - -const DeveloperSetting: FC = () => { - return Developer -} - -const Container = styled.div` - padding: 20px; -` -export default DeveloperSetting diff --git a/src/renderer/src/pages/settings/CommonSettings.tsx b/src/renderer/src/pages/settings/GeneralSettings.tsx similarity index 50% rename from src/renderer/src/pages/settings/CommonSettings.tsx rename to src/renderer/src/pages/settings/GeneralSettings.tsx index 6384dbc0..7a2bcac9 100644 --- a/src/renderer/src/pages/settings/CommonSettings.tsx +++ b/src/renderer/src/pages/settings/GeneralSettings.tsx @@ -1,11 +1,11 @@ import { FC } from 'react' import styled from 'styled-components' -const CommonSettings: FC = () => { - return Common Settings +const GeneralSettings: FC = () => { + return General Settings } const Container = styled.div` padding: 20px; ` -export default CommonSettings +export default GeneralSettings diff --git a/src/renderer/src/pages/settings/ModelSettings.tsx b/src/renderer/src/pages/settings/ModelSettings.tsx new file mode 100644 index 00000000..2c08f3ac --- /dev/null +++ b/src/renderer/src/pages/settings/ModelSettings.tsx @@ -0,0 +1,51 @@ +import { FC } from 'react' +import { SettingContainer, SettingDivider, SettingTitle } from './components/SettingComponent' +import { Select } from 'antd' +import { useProviders } from '@renderer/hooks/useProvider' +import { useDefaultModel } from '@renderer/hooks/useAssistant' +import { find } from 'lodash' +import { Model } from '@renderer/types' + +const ModelSettings: FC = () => { + const { defaultModel, setDefaultModel, setTopicNamingModel } = useDefaultModel() + const providers = useProviders() + const allModels = providers.map((p) => p.models).flat() + + return ( + + Default Assistant Model + + setTopicNamingModel(find(allModels, { id }) as Model)} + options={providers.map((p) => ({ + label: p.name, + title: p.name, + options: p.models.map((m) => ({ + label: m.name, + value: m.id + })) + }))} + /> + + ) +} + +export default ModelSettings diff --git a/src/renderer/src/pages/settings/LanguageModelsSettings.tsx b/src/renderer/src/pages/settings/ProviderSettings.tsx similarity index 93% rename from src/renderer/src/pages/settings/LanguageModelsSettings.tsx rename to src/renderer/src/pages/settings/ProviderSettings.tsx index ba043dd0..ea07e9f0 100644 --- a/src/renderer/src/pages/settings/LanguageModelsSettings.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings.tsx @@ -4,8 +4,7 @@ import { FC, useState } from 'react' import styled from 'styled-components' import ModalProviderSetting from './components/ModalProviderSetting' -// OpenAI Silicon deepseek Groq -const LanguageModelsSettings: FC = () => { +const ProviderSettings: FC = () => { const providers = useSystemProviders() const [selectedProvider, setSelectedProvider] = useState(providers[0]) @@ -61,4 +60,4 @@ const ProviderListItem = styled.div` } ` -export default LanguageModelsSettings +export default ProviderSettings diff --git a/src/renderer/src/pages/settings/SettingsPage.tsx b/src/renderer/src/pages/settings/SettingsPage.tsx index b06f1c6c..34f25744 100644 --- a/src/renderer/src/pages/settings/SettingsPage.tsx +++ b/src/renderer/src/pages/settings/SettingsPage.tsx @@ -2,11 +2,11 @@ import { Navbar, NavbarCenter } from '@renderer/components/app/Navbar' import { FC } from 'react' import { Link, Route, Routes, useLocation } from 'react-router-dom' import styled from 'styled-components' -import CommonSettings from './CommonSettings' +import GeneralSettings from './GeneralSettings' import AboutSettings from './AboutSettings' -import DefaultAssistantSetting from './DefaultAssistantSetting' -import SystemAssistantSettings from './SystemAssistantSettings' -import LanguageModelsSettings from './LanguageModelsSettings' +import AssistantSettings from './AssistantSettings' +import ModelSettings from './ModelSettings' +import ProviderSettings from './ProviderSettings' const SettingsPage: FC = () => { const { pathname } = useLocation() @@ -20,17 +20,17 @@ const SettingsPage: FC = () => { - - Common Settings + + General - - Language Model + + Model Provider - - System Assistant + + Model Settings - - Default Assistant + + Default Assistant About @@ -38,10 +38,10 @@ const SettingsPage: FC = () => { - } /> - } /> - } /> - } /> + } /> + } /> + } /> + } /> } /> diff --git a/src/renderer/src/pages/settings/SystemAssistantSettings.tsx b/src/renderer/src/pages/settings/SystemAssistantSettings.tsx deleted file mode 100644 index 6d7b458f..00000000 --- a/src/renderer/src/pages/settings/SystemAssistantSettings.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { FC } from 'react' -import styled from 'styled-components' - -const SystemAssistantSettings: FC = () => { - return System Assistant -} - -const Container = styled.div` - padding: 20px; -` -export default SystemAssistantSettings diff --git a/src/renderer/src/pages/settings/components/ModalProviderSetting.tsx b/src/renderer/src/pages/settings/components/ModalProviderSetting.tsx index c979bdf1..937d3fe6 100644 --- a/src/renderer/src/pages/settings/components/ModalProviderSetting.tsx +++ b/src/renderer/src/pages/settings/components/ModalProviderSetting.tsx @@ -5,6 +5,7 @@ import { Button, Card, Divider, Input } from 'antd' import { useProvider } from '@renderer/hooks/useProvider' import ModalListPopup from '@renderer/components/Popups/ModalListPopup' import { groupBy } from 'lodash' +import { SettingContainer, SettingSubtitle, SettingTitle } from './SettingComponent' interface Props { provider: Provider @@ -35,10 +36,10 @@ const ModalProviderSetting: FC = ({ provider }) => { } return ( - - {provider.name} + + {provider.name} - API Key + API Key = ({ provider }) => { onBlur={onUpdateApiKey} spellCheck={false} /> - API Host + API Host setApiHost(e.target.value)} onBlur={onUpdateApiHost} /> - Models + Models {Object.keys(modelGroups).map((group) => ( {modelGroups[group].map((model) => ( @@ -64,36 +65,10 @@ const ModalProviderSetting: FC = ({ provider }) => { - + ) } -const Container = styled.div` - display: flex; - flex-direction: column; - flex: 1; - height: calc(100vh - var(--navbar-height)); - padding: 15px; - overflow-y: scroll; - - &::-webkit-scrollbar { - display: none; - } -` - -const Title = styled.div` - display: flex; - flex-direction: row; - justify-content: space-between; - align-items: center; -` - -const SubTitle = styled.div` - font-size: 12px; - color: var(--color-text-3); - margin: 10px 0; -` - const ModelListItem = styled.div` display: flex; flex-direction: row; diff --git a/src/renderer/src/pages/settings/components/SettingComponent.tsx b/src/renderer/src/pages/settings/components/SettingComponent.tsx new file mode 100644 index 00000000..5fcf6fe5 --- /dev/null +++ b/src/renderer/src/pages/settings/components/SettingComponent.tsx @@ -0,0 +1,32 @@ +import { Divider } from 'antd' +import styled from 'styled-components' + +export const SettingContainer = styled.div` + display: flex; + flex-direction: column; + flex: 1; + height: calc(100vh - var(--navbar-height)); + padding: 15px; + overflow-y: scroll; + + &::-webkit-scrollbar { + display: none; + } +` + +export const SettingTitle = styled.div` + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; +` + +export const SettingSubtitle = styled.div` + font-size: 12px; + color: var(--color-text-3); + margin: 10px 0; +` + +export const SettingDivider = styled(Divider)` + margin: 10px 0; +` diff --git a/src/renderer/src/store/llm.ts b/src/renderer/src/store/llm.ts index b88fbd5b..6f304638 100644 --- a/src/renderer/src/store/llm.ts +++ b/src/renderer/src/store/llm.ts @@ -6,10 +6,12 @@ import { uniqBy } from 'lodash' export interface LlmState { providers: Provider[] defaultModel: Model + topicNamingModel: Model } const initialState: LlmState = { defaultModel: SYSTEM_MODELS.openai[0], + topicNamingModel: SYSTEM_MODELS.openai[0], providers: [ { id: 'openai', @@ -78,10 +80,24 @@ const settingsSlice = createSlice({ } : p ) + }, + setDefaultModel: (state, action: PayloadAction<{ model: Model }>) => { + state.defaultModel = action.payload.model + }, + setTopicNamingModel: (state, action: PayloadAction<{ model: Model }>) => { + state.topicNamingModel = action.payload.model } } }) -export const { updateProvider, addProvider, removeProvider, addModel, removeModel } = settingsSlice.actions +export const { + updateProvider, + addProvider, + removeProvider, + addModel, + removeModel, + setDefaultModel, + setTopicNamingModel +} = settingsSlice.actions export default settingsSlice.reducer