import React from 'react'; import { Typography, TextArea, Button, } from '@douyinfe/semi-ui'; import MarkdownRenderer from '../common/MarkdownRenderer'; import { ChevronRight, ChevronUp, Brain, Loader2, Check, X, } from 'lucide-react'; import { useTranslation } from 'react-i18next'; const MessageContent = ({ message, className, styleState, onToggleReasoningExpansion, isEditing = false, onEditSave, onEditCancel, editValue, onEditValueChange }) => { const { t } = useTranslation(); if (message.status === 'error') { let errorText; if (Array.isArray(message.content)) { const textContent = message.content.find(item => item.type === 'text'); errorText = textContent && textContent.text && typeof textContent.text === 'string' ? textContent.text : t('请求发生错误'); } else if (typeof message.content === 'string') { errorText = message.content; } else { errorText = t('请求发生错误'); } return (
{errorText}
); } const isThinkingStatus = message.status === 'loading' || message.status === 'incomplete'; let currentExtractedThinkingContent = null; let currentDisplayableFinalContent = ""; let thinkingSource = null; const getTextContent = (content) => { if (Array.isArray(content)) { const textItem = content.find(item => item.type === 'text'); return textItem && textItem.text && typeof textItem.text === 'string' ? textItem.text : ''; } else if (typeof content === 'string') { return content; } return ''; }; currentDisplayableFinalContent = getTextContent(message.content); if (message.role === 'assistant') { let baseContentForDisplay = getTextContent(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 && !message.isThinkingComplete) ? t('思考中...') : t('思考过程'); const finalExtractedThinkingContent = currentExtractedThinkingContent; const finalDisplayableFinalContent = currentDisplayableFinalContent; if (message.role === 'assistant' && isThinkingStatus && !finalExtractedThinkingContent && (!finalDisplayableFinalContent || finalDisplayableFinalContent.trim() === '')) { return (
{t('正在思考...')} AI 正在分析您的问题
); } return (
{/* 为system角色添加特殊标识 */} {message.role === 'system' && (
S
{t('系统消息')}
)} {/* 渲染推理内容 */} {message.role === 'assistant' && finalExtractedThinkingContent && (
onToggleReasoningExpansion(message.id)} >
{headerText} {thinkingSource && ( 来源: {thinkingSource} )}
{isThinkingStatus && !message.isThinkingComplete && (
思考中
)} {(!isThinkingStatus || message.isThinkingComplete) && (
{message.isReasoningExpanded ? : }
)}
{message.isReasoningExpanded && (
)}
)} {/* 渲染消息内容 */} {isEditing ? ( /* 编辑模式 */