import { LikeOutlined, LikeFilled, DislikeOutlined, DislikeFilled, CopyOutlined } from '@ant-design/icons'; import { Button, Card, Spin, Tooltip } from 'antd'; import { useState } from 'react'; import type { ChatItem, Feedbacktype } from '~/api/dify-chat'; import '../../styles/components/chat-with-llm/chat-message.css'; import { parseMessageContent } from '../../utils/message-parser'; import Markdown, { SourcesPanel } from './markdown'; import ThinkingBlock from './thinking-block'; import ThoughtProcess from './thought-process'; interface ChatMessageProps { message: ChatItem; onFeedback?: (messageId: string, feedback: Feedbacktype) => void; isResponding?: boolean; onRegenerate?: (messageId: string) => void; } /** * 聊天消息组件 */ export default function ChatMessage({ message, onFeedback, isResponding = false, onRegenerate }: ChatMessageProps) { const [feedback, setFeedback] = useState<'like' | 'dislike' | null>( message.feedback?.rating || null ); const [copied, setCopied] = useState(false); /** * 处理复制 */ const handleCopy = async () => { try { await navigator.clipboard.writeText(content); setCopied(true); setTimeout(() => setCopied(false), 2000); } catch (err) { console.error('复制失败:', err); } }; const { id, content, isAnswer, agent_thoughts, message_files, isOpeningStatement, suggestedQuestions, more, retriever_resources } = message; const isAgentMode = !!agent_thoughts && agent_thoughts.length > 0; /** * 处理反馈 */ const handleFeedback = async (type: 'like' | 'dislike') => { if (!id || id.startsWith('placeholder-') || id.startsWith('question-') || id.startsWith('opening-')) return; // 如果已经选择了相同的反馈,则取消选择 const newFeedback = feedback === type ? null : type; setFeedback(newFeedback); await onFeedback?.(id, { rating: newFeedback, }); }; /** * 渲染AI回答内容 */ const renderAnswerContent = () => { // console.log('🎨 渲染AI回答内容:', { content, isResponding, isAgentMode }); // 如果正在响应且没有内容 if (isResponding && (isAgentMode ? (!content && (agent_thoughts || []).filter(item => !!item.thought || !!item.tool).length === 0) : !content)) { return (