From eee3774e934c1c71f40de8a6c61a909c3e33135e Mon Sep 17 00:00:00 2001 From: zerob13 Date: Fri, 29 Aug 2025 21:12:50 +0800 Subject: [PATCH 1/8] feat: enhance web content length limit setting with counter-style UI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Improve the web content length limit setting in CommonSettings with: - Replace simple input with interactive counter design - Add -/+ buttons for quick adjustments (±100 step) - Enable click-to-edit number for direct input - Update range to 0-10000 characters - Maintain single-row compact layout - Add visual feedback and hover states 🤖 Generated with [Claude Code](https://claude.ai/code) --- .../components/settings/CommonSettings.vue | 79 ++++++++++++++++--- 1 file changed, 67 insertions(+), 12 deletions(-) diff --git a/src/renderer/src/components/settings/CommonSettings.vue b/src/renderer/src/components/settings/CommonSettings.vue index e11a1db9c..4b627051a 100644 --- a/src/renderer/src/components/settings/CommonSettings.vue +++ b/src/renderer/src/components/settings/CommonSettings.vue @@ -61,17 +61,48 @@ {{ t('settings.common.webContentLengthLimitHint') }} -
- +
+ +
+
+ {{ webContentLengthLimit }} +
+ +
+ + 字符
@@ -414,6 +445,8 @@ const showUrlError = ref(false) // 网页内容长度限制 const webContentLengthLimit = ref(3000) +const isEditingLimit = ref(false) +const limitInputRef = ref() // 新增搜索引擎相关 const isAddSearchEngineDialogOpen = ref(false) @@ -688,7 +721,7 @@ const handleLoggingChange = (value: boolean) => { // 处理网页内容长度限制变更 const handleWebContentLengthLimitChange = async (value: string | number) => { const numValue = typeof value === 'string' ? parseInt(value, 10) : value - if ((numValue >= 1 && numValue <= 50000) || numValue === 0) { + if (numValue >= 0 && numValue <= 10000 && !isNaN(numValue)) { try { const displayText = numValue === 0 ? '无限制' : `${numValue}字符` console.log('设置网页内容长度限制:', displayText) @@ -702,6 +735,28 @@ const handleWebContentLengthLimitChange = async (value: string | number) => { } } +// 增加网页内容长度限制 +const increaseWebContentLimit = () => { + const newValue = Math.min(webContentLengthLimit.value + 100, 20000) + handleWebContentLengthLimitChange(newValue) +} + +// 减少网页内容长度限制 +const decreaseWebContentLimit = () => { + const newValue = Math.max(webContentLengthLimit.value - 100, 0) + handleWebContentLengthLimitChange(newValue) +} + +// 开始编辑限制值 +const startEditingLimit = () => { + isEditingLimit.value = true +} + +// 结束编辑限制值 +const stopEditingLimit = () => { + isEditingLimit.value = false +} + const cancelLoggingChange = () => { isLoggingDialogOpen.value = false } From 0f7b2458258dc4f9974de7f02ca31ffc7f02e370 Mon Sep 17 00:00:00 2001 From: zerob13 Date: Fri, 29 Aug 2025 21:45:58 +0800 Subject: [PATCH 2/8] feat: image generate model remove systemprompt and tool use --- src/main/presenter/threadPresenter/index.ts | 23 +++++++--- src/renderer/src/components/ChatConfig.vue | 48 ++++++++++++++++++--- src/renderer/src/components/NewThread.vue | 17 +++++--- src/renderer/src/components/TitleView.vue | 4 +- 4 files changed, 75 insertions(+), 17 deletions(-) diff --git a/src/main/presenter/threadPresenter/index.ts b/src/main/presenter/threadPresenter/index.ts index 7aee5f262..a91eef570 100644 --- a/src/main/presenter/threadPresenter/index.ts +++ b/src/main/presenter/threadPresenter/index.ts @@ -30,6 +30,7 @@ import { UserMessageMentionBlock, UserMessageCodeBlock } from '@shared/chat' +import { ModelType } from '@shared/model' import { approximateTokenSize } from 'tokenx' import { generateSearchPrompt, SearchManager } from './searchManager' import { getFileContext } from './fileContext' @@ -2094,24 +2095,34 @@ export class ThreadPresenter implements IThreadPresenter { userMessage: Message, vision: boolean, imageFiles: MessageFile[], - supportsFunctionCall: boolean + supportsFunctionCall: boolean, + modelType?: ModelType ): Promise<{ finalContent: ChatMessage[] promptTokens: number }> { const { systemPrompt, contextLength, artifacts, enabledMcpTools } = conversation.settings - const searchPrompt = searchResults ? generateSearchPrompt(userContent, searchResults) : '' + // 判断是否为图片生成模型 + const isImageGeneration = modelType === ModelType.ImageGeneration + + // 图片生成模型不使用搜索、系统提示词和MCP工具 + const searchPrompt = + !isImageGeneration && searchResults ? generateSearchPrompt(userContent, searchResults) : '' const enrichedUserMessage = - urlResults.length > 0 + !isImageGeneration && urlResults.length > 0 ? '\n\n' + ContentEnricher.enrichUserMessageWithUrlContent(userContent, urlResults) : '' // 计算token数量 const searchPromptTokens = searchPrompt ? approximateTokenSize(searchPrompt ?? '') : 0 - const systemPromptTokens = systemPrompt ? approximateTokenSize(systemPrompt ?? '') : 0 + const systemPromptTokens = + !isImageGeneration && systemPrompt ? approximateTokenSize(systemPrompt ?? '') : 0 const userMessageTokens = approximateTokenSize(userContent + enrichedUserMessage) - const mcpTools = await presenter.mcpPresenter.getAllToolDefinitions(enabledMcpTools) + // 图片生成模型不使用MCP工具 + const mcpTools = !isImageGeneration + ? await presenter.mcpPresenter.getAllToolDefinitions(enabledMcpTools) + : [] const mcpToolsTokens = mcpTools.reduce( (acc, tool) => acc + approximateTokenSize(JSON.stringify(tool)), 0 @@ -2131,7 +2142,7 @@ export class ThreadPresenter implements IThreadPresenter { // 格式化消息 const formattedMessages = this.formatMessagesForCompletion( selectedContextMessages, - systemPrompt, + isImageGeneration ? '' : systemPrompt, // 图片生成模型不使用系统提示词 artifacts, searchPrompt, userContent, diff --git a/src/renderer/src/components/ChatConfig.vue b/src/renderer/src/components/ChatConfig.vue index 57f702230..3c9fbfa82 100644 --- a/src/renderer/src/components/ChatConfig.vue +++ b/src/renderer/src/components/ChatConfig.vue @@ -1,6 +1,6 @@