refactor: improve message rendering and add reasoning content extraction

- Refactored `getMessageBackground` function for better readability.
- Updated `MessageContent` component to use a new `withMessageThought` utility for extracting reasoning content from messages.
- Changed fragment usage to `Fragment` for consistency in JSX.
- Enhanced message handling by separating reasoning content from the main message content.
This commit is contained in:
kangfenmao 2025-01-22 09:50:29 +08:00
parent 9e9fd37bda
commit d32a76c087
3 changed files with 37 additions and 9 deletions

View File

@ -31,8 +31,13 @@ interface Props {
onDeleteMessage?: (message: Message) => Promise<void> onDeleteMessage?: (message: Message) => Promise<void>
} }
const getMessageBackground = (isBubbleStyle: boolean, isAssistantMessage: boolean) => const getMessageBackground = (isBubbleStyle: boolean, isAssistantMessage: boolean) => {
isBubbleStyle ? (isAssistantMessage ? 'var(--chat-background-assistant)' : 'var(--chat-background-user)') : undefined return isBubbleStyle
? isAssistantMessage
? 'var(--chat-background-assistant)'
: 'var(--chat-background-user)'
: undefined
}
const MessageItem: FC<Props> = ({ const MessageItem: FC<Props> = ({
message: _message, message: _message,

View File

@ -1,8 +1,9 @@
import { SyncOutlined, TranslationOutlined } from '@ant-design/icons' import { SyncOutlined, TranslationOutlined } from '@ant-design/icons'
import { Message, Model } from '@renderer/types' import { Message, Model } from '@renderer/types'
import { getBriefInfo } from '@renderer/utils' import { getBriefInfo } from '@renderer/utils'
import { withMessageThought } from '@renderer/utils/formats'
import { Divider, Flex } from 'antd' import { Divider, Flex } from 'antd'
import React from 'react' import React, { Fragment } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import BeatLoader from 'react-spinners/BeatLoader' import BeatLoader from 'react-spinners/BeatLoader'
import styled from 'styled-components' import styled from 'styled-components'
@ -13,11 +14,14 @@ import MessageError from './MessageError'
import MessageSearchResults from './MessageSearchResults' import MessageSearchResults from './MessageSearchResults'
import MessageThought from './MessageThought' import MessageThought from './MessageThought'
const MessageContent: React.FC<{ interface Props {
message: Message message: Message
model?: Model model?: Model
}> = ({ message, model }) => { }
const MessageContent: React.FC<Props> = ({ message: _message, model }) => {
const { t } = useTranslation() const { t } = useTranslation()
const message = withMessageThought(_message)
if (message.status === 'sending') { if (message.status === 'sending') {
return ( return (
@ -37,14 +41,14 @@ const MessageContent: React.FC<{
} }
return ( return (
<> <Fragment>
<Flex gap="8px" wrap style={{ marginBottom: 10 }}> <Flex gap="8px" wrap style={{ marginBottom: 10 }}>
{message.mentions?.map((model) => <MentionTag key={model.id}>{'@' + model.name}</MentionTag>)} {message.mentions?.map((model) => <MentionTag key={model.id}>{'@' + model.name}</MentionTag>)}
</Flex> </Flex>
<MessageThought message={message} /> <MessageThought message={message} />
<Markdown message={message} /> <Markdown message={message} />
{message.translatedContent && ( {message.translatedContent && (
<> <Fragment>
<Divider style={{ margin: 0, marginBottom: 10 }}> <Divider style={{ margin: 0, marginBottom: 10 }}>
<TranslationOutlined /> <TranslationOutlined />
</Divider> </Divider>
@ -53,11 +57,11 @@ const MessageContent: React.FC<{
) : ( ) : (
<Markdown message={{ ...message, content: message.translatedContent }} /> <Markdown message={{ ...message, content: message.translatedContent }} />
)} )}
</> </Fragment>
)} )}
<MessageAttachments message={message} /> <MessageAttachments message={message} />
<MessageSearchResults message={message} /> <MessageSearchResults message={message} />
</> </Fragment>
) )
} }

View File

@ -80,3 +80,22 @@ export function withGeminiGrounding(message: Message) {
return content return content
} }
export function withMessageThought(message: Message) {
const content = message.content
const thinkPattern = /<think>(.*?)<\/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
}
}
return message
}