From 3909c3c0e4969e3d9275502ac3a2b7ee27f20811 Mon Sep 17 00:00:00 2001 From: karl Date: Fri, 16 May 2025 16:50:10 +0800 Subject: [PATCH 01/11] fix: mcp params error(issues/6050) (#6058) --- src/renderer/src/utils/mcp-tools.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/renderer/src/utils/mcp-tools.ts b/src/renderer/src/utils/mcp-tools.ts index 4c446ffa78..8bdc499135 100644 --- a/src/renderer/src/utils/mcp-tools.ts +++ b/src/renderer/src/utils/mcp-tools.ts @@ -412,6 +412,7 @@ export function upsertMCPToolResponse( const cur = { ...results[index], response: resp.response, + arguments: resp.arguments, status: resp.status } results[index] = cur From de2ca774e742e288a02a684c171c477d07fb1f3f Mon Sep 17 00:00:00 2001 From: SuiYunsy <104718844+SuiYunsy@users.noreply.github.com> Date: Fri, 16 May 2025 19:23:43 +0800 Subject: [PATCH 02/11] =?UTF-8?q?fix:=20=E7=A6=81=E6=AD=A2=E2=80=9C?= =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89CSS=E2=80=9D=E8=BE=93=E5=85=A5?= =?UTF-8?q?=E6=A1=86=E7=9A=84=E6=8B=BC=E5=86=99=E6=A3=80=E6=9F=A5=20(#6064?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pages/settings/DisplaySettings/DisplaySettings.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/renderer/src/pages/settings/DisplaySettings/DisplaySettings.tsx b/src/renderer/src/pages/settings/DisplaySettings/DisplaySettings.tsx index ad93b8fa38..d58cf0c01a 100644 --- a/src/renderer/src/pages/settings/DisplaySettings/DisplaySettings.tsx +++ b/src/renderer/src/pages/settings/DisplaySettings/DisplaySettings.tsx @@ -237,6 +237,7 @@ const DisplaySettings: FC = () => { minHeight: 200, fontFamily: 'monospace' }} + spellCheck={false} /> From 451dcd0e4c59d2966faccc8b779f3cd17907355a Mon Sep 17 00:00:00 2001 From: SuYao Date: Fri, 16 May 2025 20:42:59 +0800 Subject: [PATCH 03/11] hotfix: openai websearch render and gemini think (#6055) --- src/renderer/src/providers/AiProvider/GeminiProvider.ts | 6 ++++-- .../src/providers/AiProvider/OpenAIResponseProvider.ts | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/renderer/src/providers/AiProvider/GeminiProvider.ts b/src/renderer/src/providers/AiProvider/GeminiProvider.ts index 46ea431f6f..222abeaaf1 100644 --- a/src/renderer/src/providers/AiProvider/GeminiProvider.ts +++ b/src/renderer/src/providers/AiProvider/GeminiProvider.ts @@ -287,7 +287,8 @@ export default class GeminiProvider extends BaseProvider { if (reasoningEffort === undefined) { return { thinkingConfig: { - includeThoughts: false + includeThoughts: false, + thinkingBudget: 0 } as ThinkingConfig } } @@ -921,7 +922,8 @@ export default class GeminiProvider extends BaseProvider { config = { ...config, thinkingConfig: { - includeThoughts: false + includeThoughts: false, + thinkingBudget: 0 } as ThinkingConfig } } diff --git a/src/renderer/src/providers/AiProvider/OpenAIResponseProvider.ts b/src/renderer/src/providers/AiProvider/OpenAIResponseProvider.ts index baacc96c44..9e163c39c6 100644 --- a/src/renderer/src/providers/AiProvider/OpenAIResponseProvider.ts +++ b/src/renderer/src/providers/AiProvider/OpenAIResponseProvider.ts @@ -593,7 +593,7 @@ export abstract class BaseOpenAIProvider extends BaseProvider { onChunk({ type: ChunkType.LLM_WEB_SEARCH_COMPLETE, llm_web_search: { - source: WebSearchSource.OPENAI, + source: WebSearchSource.OPENAI_RESPONSE, results: chunk.part.annotations } }) From 35e27944f73f11540b6872b9a3e5acd056bfcf7d Mon Sep 17 00:00:00 2001 From: MyPrototypeWhat <43230886+MyPrototypeWhat@users.noreply.github.com> Date: Fri, 16 May 2025 21:56:40 +0800 Subject: [PATCH 04/11] Hotfix/thinking time render (#6073) refactor: simplify ThinkingBlock component and extract thinking time logic * Removed unnecessary state and interval management from ThinkingBlock. * Introduced ThinkingTimeSeconds component to handle thinking time display and logic. * Cleaned up code for better readability and maintainability. --- .../home/Messages/Blocks/ThinkingBlock.tsx | 65 +++++++++++-------- src/renderer/src/store/thunk/messageThunk.ts | 1 - 2 files changed, 37 insertions(+), 29 deletions(-) diff --git a/src/renderer/src/pages/home/Messages/Blocks/ThinkingBlock.tsx b/src/renderer/src/pages/home/Messages/Blocks/ThinkingBlock.tsx index 212ee53ee9..476c67e57e 100644 --- a/src/renderer/src/pages/home/Messages/Blocks/ThinkingBlock.tsx +++ b/src/renderer/src/pages/home/Messages/Blocks/ThinkingBlock.tsx @@ -5,7 +5,7 @@ import { lightbulbVariants } from '@renderer/utils/motionVariants' import { Collapse, message as antdMessage, Tooltip } from 'antd' import { Lightbulb } from 'lucide-react' import { motion } from 'motion/react' -import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react' +import { memo, useCallback, useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' @@ -20,8 +20,6 @@ const ThinkingBlock: React.FC = ({ block }) => { const { t } = useTranslation() const { messageFont, fontSize, thoughtAutoCollapse } = useSettings() const [activeKey, setActiveKey] = useState<'thought' | ''>(thoughtAutoCollapse ? '' : 'thought') - const [thinkingTime, setThinkingTime] = useState(block.thinking_millsec || 0) - const intervalId = useRef(null) const isThinking = useMemo(() => block.status === MessageBlockStatus.STREAMING, [block.status]) @@ -55,28 +53,6 @@ const ThinkingBlock: React.FC = ({ block }) => { } }, [block.content, t]) - // FIXME: 这里统计的和请求处统计的有一定误差 - useEffect(() => { - if (isThinking) { - intervalId.current = setInterval(() => { - setThinkingTime((prev) => prev + 100) - }, 100) - } else if (intervalId.current) { - // 立即清除计时器 - clearInterval(intervalId.current) - intervalId.current = null - } - - return () => { - if (intervalId.current) { - clearInterval(intervalId.current) - intervalId.current = null - } - } - }, [isThinking]) - - const thinkingTimeSeconds = useMemo(() => (thinkingTime / 1000).toFixed(1), [thinkingTime]) - if (!block.content) { return null } @@ -101,9 +77,7 @@ const ThinkingBlock: React.FC = ({ block }) => { - {t(isThinking ? 'chat.thinking' : 'chat.deeply_thought', { - seconds: thinkingTimeSeconds - })} + {/* {isThinking && } */} {!isThinking && ( @@ -134,6 +108,41 @@ const ThinkingBlock: React.FC = ({ block }) => { ) } +const ThinkingTimeSeconds = memo( + ({ blockThinkingTime, isThinking }: { blockThinkingTime?: number; isThinking: boolean }) => { + const { t } = useTranslation() + + const [thinkingTime, setThinkingTime] = useState(blockThinkingTime || 0) + + // FIXME: 这里统计的和请求处统计的有一定误差 + useEffect(() => { + let timer: NodeJS.Timeout | null = null + if (isThinking) { + timer = setInterval(() => { + setThinkingTime((prev) => prev + 100) + }, 100) + } else if (timer) { + // 立即清除计时器 + clearInterval(timer) + timer = null + } + + return () => { + if (timer) { + clearInterval(timer) + timer = null + } + } + }, [isThinking]) + + const thinkingTimeSeconds = useMemo(() => (thinkingTime / 1000).toFixed(1), [thinkingTime]) + + return t(isThinking ? 'chat.thinking' : 'chat.deeply_thought', { + seconds: thinkingTimeSeconds + }) + } +) + const CollapseContainer = styled(Collapse)` margin-bottom: 15px; ` diff --git a/src/renderer/src/store/thunk/messageThunk.ts b/src/renderer/src/store/thunk/messageThunk.ts index 86707a938c..fd3a88d5b9 100644 --- a/src/renderer/src/store/thunk/messageThunk.ts +++ b/src/renderer/src/store/thunk/messageThunk.ts @@ -734,7 +734,6 @@ export const loadTopicMessagesThunk = try { const topic = await db.topics.get(topicId) - if (!topic) { await db.topics.add({ id: topicId, messages: [] }) } From 04cbeab1d9f6ef52d40b361cd1dfbadc4cef3559 Mon Sep 17 00:00:00 2001 From: SuYao Date: Fri, 16 May 2025 22:21:05 +0800 Subject: [PATCH 05/11] fix: Update the state of the last message block as a fallback (#6076) --- .../src/providers/AiProvider/OpenAIProvider.ts | 13 ++++++++++--- src/renderer/src/store/thunk/messageThunk.ts | 8 ++++++++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/renderer/src/providers/AiProvider/OpenAIProvider.ts b/src/renderer/src/providers/AiProvider/OpenAIProvider.ts index f9f78cebe4..597f85f5fc 100644 --- a/src/renderer/src/providers/AiProvider/OpenAIProvider.ts +++ b/src/renderer/src/providers/AiProvider/OpenAIProvider.ts @@ -718,9 +718,17 @@ export default class OpenAIProvider extends BaseOpenAIProvider { const usage = chunk.usage const originalFinishDelta = chunk.delta const originalFinishRawChunk = chunk.chunk - if (!isEmpty(finishReason)) { - onChunk({ type: ChunkType.TEXT_COMPLETE, text: content }) + if (content) { + onChunk({ type: ChunkType.TEXT_COMPLETE, text: content }) + } + if (thinkingContent) { + onChunk({ + type: ChunkType.THINKING_COMPLETE, + text: thinkingContent, + thinking_millsec: new Date().getTime() - time_first_token_millsec + }) + } if (usage) { finalUsage.completion_tokens += usage.completion_tokens || 0 finalUsage.prompt_tokens += usage.prompt_tokens || 0 @@ -812,7 +820,6 @@ export default class OpenAIProvider extends BaseOpenAIProvider { if (toolResults.length) { await processToolResults(toolResults, idx) } - onChunk({ type: ChunkType.BLOCK_COMPLETE, response: { diff --git a/src/renderer/src/store/thunk/messageThunk.ts b/src/renderer/src/store/thunk/messageThunk.ts index fd3a88d5b9..c2c51b25e4 100644 --- a/src/renderer/src/store/thunk/messageThunk.ts +++ b/src/renderer/src/store/thunk/messageThunk.ts @@ -622,6 +622,14 @@ const fetchAndProcessAssistantResponseImpl = async ( const contextForUsage = userMsgIndex !== -1 ? orderedMsgs.slice(0, userMsgIndex + 1) : [] const finalContextWithAssistant = [...contextForUsage, finalAssistantMsg] + if (lastBlockId) { + const changes: Partial = { + status: MessageBlockStatus.SUCCESS + } + dispatch(updateOneBlock({ id: lastBlockId, changes })) + saveUpdatedBlockToDB(lastBlockId, assistantMsgId, topicId, getState) + } + // 更新topic的name autoRenameTopic(assistant, topicId) From 119125038db88e23940ac165721ea1c6756fc825 Mon Sep 17 00:00:00 2001 From: SuYao Date: Sat, 17 May 2025 00:45:26 +0800 Subject: [PATCH 06/11] Hotfix/gemini openrouter (#6080) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit feat: 添加对openai兼容情况下Gemini模型的思考配置支持 --- .../providers/AiProvider/OpenAIProvider.ts | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/renderer/src/providers/AiProvider/OpenAIProvider.ts b/src/renderer/src/providers/AiProvider/OpenAIProvider.ts index 597f85f5fc..a7bed185d5 100644 --- a/src/renderer/src/providers/AiProvider/OpenAIProvider.ts +++ b/src/renderer/src/providers/AiProvider/OpenAIProvider.ts @@ -10,6 +10,7 @@ import { isSupportedReasoningEffortModel, isSupportedReasoningEffortOpenAIModel, isSupportedThinkingTokenClaudeModel, + isSupportedThinkingTokenGeminiModel, isSupportedThinkingTokenModel, isSupportedThinkingTokenQwenModel, isVisionModel, @@ -258,6 +259,19 @@ export default class OpenAIProvider extends BaseOpenAIProvider { return { thinking: { type: 'disabled' } } } + if (isSupportedThinkingTokenGeminiModel(model)) { + // openrouter没有提供一个不推理的选项,先隐藏 + if (this.provider.id === 'openrouter') { + return { reasoning: { maxTokens: 0, exclude: true } } + } + return { + thinkingConfig: { + includeThoughts: false, + thinkingBudget: 0 + } + } + } + return {} } const effortRatio = EFFORT_RATIO[reasoningEffort] @@ -313,6 +327,16 @@ export default class OpenAIProvider extends BaseOpenAIProvider { } } + // Gemini models + if (isSupportedThinkingTokenGeminiModel(model)) { + return { + thinkingConfig: { + thinkingBudget: budgetTokens, + includeThoughts: true + } + } + } + // Default case: no special thinking settings return {} } From 29b917772c6a14e3e868ec45bb3033e42dd8fe3d Mon Sep 17 00:00:00 2001 From: kangfenmao Date: Fri, 16 May 2025 14:36:40 +0800 Subject: [PATCH 07/11] refactor: remove deprecated max token settings from OpenAIProvider and OpenAIResponseProvider --- src/renderer/src/providers/AiProvider/OpenAIProvider.ts | 2 -- .../src/providers/AiProvider/OpenAIResponseProvider.ts | 8 +------- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/src/renderer/src/providers/AiProvider/OpenAIProvider.ts b/src/renderer/src/providers/AiProvider/OpenAIProvider.ts index a7bed185d5..545c92ed3e 100644 --- a/src/renderer/src/providers/AiProvider/OpenAIProvider.ts +++ b/src/renderer/src/providers/AiProvider/OpenAIProvider.ts @@ -1139,8 +1139,6 @@ export default class OpenAIProvider extends BaseOpenAIProvider { const body = { model: model.id, messages: [{ role: 'user', content: 'hi' }], - max_completion_tokens: 1, // openAI - max_tokens: 1, // openAI deprecated 但大部分OpenAI兼容的提供商继续用这个头 enable_thinking: false, // qwen3 stream } diff --git a/src/renderer/src/providers/AiProvider/OpenAIResponseProvider.ts b/src/renderer/src/providers/AiProvider/OpenAIResponseProvider.ts index 9e163c39c6..af66a835bc 100644 --- a/src/renderer/src/providers/AiProvider/OpenAIResponseProvider.ts +++ b/src/renderer/src/providers/AiProvider/OpenAIResponseProvider.ts @@ -907,24 +907,18 @@ export abstract class BaseOpenAIProvider extends BaseProvider { const response = await this.sdk.responses.create({ model: model.id, input: [{ role: 'user', content: 'hi' }], - max_output_tokens: 1, stream: true }) - let hasContent = false for await (const chunk of response) { if (chunk.type === 'response.output_text.delta') { - hasContent = true + return { valid: true, error: null } } } - if (hasContent) { - return { valid: true, error: null } - } throw new Error('Empty streaming response') } else { const response = await this.sdk.responses.create({ model: model.id, input: [{ role: 'user', content: 'hi' }], - max_output_tokens: 1, stream: false }) if (!response.output_text) { From 6e13ad4b2df7cd6ed968a8f1fd68b8ebcec58fdc Mon Sep 17 00:00:00 2001 From: kangfenmao Date: Fri, 16 May 2025 14:46:22 +0800 Subject: [PATCH 08/11] fix: adjust visibility timer and trigger area dimensions in ChatNavigation * Reduced the button visibility timer from 1500ms to 500ms for quicker feedback. * Decreased the trigger width from 80 to 60 for improved interaction. * Updated the height calculation from 40% to 30% of the window height for better layout consistency. --- src/renderer/src/pages/home/Messages/ChatNavigation.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/renderer/src/pages/home/Messages/ChatNavigation.tsx b/src/renderer/src/pages/home/Messages/ChatNavigation.tsx index b0f1c834e5..24c26529ac 100644 --- a/src/renderer/src/pages/home/Messages/ChatNavigation.tsx +++ b/src/renderer/src/pages/home/Messages/ChatNavigation.tsx @@ -73,7 +73,7 @@ const ChatNavigation: FC = ({ containerId }) => { // Set a timer to hide the buttons const timer = setTimeout(() => { setIsVisible(false) - }, 1500) + }, 500) setHideTimer(timer) }, []) @@ -256,7 +256,7 @@ const ChatNavigation: FC = ({ containerId }) => { lastMoveTime.current = now // Calculate if the mouse is in the trigger area - const triggerWidth = 80 // Same as the width in styled component + const triggerWidth = 60 // Same as the width in styled component // Safe way to calculate position when using calc expressions let rightOffset = 16 // Default right offset @@ -267,7 +267,7 @@ const ChatNavigation: FC = ({ containerId }) => { const rightPosition = window.innerWidth - rightOffset - triggerWidth const topPosition = window.innerHeight * 0.3 // 30% from top - const height = window.innerHeight * 0.4 // 40% of window height + const height = window.innerHeight * 0.3 // 30% of window height const isInTriggerArea = e.clientX > rightPosition && From feb256070d33f543ec74c2c6d825398a4bf74519 Mon Sep 17 00:00:00 2001 From: SuiYunsy <104718844+SuiYunsy@users.noreply.github.com> Date: Fri, 16 May 2025 23:40:22 +0800 Subject: [PATCH 09/11] =?UTF-8?q?=E6=8B=93=E5=AE=BD=E2=80=9D=E8=AF=B7?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E8=A6=81=E6=A3=80=E6=B5=8B=E7=9A=84=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E2=80=9C=E6=A8=A1=E6=80=81=E6=A1=86=20(#6062)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 许多模型名称很长,目前模态框太短,无法完全显示 --- .../settings/ProviderSettings/SelectProviderModelPopup.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/src/pages/settings/ProviderSettings/SelectProviderModelPopup.tsx b/src/renderer/src/pages/settings/ProviderSettings/SelectProviderModelPopup.tsx index cb7649cd31..9e5a8161b4 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/SelectProviderModelPopup.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/SelectProviderModelPopup.tsx @@ -48,7 +48,7 @@ const PopupContainer: React.FC = ({ provider, resolve, reject }) => { onCancel={onCancel} afterClose={onClose} transitionName="animation-move-down" - width={300} + width={400} centered>