From 32cdfbbfb0c0904f306de8363c9b211adf8182f1 Mon Sep 17 00:00:00 2001 From: kangfenmao Date: Sun, 29 Sep 2024 17:40:57 +0800 Subject: [PATCH] feat: add assistant setting popup --- .../AssistantModelSettings.tsx | 187 ++++++++++++++++++ .../AssistantPromptSettings.tsx | 47 +++++ .../components/AssistantSettings/index.tsx | 154 +++++++++++++++ .../Popups/AssistantSettingPopup.tsx | 84 -------- src/renderer/src/context/AntdProvider.tsx | 7 +- src/renderer/src/i18n/en-us.json | 4 +- src/renderer/src/i18n/zh-cn.json | 4 +- src/renderer/src/i18n/zh-tw.json | 4 +- src/renderer/src/pages/home/Assistants.tsx | 19 +- .../src/pages/home/Messages/Prompt.tsx | 13 +- src/renderer/src/pages/home/Navbar.tsx | 17 +- 11 files changed, 416 insertions(+), 124 deletions(-) create mode 100644 src/renderer/src/components/AssistantSettings/AssistantModelSettings.tsx create mode 100644 src/renderer/src/components/AssistantSettings/AssistantPromptSettings.tsx create mode 100644 src/renderer/src/components/AssistantSettings/index.tsx delete mode 100644 src/renderer/src/components/Popups/AssistantSettingPopup.tsx diff --git a/src/renderer/src/components/AssistantSettings/AssistantModelSettings.tsx b/src/renderer/src/components/AssistantSettings/AssistantModelSettings.tsx new file mode 100644 index 00000000..629b1c21 --- /dev/null +++ b/src/renderer/src/components/AssistantSettings/AssistantModelSettings.tsx @@ -0,0 +1,187 @@ +import { QuestionCircleOutlined } from '@ant-design/icons' +import { HStack } from '@renderer/components/Layout' +import { DEFAULT_CONEXTCOUNT, DEFAULT_MAX_TOKENS, DEFAULT_TEMPERATURE } from '@renderer/config/constant' +import { useAssistant } from '@renderer/hooks/useAssistant' +import { SettingRow, SettingRowTitle } from '@renderer/pages/settings' +import { Assistant, AssistantSettings } from '@renderer/types' +import { Button, Col, Row, Slider, Switch, Tooltip } from 'antd' +import { FC, useEffect, useState } from 'react' +import { useTranslation } from 'react-i18next' +import styled from 'styled-components' + +interface Props { + assistant: Assistant +} + +const AssistantModelSettings: FC = (props) => { + const { assistant, updateAssistantSettings, updateAssistant } = useAssistant(props.assistant.id) + const [temperature, setTemperature] = useState(assistant?.settings?.temperature ?? DEFAULT_TEMPERATURE) + const [contextCount, setConextCount] = useState(assistant?.settings?.contextCount ?? DEFAULT_CONEXTCOUNT) + const [enableMaxTokens, setEnableMaxTokens] = useState(assistant?.settings?.enableMaxTokens ?? false) + const [maxTokens, setMaxTokens] = useState(assistant?.settings?.maxTokens ?? 0) + const [streamOutput, setStreamOutput] = useState(assistant?.settings?.streamOutput ?? true) + const { t } = useTranslation() + + const onUpdateAssistantSettings = (settings: Partial) => { + updateAssistantSettings({ + temperature: settings.temperature ?? temperature, + contextCount: settings.contextCount ?? contextCount, + enableMaxTokens: settings.enableMaxTokens ?? enableMaxTokens, + maxTokens: settings.maxTokens ?? maxTokens, + streamOutput: settings.streamOutput ?? streamOutput + }) + } + + const onTemperatureChange = (value) => { + if (!isNaN(value as number)) { + onUpdateAssistantSettings({ temperature: value }) + } + } + + const onConextCountChange = (value) => { + if (!isNaN(value as number)) { + onUpdateAssistantSettings({ contextCount: value }) + } + } + + const onMaxTokensChange = (value) => { + if (!isNaN(value as number)) { + onUpdateAssistantSettings({ maxTokens: value }) + } + } + + const onReset = () => { + setTemperature(DEFAULT_TEMPERATURE) + setConextCount(DEFAULT_CONEXTCOUNT) + updateAssistant({ + ...assistant, + settings: { + ...assistant.settings, + temperature: DEFAULT_TEMPERATURE, + contextCount: DEFAULT_CONEXTCOUNT, + enableMaxTokens: false, + maxTokens: DEFAULT_MAX_TOKENS, + streamOutput: true + } + }) + } + + useEffect(() => { + setTemperature(assistant?.settings?.temperature ?? DEFAULT_TEMPERATURE) + setConextCount(assistant?.settings?.contextCount ?? DEFAULT_CONEXTCOUNT) + setEnableMaxTokens(assistant?.settings?.enableMaxTokens ?? false) + setMaxTokens(assistant?.settings?.maxTokens ?? DEFAULT_MAX_TOKENS) + setStreamOutput(assistant?.settings?.streamOutput ?? true) + }, [assistant]) + + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { + setEnableMaxTokens(enabled) + onUpdateAssistantSettings({ enableMaxTokens: enabled }) + }} + /> + + + + + + + + {t('model.stream_output')} + { + setStreamOutput(checked) + onUpdateAssistantSettings({ streamOutput: checked }) + }} + /> + + + + + + ) +} + +const Container = styled.div` + display: flex; + flex: 1; + flex-direction: column; + overflow: hidden; + padding-bottom: 10px; +` + +const Label = styled.p` + margin: 0; + margin-right: 5px; +` + +const QuestionIcon = styled(QuestionCircleOutlined)` + font-size: 12px; + cursor: pointer; + color: var(--color-text-3); +` + +const SettingRowTitleSmall = styled(SettingRowTitle)` + font-size: 13px; +` + +export default AssistantModelSettings diff --git a/src/renderer/src/components/AssistantSettings/AssistantPromptSettings.tsx b/src/renderer/src/components/AssistantSettings/AssistantPromptSettings.tsx new file mode 100644 index 00000000..39f5fb00 --- /dev/null +++ b/src/renderer/src/components/AssistantSettings/AssistantPromptSettings.tsx @@ -0,0 +1,47 @@ +import { useAssistant } from '@renderer/hooks/useAssistant' +import { syncAsistantToAgent } from '@renderer/services/assistant' +import { Assistant } from '@renderer/types' +import { Input } from 'antd' +import TextArea from 'antd/es/input/TextArea' +import { useState } from 'react' +import { useTranslation } from 'react-i18next' + +import { Box, VStack } from '../Layout' + +const AssistantPromptSettings: React.FC<{ assistant: Assistant }> = (props) => { + const { assistant, updateAssistant } = useAssistant(props.assistant.id) + const [name, setName] = useState(assistant.name) + const [prompt, setPrompt] = useState(assistant.prompt) + const { t } = useTranslation() + + const onUpdate = () => { + const _assistant = { ...assistant, name, prompt } + updateAssistant(_assistant) + syncAsistantToAgent(_assistant) + } + + return ( + + {t('common.name')} + setName(e.target.value)} + onBlur={onUpdate} + /> + + {t('common.prompt')} + +