import React, { useState } from 'react'; import { Button, Card, Spin } from 'antd'; import type { ChatItem, Feedbacktype, ThoughtItem, VisionFile } from '../../types/dify_chat'; import { CHAT_CONFIG } from '../../config/chat'; import Markdown from './markdown'; import ThoughtProcess from './thought-process'; import { Dayjs } from 'dayjs'; import '../../styles/components/chat-with-llm/chat-message.css'; 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 { id, content, isAnswer, agent_thoughts, message_files, isOpeningStatement, suggestedQuestions, more } = 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 (