From 577d180e1d0ebf8086ecb1f73f7ebe0183b30635 Mon Sep 17 00:00:00 2001 From: George Zhao <38124587+CreatorZZY@users.noreply.github.com> Date: Wed, 14 May 2025 19:37:37 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=B4=E9=95=BF=E4=B8=8A=E4=B8=8B?= =?UTF-8?q?=E6=96=87=20(#5963)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: Extended the fillable context length to 100. #5514 Update src/renderer/src/pages/home/Tabs/SettingsTab.tsx fix: update context length settings and localization for multiple languages * fix: adjust context count slider limits and behavior based on max contexts setting * feat: implement event handling for max contexts changes in settings * feat: update context count handling to use EXTENDED_CONTEXT_LIMIT in settings * feat: update context count logic to use EXTENDED_CONTEXT_LIMIT when max contexts are enabled * refactor: remove unused EXTENDED_CONTEXT_LIMIT import from AssistantService * feat: simplify context count logic with validAndChangeContextCount function * feat: 移除TokenCount组件中对最大计数为20的特殊处理,简化上下文计数显示逻辑 * refactor: simplify getContextCount logic by removing max context handling * feat: adjust step value for context count input based on max contexts setting --------- Co-authored-by: George Zhao --- src/renderer/src/config/constant.ts | 1 + src/renderer/src/i18n/locales/en-us.json | 1 + src/renderer/src/i18n/locales/ja-jp.json | 1 + src/renderer/src/i18n/locales/ru-ru.json | 1 + src/renderer/src/i18n/locales/zh-cn.json | 1 + src/renderer/src/i18n/locales/zh-tw.json | 1 + .../src/pages/home/Inputbar/TokenCount.tsx | 14 +---- .../src/pages/home/Tabs/SettingsTab.tsx | 55 +++++++++++++++++-- .../AssistantModelSettings.tsx | 55 ++++++++++++++++--- src/renderer/src/services/AssistantService.ts | 3 +- src/renderer/src/services/EventService.ts | 3 +- src/renderer/src/services/MessagesService.ts | 4 +- src/renderer/src/types/index.ts | 1 + 13 files changed, 109 insertions(+), 32 deletions(-) diff --git a/src/renderer/src/config/constant.ts b/src/renderer/src/config/constant.ts index 5d2376d12f..7f26bff5b5 100644 --- a/src/renderer/src/config/constant.ts +++ b/src/renderer/src/config/constant.ts @@ -1,5 +1,6 @@ export const DEFAULT_TEMPERATURE = 1.0 export const DEFAULT_CONTEXTCOUNT = 5 +export const EXTENDED_CONTEXT_LIMIT = 100 export const DEFAULT_MAX_TOKENS = 4096 export const DEFAULT_KNOWLEDGE_DOCUMENT_COUNT = 6 export const DEFAULT_KNOWLEDGE_THRESHOLD = 0.0 diff --git a/src/renderer/src/i18n/locales/en-us.json b/src/renderer/src/i18n/locales/en-us.json index a8d8a173e6..f2cd67fe8e 100644 --- a/src/renderer/src/i18n/locales/en-us.json +++ b/src/renderer/src/i18n/locales/en-us.json @@ -208,6 +208,7 @@ "settings.context_count": "Context", "settings.context_count.tip": "The number of previous messages to keep in the context.", "settings.max": "Max", + "settings.max_contexts": "More Contexts Length", "settings.max_tokens": "Enable max tokens limit", "settings.max_tokens.confirm": "Enable max tokens limit", "settings.max_tokens.confirm_content": "Enable max tokens limit, affects the length of the result. Need to consider the context limit of the model, otherwise an error will be reported", diff --git a/src/renderer/src/i18n/locales/ja-jp.json b/src/renderer/src/i18n/locales/ja-jp.json index f30f699611..641c8116e3 100644 --- a/src/renderer/src/i18n/locales/ja-jp.json +++ b/src/renderer/src/i18n/locales/ja-jp.json @@ -208,6 +208,7 @@ "settings.context_count": "コンテキスト", "settings.context_count.tip": "コンテキストに保持する以前のメッセージの数", "settings.max": "最大", + "settings.max_contexts": "より長いコンテキスト制限", "settings.max_tokens": "最大トークン制限を有効にする", "settings.max_tokens.confirm": "最大トークン制限を有効にする", "settings.max_tokens.confirm_content": "最大トークン制限を有効にすると、モデルが生成できる最大トークン数が制限されます。これにより、返される結果の長さに影響が出る可能性があります。モデルのコンテキスト制限に基づいて設定する必要があります。そうしないとエラーが発生します", diff --git a/src/renderer/src/i18n/locales/ru-ru.json b/src/renderer/src/i18n/locales/ru-ru.json index 254f65b009..8b52c52722 100644 --- a/src/renderer/src/i18n/locales/ru-ru.json +++ b/src/renderer/src/i18n/locales/ru-ru.json @@ -208,6 +208,7 @@ "settings.context_count": "Контекст", "settings.context_count.tip": "Количество предыдущих сообщений, которые нужно сохранить в контексте.", "settings.max": "Максимум", + "settings.max_contexts": "Более длительные ограничения контекста", "settings.max_tokens": "Включить лимит максимальных токенов", "settings.max_tokens.confirm": "Включить лимит максимальных токенов", "settings.max_tokens.confirm_content": "Включить лимит максимальных токенов, влияет на длину результата. Нужно учитывать контекст модели, иначе будет ошибка", diff --git a/src/renderer/src/i18n/locales/zh-cn.json b/src/renderer/src/i18n/locales/zh-cn.json index 71aa95a73e..52f3f5930f 100644 --- a/src/renderer/src/i18n/locales/zh-cn.json +++ b/src/renderer/src/i18n/locales/zh-cn.json @@ -222,6 +222,7 @@ "settings.context_count": "上下文数", "settings.context_count.tip": "要保留在上下文中的消息数量,数值越大,上下文越长,消耗的 token 越多。普通聊天建议 5-10", "settings.max": "不限", + "settings.max_contexts": "更多上下文长度限制", "settings.max_tokens": "开启消息长度限制", "settings.max_tokens.confirm": "开启消息长度限制", "settings.max_tokens.confirm_content": "开启消息长度限制后,单次交互所用的最大 Token 数, 会影响返回结果的长度。要根据模型上下文限制来设置,否则会报错", diff --git a/src/renderer/src/i18n/locales/zh-tw.json b/src/renderer/src/i18n/locales/zh-tw.json index 16facb9ae0..fbfebd7266 100644 --- a/src/renderer/src/i18n/locales/zh-tw.json +++ b/src/renderer/src/i18n/locales/zh-tw.json @@ -208,6 +208,7 @@ "settings.context_count": "上下文", "settings.context_count.tip": "在上下文中保留的前幾則訊息。", "settings.max": "最大", + "settings.max_contexts": "更多上下文長度限制", "settings.max_tokens": "啟用最大 Token 限制", "settings.max_tokens.confirm": "啟用訊息長度限制", "settings.max_tokens.confirm_content": "啟用訊息長度限制後,單次互動所用的最大 Token 數,會影響返回結果的長度。要根據模型上下文限制來設定,否則會發生錯誤。", diff --git a/src/renderer/src/pages/home/Inputbar/TokenCount.tsx b/src/renderer/src/pages/home/Inputbar/TokenCount.tsx index cb08b9b5fd..b7ca3b351b 100644 --- a/src/renderer/src/pages/home/Inputbar/TokenCount.tsx +++ b/src/renderer/src/pages/home/Inputbar/TokenCount.tsx @@ -22,18 +22,6 @@ const TokenCount: FC = ({ estimateTokenCount, inputTokenCount, contextCou } const formatMaxCount = (max: number) => { - if (max == 20) { - return ( - - ∞ - - ) - } return max.toString() } @@ -43,7 +31,7 @@ const TokenCount: FC = ({ estimateTokenCount, inputTokenCount, contextCou {t('chat.input.context_count.tip')} - {contextCount.current} / {contextCount.max == 20 ? '∞' : contextCount.max} + {contextCount.current} / {contextCount.max} diff --git a/src/renderer/src/pages/home/Tabs/SettingsTab.tsx b/src/renderer/src/pages/home/Tabs/SettingsTab.tsx index 1b35190be0..0e69481210 100644 --- a/src/renderer/src/pages/home/Tabs/SettingsTab.tsx +++ b/src/renderer/src/pages/home/Tabs/SettingsTab.tsx @@ -5,6 +5,7 @@ import { DEFAULT_CONTEXTCOUNT, DEFAULT_MAX_TOKENS, DEFAULT_TEMPERATURE, + EXTENDED_CONTEXT_LIMIT, isMac, isWindows } from '@renderer/config/constant' @@ -13,6 +14,7 @@ import { useAssistant } from '@renderer/hooks/useAssistant' import { useSettings } from '@renderer/hooks/useSettings' import { SettingDivider, SettingRow, SettingRowTitle, SettingSubtitle } from '@renderer/pages/settings' import AssistantSettingsPopup from '@renderer/pages/settings/AssistantSettings' +import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' import { useAppDispatch } from '@renderer/store' import { SendMessageShortcut, @@ -51,7 +53,7 @@ import { TranslateLanguageVarious } from '@renderer/types' import { modalConfirm } from '@renderer/utils' -import { Button, Col, InputNumber, Row, Select, Slider, Switch, Tooltip } from 'antd' +import { Button, Col, Divider, InputNumber, Row, Select, Slider, Switch, Tooltip } from 'antd' import { CircleHelp, RotateCcw, Settings2 } from 'lucide-react' import { FC, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' @@ -67,6 +69,7 @@ const SettingsTab: FC = (props) => { const [temperature, setTemperature] = useState(assistant?.settings?.temperature ?? DEFAULT_TEMPERATURE) const [contextCount, setContextCount] = useState(assistant?.settings?.contextCount ?? DEFAULT_CONTEXTCOUNT) + const [enableMaxContexts, setEnableMaxContexts] = useState(assistant?.settings?.enableMaxContexts ?? false) const [enableMaxTokens, setEnableMaxTokens] = useState(assistant?.settings?.enableMaxTokens ?? false) const [maxTokens, setMaxTokens] = useState(assistant?.settings?.maxTokens ?? 0) const [fontSizeValue, setFontSizeValue] = useState(fontSize) @@ -155,10 +158,18 @@ const SettingsTab: FC = (props) => { const formatSliderTooltip = (value?: number) => { if (value === undefined) return '' - return value === 20 ? '∞' : value.toString() + return value.toString() } - return ( + const validAndChangeContextCount = (contextCount, enableMaxContexts, EXTENDED_CONTEXT_LIMIT) => { + if ((typeof contextCount === 'number' ? contextCount : 0) > (enableMaxContexts ? EXTENDED_CONTEXT_LIMIT : 10)) { + return enableMaxContexts ? EXTENDED_CONTEXT_LIMIT : 10 + } else { + return typeof contextCount === 'number' ? contextCount : 0 + } + } + + const container = ( @@ -204,15 +215,31 @@ const SettingsTab: FC = (props) => { + + {t('chat.settings.max_contexts')} + { + setEnableMaxContexts(checked) + updateAssistantSettings({ enableMaxContexts: checked }) + if (!checked && contextCount > 10) { + setContextCount(10) + onUpdateAssistantSettings({ contextCount: 10 }) + } + }} + /> + + {t('models.stream_output')} = (props) => { ) + EventEmitter.on(EVENT_NAMES.MAX_CONTEXTS_CHANGED, ({ check, context }): any => { + setEnableMaxContexts(check) + updateAssistantSettings({ enableMaxContexts: check }) + + // Ensure contextCount is within the new valid range + let newContextCount = context + if (!check && newContextCount > 10) { + newContextCount = 10 + } else if (check && newContextCount > EXTENDED_CONTEXT_LIMIT) { + newContextCount = EXTENDED_CONTEXT_LIMIT + } + + setContextCount(newContextCount) + onUpdateAssistantSettings({ contextCount: newContextCount }) + }) + return container } const Container = styled(Scrollbar)` diff --git a/src/renderer/src/pages/settings/AssistantSettings/AssistantModelSettings.tsx b/src/renderer/src/pages/settings/AssistantSettings/AssistantModelSettings.tsx index 1c494b2ee2..ac203189c1 100644 --- a/src/renderer/src/pages/settings/AssistantSettings/AssistantModelSettings.tsx +++ b/src/renderer/src/pages/settings/AssistantSettings/AssistantModelSettings.tsx @@ -2,8 +2,9 @@ import { DeleteOutlined, PlusOutlined, QuestionCircleOutlined } from '@ant-desig import ModelAvatar from '@renderer/components/Avatar/ModelAvatar' import { HStack } from '@renderer/components/Layout' import SelectModelPopup from '@renderer/components/Popups/SelectModelPopup' -import { DEFAULT_CONTEXTCOUNT, DEFAULT_TEMPERATURE } from '@renderer/config/constant' +import { DEFAULT_CONTEXTCOUNT, DEFAULT_TEMPERATURE, EXTENDED_CONTEXT_LIMIT } from '@renderer/config/constant' import { SettingRow } from '@renderer/pages/settings' +import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' import { Assistant, AssistantSettingCustomParameters, AssistantSettings } from '@renderer/types' import { modalConfirm } from '@renderer/utils' import { Button, Col, Divider, Input, InputNumber, Row, Select, Slider, Switch, Tooltip } from 'antd' @@ -21,6 +22,7 @@ interface Props { const AssistantModelSettings: FC = ({ assistant, updateAssistant, updateAssistantSettings }) => { const [temperature, setTemperature] = useState(assistant?.settings?.temperature ?? DEFAULT_TEMPERATURE) const [contextCount, setContextCount] = useState(assistant?.settings?.contextCount ?? DEFAULT_CONTEXTCOUNT) + const [enableMaxContexts, setEnableMaxContexts] = useState(assistant?.settings?.enableMaxContexts ?? false) const [enableMaxTokens, setEnableMaxTokens] = useState(assistant?.settings?.enableMaxTokens ?? false) const [maxTokens, setMaxTokens] = useState(assistant?.settings?.maxTokens ?? 0) const [streamOutput, setStreamOutput] = useState(assistant?.settings?.streamOutput ?? true) @@ -31,6 +33,10 @@ const AssistantModelSettings: FC = ({ assistant, updateAssistant, updateA assistant?.settings?.customParameters ?? [] ) + const onUpdateAssistantSettings = (settings: Partial) => { + updateAssistantSettings(settings) + } + const customParametersRef = useRef(customParameters) customParametersRef.current = customParameters @@ -181,7 +187,15 @@ const AssistantModelSettings: FC = ({ assistant, updateAssistant, updateA const formatSliderTooltip = (value?: number) => { if (value === undefined) return '' - return value === 20 ? '∞' : value.toString() + return value.toString() + } + + const validAndChangeContextCount = (contextCount, enableMaxContexts, EXTENDED_CONTEXT_LIMIT) => { + if ((typeof contextCount === 'number' ? contextCount : 0) > (enableMaxContexts ? EXTENDED_CONTEXT_LIMIT : 10)) { + return enableMaxContexts ? EXTENDED_CONTEXT_LIMIT : 10 + } else { + return typeof contextCount === 'number' ? contextCount : 0 + } } return ( @@ -292,26 +306,28 @@ const AssistantModelSettings: FC = ({ assistant, updateAssistant, updateA { if (!isNull(value)) { setContextCount(value) - setTimeout(() => updateAssistantSettings({ contextCount: value }), 500) + setTimeout(() => { + updateAssistantSettings({ contextCount: value }) + onUpdateAssistantSettings({ contextCount: value }) + }, 500) } }} style={{ width: '100%' }} @@ -319,6 +335,27 @@ const AssistantModelSettings: FC = ({ assistant, updateAssistant, updateA + + + + + { + setEnableMaxContexts(checked) + updateAssistantSettings({ enableMaxContexts: checked }) + if (!checked && contextCount > 10) { + setContextCount(10) + onUpdateAssistantSettings({ contextCount: 10 }) + } + EventEmitter.emit(EVENT_NAMES.MAX_CONTEXTS_CHANGED, { + check: checked, + context: contextCount + }) + }} + /> + + diff --git a/src/renderer/src/services/AssistantService.ts b/src/renderer/src/services/AssistantService.ts index 418ce6b4a3..eb843ed8ff 100644 --- a/src/renderer/src/services/AssistantService.ts +++ b/src/renderer/src/services/AssistantService.ts @@ -102,7 +102,8 @@ export const getAssistantSettings = (assistant: Assistant): AssistantSettings => } return { - contextCount: contextCount === 20 ? 100000 : contextCount, + enableMaxContexts: assistant?.settings?.enableMaxContexts ?? false, + contextCount: contextCount, temperature: assistant?.settings?.temperature ?? DEFAULT_TEMPERATURE, topP: assistant?.settings?.topP ?? 1, enableMaxTokens: assistant?.settings?.enableMaxTokens ?? false, diff --git a/src/renderer/src/services/EventService.ts b/src/renderer/src/services/EventService.ts index 309947c9bb..110e763177 100644 --- a/src/renderer/src/services/EventService.ts +++ b/src/renderer/src/services/EventService.ts @@ -26,5 +26,6 @@ export const EVENT_NAMES = { ADD_NEW_TOPIC: 'ADD_NEW_TOPIC', RESEND_MESSAGE: 'RESEND_MESSAGE', SHOW_MODEL_SELECTOR: 'SHOW_MODEL_SELECTOR', - QUOTE_TEXT: 'QUOTE_TEXT' + QUOTE_TEXT: 'QUOTE_TEXT', + MAX_CONTEXTS_CHANGED: 'MAX_CONTEXTS_CHANGED' } diff --git a/src/renderer/src/services/MessagesService.ts b/src/renderer/src/services/MessagesService.ts index d1dea18b9f..e8371b3108 100644 --- a/src/renderer/src/services/MessagesService.ts +++ b/src/renderer/src/services/MessagesService.ts @@ -41,9 +41,9 @@ export { export function getContextCount(assistant: Assistant, messages: Message[]) { const rawContextCount = assistant?.settings?.contextCount ?? DEFAULT_CONTEXTCOUNT - const maxContextCount = rawContextCount === 20 ? 100000 : rawContextCount + const maxContextCount = rawContextCount - const _messages = rawContextCount === 20 ? takeRight(messages, 1000) : takeRight(messages, maxContextCount) + const _messages = takeRight(messages, maxContextCount) const clearIndex = _messages.findLastIndex((message) => message.type === 'clear') diff --git a/src/renderer/src/types/index.ts b/src/renderer/src/types/index.ts index e66e629043..5b732847ba 100644 --- a/src/renderer/src/types/index.ts +++ b/src/renderer/src/types/index.ts @@ -51,6 +51,7 @@ export const EFFORT_RATIO: EffortRatio = { export type AssistantSettings = { contextCount: number + enableMaxContexts: boolean temperature: number topP: number maxTokens: number | undefined