From 85bf4498c0ecf92ce4ebf3680dd1429f49dff05e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?George=C2=B7Dong?= <98630204+GeorgeDong32@users.noreply.github.com> Date: Sat, 8 Mar 2025 20:49:24 +0800 Subject: [PATCH] fix: number of context incorrect (#2653) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: number of context incorrect * feat: 优化上下文数显示样式 * fix: 上下文数显示不正确 修复无限上下文情况下,当前上下文数显示不正确的问题 * fix: slider display incorrect * fix: Update infinity display style --- src/renderer/src/i18n/locales/en-us.json | 2 +- src/renderer/src/i18n/locales/ja-jp.json | 2 +- src/renderer/src/i18n/locales/ru-ru.json | 2 +- src/renderer/src/i18n/locales/zh-cn.json | 2 +- src/renderer/src/i18n/locales/zh-tw.json | 2 +- .../src/pages/home/Inputbar/Inputbar.tsx | 4 +-- .../src/pages/home/Inputbar/TokenCount.tsx | 28 +++++++++++++++---- .../src/pages/home/Tabs/SettingsTab.tsx | 6 ++++ .../AssistantModelSettings.tsx | 6 ++++ src/renderer/src/services/MessagesService.ts | 22 +++++++++++---- src/renderer/src/services/TokenService.ts | 3 +- 11 files changed, 60 insertions(+), 19 deletions(-) diff --git a/src/renderer/src/i18n/locales/en-us.json b/src/renderer/src/i18n/locales/en-us.json index fa4741b7..be52ae37 100644 --- a/src/renderer/src/i18n/locales/en-us.json +++ b/src/renderer/src/i18n/locales/en-us.json @@ -86,7 +86,7 @@ "input.clear.content": "Do you want to clear all messages of the current topic?", "input.clear.title": "Clear all messages?", "input.collapse": "Collapse", - "input.context_count.tip": "Context Count", + "input.context_count.tip": "Context / Max Context", "input.estimated_tokens.tip": "Estimated tokens", "input.expand": "Expand", "input.file_not_supported": "Model does not support this file type", diff --git a/src/renderer/src/i18n/locales/ja-jp.json b/src/renderer/src/i18n/locales/ja-jp.json index a99ed5b4..b051a155 100644 --- a/src/renderer/src/i18n/locales/ja-jp.json +++ b/src/renderer/src/i18n/locales/ja-jp.json @@ -86,7 +86,7 @@ "input.clear.content": "現在のトピックのすべてのメッセージをクリアしますか?", "input.clear.title": "すべてのメッセージをクリアしますか?", "input.collapse": "折りたたむ", - "input.context_count.tip": "コンテキスト数", + "input.context_count.tip": "コンテキスト数 / 最大コンテキスト数", "input.estimated_tokens.tip": "推定トークン数", "input.expand": "展開", "input.file_not_supported": "モデルはこのファイルタイプをサポートしません", diff --git a/src/renderer/src/i18n/locales/ru-ru.json b/src/renderer/src/i18n/locales/ru-ru.json index 7c665715..bf0eb4f3 100644 --- a/src/renderer/src/i18n/locales/ru-ru.json +++ b/src/renderer/src/i18n/locales/ru-ru.json @@ -86,7 +86,7 @@ "input.clear.content": "Хотите очистить все сообщения текущего топика?", "input.clear.title": "Очистить все сообщения?", "input.collapse": "Свернуть", - "input.context_count.tip": "Количество контекстов", + "input.context_count.tip": "Контекст / Макс. контекст", "input.estimated_tokens.tip": "Затраты токенов", "input.expand": "Развернуть", "input.file_not_supported": "Модель не поддерживает этот тип файла", diff --git a/src/renderer/src/i18n/locales/zh-cn.json b/src/renderer/src/i18n/locales/zh-cn.json index 596f9d44..db7a4ec1 100644 --- a/src/renderer/src/i18n/locales/zh-cn.json +++ b/src/renderer/src/i18n/locales/zh-cn.json @@ -86,7 +86,7 @@ "input.clear.content": "确定要清除当前会话所有消息吗?", "input.clear.title": "清空消息", "input.collapse": "收起", - "input.context_count.tip": "上下文数", + "input.context_count.tip": "上下文数 / 最大上下文数", "input.estimated_tokens.tip": "预估 token 数", "input.expand": "展开", "input.file_not_supported": "模型不支持此文件类型", diff --git a/src/renderer/src/i18n/locales/zh-tw.json b/src/renderer/src/i18n/locales/zh-tw.json index fd0e3366..3925f5a8 100644 --- a/src/renderer/src/i18n/locales/zh-tw.json +++ b/src/renderer/src/i18n/locales/zh-tw.json @@ -86,7 +86,7 @@ "input.clear.content": "您想要清除目前話題的所有訊息嗎?", "input.clear.title": "清除所有訊息?", "input.collapse": "折疊", - "input.context_count.tip": "上下文數量", + "input.context_count.tip": "上下文數 / 最大上下文數", "input.estimated_tokens.tip": "預估 Token 數", "input.expand": "展開", "input.file_not_supported": "模型不支援此檔案類型", diff --git a/src/renderer/src/pages/home/Inputbar/Inputbar.tsx b/src/renderer/src/pages/home/Inputbar/Inputbar.tsx index c374a11a..e7d9a600 100644 --- a/src/renderer/src/pages/home/Inputbar/Inputbar.tsx +++ b/src/renderer/src/pages/home/Inputbar/Inputbar.tsx @@ -75,7 +75,7 @@ const Inputbar: FC = ({ assistant: _assistant, setActiveTopic }) => { } = useSettings() const [expended, setExpend] = useState(false) const [estimateTokenCount, setEstimateTokenCount] = useState(0) - const [contextCount, setContextCount] = useState(0) + const [contextCount, setContextCount] = useState({ current: 0, max: 0 }) const generating = useAppSelector((state) => state.runtime.generating) const textareaRef = useRef(null) const [files, setFiles] = useState(_files) @@ -503,7 +503,7 @@ const Inputbar: FC = ({ assistant: _assistant, setActiveTopic }) => { }), EventEmitter.on(EVENT_NAMES.ESTIMATED_TOKEN_COUNT, ({ tokensCount, contextCount }) => { _setEstimateTokenCount(tokensCount) - setContextCount(contextCount) + setContextCount({ current: contextCount.current, max: contextCount.max }) // 现在contextCount是一个对象而不是单个数值 }), EventEmitter.on(EVENT_NAMES.ADD_NEW_TOPIC, addNewTopic), EventEmitter.on(EVENT_NAMES.QUOTE_TEXT, (quotedText: string) => { diff --git a/src/renderer/src/pages/home/Inputbar/TokenCount.tsx b/src/renderer/src/pages/home/Inputbar/TokenCount.tsx index 2243e371..8de98690 100644 --- a/src/renderer/src/pages/home/Inputbar/TokenCount.tsx +++ b/src/renderer/src/pages/home/Inputbar/TokenCount.tsx @@ -9,7 +9,7 @@ import styled from 'styled-components' type Props = { estimateTokenCount: number inputTokenCount: number - contextCount: number + contextCount: { current: number; max: number } ToolbarButton: any } & React.HTMLAttributes @@ -21,12 +21,30 @@ const TokenCount: FC = ({ estimateTokenCount, inputTokenCount, contextCou return null } + const formatMaxCount = (max: number) => { + if (max == 20) { + return ( + + ∞ + + ) + } + return max.toString() + } + const PopoverContent = () => { return ( - + {t('chat.input.context_count.tip')} - {contextCount} + + {contextCount.current} / {contextCount.max == 20 ? '∞' : contextCount.max} + @@ -40,7 +58,7 @@ const TokenCount: FC = ({ estimateTokenCount, inputTokenCount, contextCou return ( - {contextCount} + {contextCount.current} / {formatMaxCount(contextCount.max)} {inputTokenCount} / {estimateTokenCount} @@ -66,7 +84,7 @@ const Container = styled.div` font-size: 10px; margin-right: 3px; } - @media (max-width: 600px) { + @media (max-width: 700px) { display: none; } ` diff --git a/src/renderer/src/pages/home/Tabs/SettingsTab.tsx b/src/renderer/src/pages/home/Tabs/SettingsTab.tsx index 50739487..ae7bc826 100644 --- a/src/renderer/src/pages/home/Tabs/SettingsTab.tsx +++ b/src/renderer/src/pages/home/Tabs/SettingsTab.tsx @@ -133,6 +133,11 @@ const SettingsTab: FC = (props) => { setReasoningEffort(assistant?.settings?.reasoning_effort) }, [assistant]) + const formatSliderTooltip = (value?: number) => { + if (value === undefined) return '' + return value === 20 ? '∞' : value.toString() + } + return ( @@ -176,6 +181,7 @@ const SettingsTab: FC = (props) => { onChangeComplete={onContextCountChange} value={typeof contextCount === 'number' ? contextCount : 0} step={1} + tooltip={{ formatter: formatSliderTooltip }} /> diff --git a/src/renderer/src/pages/settings/AssistantSettings/AssistantModelSettings.tsx b/src/renderer/src/pages/settings/AssistantSettings/AssistantModelSettings.tsx index 73443f6c..09a27b02 100644 --- a/src/renderer/src/pages/settings/AssistantSettings/AssistantModelSettings.tsx +++ b/src/renderer/src/pages/settings/AssistantSettings/AssistantModelSettings.tsx @@ -184,6 +184,11 @@ const AssistantModelSettings: FC = ({ assistant, updateAssistant, updateA return () => updateAssistantSettings({ customParameters: customParametersRef.current }) }, []) + const formatSliderTooltip = (value?: number) => { + if (value === undefined) return '' + return value === 20 ? '∞' : value.toString() + } + return ( @@ -298,6 +303,7 @@ const AssistantModelSettings: FC = ({ assistant, updateAssistant, updateA value={typeof contextCount === 'number' ? contextCount : 0} marks={{ 0: '0', 5: '5', 10: '10', 15: '15', 20: t('chat.settings.max') }} step={1} + tooltip={{ formatter: formatSliderTooltip }} /> diff --git a/src/renderer/src/services/MessagesService.ts b/src/renderer/src/services/MessagesService.ts index 967e48d8..d46e1851 100644 --- a/src/renderer/src/services/MessagesService.ts +++ b/src/renderer/src/services/MessagesService.ts @@ -68,16 +68,26 @@ export function filterUsefulMessages(messages: Message[]): Message[] { } export function getContextCount(assistant: Assistant, messages: Message[]) { - const contextCount = assistant?.settings?.contextCount ?? DEFAULT_CONTEXTCOUNT - const _messages = takeRight(messages, contextCount) - const clearIndex = _messages.findLastIndex((message) => message.type === 'clear') - const messagesCount = _messages.length + const rawContextCount = assistant?.settings?.contextCount ?? DEFAULT_CONTEXTCOUNT + // 使用与 getAssistantSettings 相同的逻辑处理无限上下文 + const maxContextCount = rawContextCount === 20 ? 100000 : rawContextCount + // 在无限模式下,设置一个合理的高上限而不是处理所有消息 + const _messages = rawContextCount === 20 ? takeRight(messages, 1000) : takeRight(messages, maxContextCount) + + const clearIndex = _messages.findLastIndex((message) => message.type === 'clear') + + let currentContextCount = 0 if (clearIndex === -1) { - return contextCount + currentContextCount = _messages.length + } else { + currentContextCount = _messages.length - (clearIndex + 1) } - return messagesCount - (clearIndex + 1) + return { + current: currentContextCount, + max: rawContextCount + } } export function deleteMessageFiles(message: Message) { diff --git a/src/renderer/src/services/TokenService.ts b/src/renderer/src/services/TokenService.ts index 12b8b082..4f4ac294 100644 --- a/src/renderer/src/services/TokenService.ts +++ b/src/renderer/src/services/TokenService.ts @@ -95,7 +95,8 @@ export async function estimateMessagesUsage({ export async function estimateHistoryTokens(assistant: Assistant, msgs: Message[]) { const { contextCount } = getAssistantSettings(assistant) - const messages = filterMessages(filterContextMessages(takeRight(msgs, contextCount))) + const maxContextCount = contextCount + const messages = filterMessages(filterContextMessages(takeRight(msgs, maxContextCount))) // 有 usage 数据的消息,快速计算总数 const uasageTokens = messages