import React from 'react'; import { Typography, MarkdownRender, } from '@douyinfe/semi-ui'; import { ChevronRight, ChevronUp, Brain, Loader2, } from 'lucide-react'; import { useTranslation } from 'react-i18next'; const MessageContent = ({ message, className, styleState, onToggleReasoningExpansion }) => { const { t } = useTranslation(); if (message.status === 'error') { return (
{message.content || t('请求发生错误')}
); } const isThinkingStatus = message.status === 'loading' || message.status === 'incomplete'; let currentExtractedThinkingContent = null; let currentDisplayableFinalContent = message.content || ""; let thinkingSource = null; if (message.role === 'assistant') { let baseContentForDisplay = message.content || ""; let combinedThinkingContent = ""; if (message.reasoningContent) { combinedThinkingContent = message.reasoningContent; thinkingSource = 'reasoningContent'; } if (baseContentForDisplay.includes('')) { const thinkTagRegex = /([\s\S]*?)<\/think>/g; let match; let thoughtsFromPairedTags = []; let replyParts = []; let lastIndex = 0; while ((match = thinkTagRegex.exec(baseContentForDisplay)) !== null) { replyParts.push(baseContentForDisplay.substring(lastIndex, match.index)); thoughtsFromPairedTags.push(match[1]); lastIndex = match.index + match[0].length; } replyParts.push(baseContentForDisplay.substring(lastIndex)); if (thoughtsFromPairedTags.length > 0) { const pairedThoughtsStr = thoughtsFromPairedTags.join('\n\n---\n\n'); if (combinedThinkingContent) { combinedThinkingContent += '\n\n---\n\n' + pairedThoughtsStr; } else { combinedThinkingContent = pairedThoughtsStr; } thinkingSource = thinkingSource ? thinkingSource + ' & tags' : ' tags'; } baseContentForDisplay = replyParts.join(''); } if (isThinkingStatus) { const lastOpenThinkIndex = baseContentForDisplay.lastIndexOf(''); if (lastOpenThinkIndex !== -1) { const fragmentAfterLastOpen = baseContentForDisplay.substring(lastOpenThinkIndex); if (!fragmentAfterLastOpen.includes('')) { const unclosedThought = fragmentAfterLastOpen.substring(''.length).trim(); if (unclosedThought) { if (combinedThinkingContent) { combinedThinkingContent += '\n\n---\n\n' + unclosedThought; } else { combinedThinkingContent = unclosedThought; } thinkingSource = thinkingSource ? thinkingSource + ' + streaming ' : 'streaming '; } baseContentForDisplay = baseContentForDisplay.substring(0, lastOpenThinkIndex); } } } currentExtractedThinkingContent = combinedThinkingContent || null; currentDisplayableFinalContent = baseContentForDisplay.replace(/<\/?think>/g, '').trim(); } const headerText = isThinkingStatus ? t('思考中...') : t('思考过程'); const finalExtractedThinkingContent = currentExtractedThinkingContent; const finalDisplayableFinalContent = currentDisplayableFinalContent; if (message.role === 'assistant' && isThinkingStatus && !finalExtractedThinkingContent && (!finalDisplayableFinalContent || finalDisplayableFinalContent.trim() === '')) { return (
{t('正在思考...')} AI 正在分析您的问题
); } return (
{/* 渲染推理内容 */} {message.role === 'assistant' && finalExtractedThinkingContent && (
onToggleReasoningExpansion(message.id)} >
{headerText} {thinkingSource && ( 来源: {thinkingSource} )}
{isThinkingStatus && (
思考中
)} {!isThinkingStatus && (
{message.isReasoningExpanded ? : }
)}
{message.isReasoningExpanded && (
)}
)} {/* 渲染消息内容 */} {(() => { // 处理多模态内容(文本+图片) if (Array.isArray(message.content)) { const textContent = message.content.find(item => item.type === 'text'); const imageContents = message.content.filter(item => item.type === 'image_url'); return (
{/* 显示图片 */} {imageContents.length > 0 && (
{imageContents.map((imgItem, index) => (
{`用户上传的图片 { e.target.style.display = 'none'; e.target.nextSibling.style.display = 'block'; }} />
图片加载失败: {imgItem.image_url.url}
))}
)} {/* 显示文本内容 */} {textContent && textContent.text && textContent.text.trim() !== '' && (
)}
); } // 处理纯文本内容或助手回复 if (typeof message.content === 'string') { if (message.role === 'assistant') { // 助手回复使用处理后的内容 if (finalDisplayableFinalContent && finalDisplayableFinalContent.trim() !== '') { return (
); } } else { // 用户文本消息 return (
); } } return null; })()}
); }; export default MessageContent;