From 446ebae1755e69a751b113f0c17506fd9a5d6114 Mon Sep 17 00:00:00 2001
From: Phantom <59059173+EurFelux@users.noreply.github.com>
Date: Thu, 10 Jul 2025 21:51:31 +0800
Subject: [PATCH] feat(ui): better infinite context (#8021)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* feat(上下文): 添加最大上下文数量限制及显示组件
- 在常量配置中添加 MAX_CONTEXT_COUNT
- 创建 MaxContextCount 组件用于显示无限上下文标识
- 在相关组件中替换硬编码的上下文最大值
- 优化 TokenCount 组件的上下文计数显示样式
* refactor(常量): 添加UNLIMITED_CONTEXT_COUNT常量并替换硬编码值
使用UNLIMITED_CONTEXT_COUNT常量替代多处硬编码的100000值,提高代码可维护性
* refactor(Inputbar): 使用 SlashSeparatorSpan 组件替换内联样式
将 TokenCount.tsx 中的斜杠分隔符内联样式替换为 SlashSeparatorSpan 组件,提高代码可维护性
* fix: 为 InfinityIcon 添加 aria-label 并统一样式
---
.../src/components/MaxContextCount.tsx | 17 ++++++++++
src/renderer/src/config/constant.ts | 3 ++
.../src/pages/home/Inputbar/TokenCount.tsx | 34 ++++++++++++++-----
.../AssistantModelSettings.tsx | 6 ++--
src/renderer/src/services/AssistantService.ts | 10 ++++--
src/renderer/src/services/MessagesService.ts | 4 +--
6 files changed, 58 insertions(+), 16 deletions(-)
create mode 100644 src/renderer/src/components/MaxContextCount.tsx
diff --git a/src/renderer/src/components/MaxContextCount.tsx b/src/renderer/src/components/MaxContextCount.tsx
new file mode 100644
index 0000000000..be9c9f293c
--- /dev/null
+++ b/src/renderer/src/components/MaxContextCount.tsx
@@ -0,0 +1,17 @@
+import { MAX_CONTEXT_COUNT } from '@renderer/config/constant'
+import { Infinity as InfinityIcon } from 'lucide-react'
+import { CSSProperties } from 'react'
+
+type Props = {
+ maxContext: number
+ style?: CSSProperties
+ size?: number
+}
+
+export default function MaxContextCount({ maxContext, style, size = 14 }: Props) {
+ return maxContext === MAX_CONTEXT_COUNT ? (
+
+ ) : (
+ {maxContext.toString()}
+ )
+}
diff --git a/src/renderer/src/config/constant.ts b/src/renderer/src/config/constant.ts
index 80e2be8a34..32183072dc 100644
--- a/src/renderer/src/config/constant.ts
+++ b/src/renderer/src/config/constant.ts
@@ -33,3 +33,6 @@ export const THEME_COLOR_PRESETS = [
'#0EA5E9', // Sky Blue
'#0284C7' // Light Blue
]
+
+export const MAX_CONTEXT_COUNT = 100
+export const UNLIMITED_CONTEXT_COUNT = 100000
diff --git a/src/renderer/src/pages/home/Inputbar/TokenCount.tsx b/src/renderer/src/pages/home/Inputbar/TokenCount.tsx
index bad0729b8e..5c91ab9841 100644
--- a/src/renderer/src/pages/home/Inputbar/TokenCount.tsx
+++ b/src/renderer/src/pages/home/Inputbar/TokenCount.tsx
@@ -1,5 +1,6 @@
import { ArrowUpOutlined, MenuOutlined } from '@ant-design/icons'
import { HStack, VStack } from '@renderer/components/Layout'
+import MaxContextCount from '@renderer/components/MaxContextCount'
import { useSettings } from '@renderer/hooks/useSettings'
import { Divider, Popover } from 'antd'
import { FC } from 'react'
@@ -21,17 +22,17 @@ const TokenCount: FC = ({ estimateTokenCount, inputTokenCount, contextCou
return null
}
- const formatMaxCount = (max: number) => {
- return max.toString()
- }
-
const PopoverContent = () => {
return (
{t('chat.input.context_count.tip')}
- {contextCount.current} / {contextCount.max}
+
+ {contextCount.current}
+ /
+
+
@@ -46,10 +47,20 @@ const TokenCount: FC = ({ estimateTokenCount, inputTokenCount, contextCou
return (
- {contextCount.current} / {formatMaxCount(contextCount.max)}
-
-
- {inputTokenCount} / {estimateTokenCount}
+
+
+ {contextCount.current}
+ /
+
+
+
+
+
+ {inputTokenCount}
+ /
+ {estimateTokenCount}
+
+
)
@@ -80,4 +91,9 @@ const Text = styled.div`
color: var(--color-text-1);
`
+const SlashSeparatorSpan = styled.span`
+ margin-left: 2px;
+ margin-right: 2px;
+`
+
export default TokenCount
diff --git a/src/renderer/src/pages/settings/AssistantSettings/AssistantModelSettings.tsx b/src/renderer/src/pages/settings/AssistantSettings/AssistantModelSettings.tsx
index 7017b02890..0efdaa1aa5 100644
--- a/src/renderer/src/pages/settings/AssistantSettings/AssistantModelSettings.tsx
+++ b/src/renderer/src/pages/settings/AssistantSettings/AssistantModelSettings.tsx
@@ -4,7 +4,7 @@ import EditableNumber from '@renderer/components/EditableNumber'
import { HStack } from '@renderer/components/Layout'
import SelectModelPopup from '@renderer/components/Popups/SelectModelPopup'
import Selector from '@renderer/components/Selector'
-import { DEFAULT_CONTEXTCOUNT, DEFAULT_TEMPERATURE } from '@renderer/config/constant'
+import { DEFAULT_CONTEXTCOUNT, DEFAULT_TEMPERATURE, MAX_CONTEXT_COUNT } from '@renderer/config/constant'
import { SettingRow } from '@renderer/pages/settings'
import { Assistant, AssistantSettingCustomParameters, AssistantSettings } from '@renderer/types'
import { modalConfirm } from '@renderer/utils'
@@ -312,7 +312,7 @@ const AssistantModelSettings: FC = ({ assistant, updateAssistant, updateA
= ({ assistant, updateAssistant, updateA
}
return {
- contextCount: contextCount === 100 ? 100000 : contextCount,
+ contextCount: contextCount === MAX_CONTEXT_COUNT ? UNLIMITED_CONTEXT_COUNT : contextCount,
temperature: assistant?.settings?.temperature ?? DEFAULT_TEMPERATURE,
topP: assistant?.settings?.topP ?? 1,
enableMaxTokens: assistant?.settings?.enableMaxTokens ?? false,
diff --git a/src/renderer/src/services/MessagesService.ts b/src/renderer/src/services/MessagesService.ts
index 72050d2e76..615103a11d 100644
--- a/src/renderer/src/services/MessagesService.ts
+++ b/src/renderer/src/services/MessagesService.ts
@@ -1,5 +1,5 @@
import SearchPopup from '@renderer/components/Popups/SearchPopup'
-import { DEFAULT_CONTEXTCOUNT } from '@renderer/config/constant'
+import { DEFAULT_CONTEXTCOUNT, MAX_CONTEXT_COUNT, UNLIMITED_CONTEXT_COUNT } from '@renderer/config/constant'
import { getTopicById } from '@renderer/hooks/useTopic'
import i18n from '@renderer/i18n'
import { fetchMessagesSummary } from '@renderer/services/ApiService'
@@ -41,7 +41,7 @@ export {
export function getContextCount(assistant: Assistant, messages: Message[]) {
const rawContextCount = assistant?.settings?.contextCount ?? DEFAULT_CONTEXTCOUNT
- const maxContextCount = rawContextCount === 100 ? 100000 : rawContextCount
+ const maxContextCount = rawContextCount === MAX_CONTEXT_COUNT ? UNLIMITED_CONTEXT_COUNT : rawContextCount
const _messages = takeRight(messages, maxContextCount)