diff --git a/src/renderer/src/pages/home/Messages/MessageThought.tsx b/src/renderer/src/pages/home/Messages/MessageThought.tsx index e70cc869..37dafff6 100644 --- a/src/renderer/src/pages/home/Messages/MessageThought.tsx +++ b/src/renderer/src/pages/home/Messages/MessageThought.tsx @@ -1,6 +1,6 @@ import { Message } from '@renderer/types' import { Collapse } from 'antd' -import { FC } from 'react' +import { FC, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import ReactMarkdown from 'react-markdown' import BarLoader from 'react-spinners/BarLoader' @@ -11,9 +11,14 @@ interface Props { } const MessageThought: FC = ({ message }) => { + const [activeKey, setActiveKey] = useState<'thought' | ''>('thought') const isThinking = !message.content const { t } = useTranslation() + useEffect(() => { + if (!isThinking) setActiveKey('') + }, [isThinking]) + if (!message.reasoning_content) { return null } @@ -23,6 +28,8 @@ const MessageThought: FC = ({ message }) => { return ( setActiveKey((key) => (key ? '' : 'thought'))} className="message-thought-container" items={[ { diff --git a/src/renderer/src/utils/formats.ts b/src/renderer/src/utils/formats.ts index 6f354bc8..901f5975 100644 --- a/src/renderer/src/utils/formats.ts +++ b/src/renderer/src/utils/formats.ts @@ -82,19 +82,27 @@ export function withGeminiGrounding(message: Message) { } export function withMessageThought(message: Message) { - const content = message.content + if (message.role !== 'assistant') { + return message + } + const content = message.content.trim() const thinkPattern = /(.*?)<\/think>/s const matches = content.match(thinkPattern) - if (matches) { - const reasoning_content = matches[1].trim() - const remainingContent = content.replace(thinkPattern, '').trim() - if (reasoning_content) { - message.reasoning_content = reasoning_content - message.content = remainingContent - return message + if (!matches) { + // 处理未闭合的 think 标签情况 + if (content.startsWith('')) { + message.reasoning_content = content.replace('', '') + message.content = '' } + return message + } + + const reasoning_content = matches[1].trim() + if (reasoning_content) { + message.reasoning_content = reasoning_content + message.content = content.replace(thinkPattern, '').trim() } return message