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:
parent
9e9fd37bda
commit
d32a76c087
@ -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,
|
||||||
|
|||||||
@ -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>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user