import React, { useState, useRef, useEffect } from 'react'; import { Send, Upload, RotateCcw, Bookmark, History, Sparkles, BookOpen, Brain, GitCompare, MessageSquare, FileText, CheckCircle, AlertCircle, Bot, Database, Layers, Cpu, Target, Search, CircleHelp, ChevronRight, Plus, X, Copy, RefreshCw, ArrowRight, ArrowLeft, Download, Save, ChevronDown, ChevronUp, MessageCircle, Users, FileCheck, AlertTriangle, Handshake, Edit3, ListChecks, Play, Pause, UserCheck, UserX, Hash, Clock, Zap, ClipboardList, TrendingUp, } from 'lucide-react'; import { useTheme } from '../../../contexts/ThemeContext'; import { useChatContext } from '../../../contexts/ChatContext'; import QATypeSwitch from './QATypeSwitch'; type QAMode = 'single-round' | 'multi-round' | 'deep-search'; type QAProvider = 'general' | 'agent' | 'multi-agent'; type ViewMode = 'single' | 'compare'; interface Agent { id: string; name: string; category: string; tags: string[]; description: string; skills: string[]; dataSources: string[]; } interface Message { id: string; role: 'user' | 'assistant'; content: string; timestamp: Date; sources?: SourceItem[]; agentName?: string; skills?: string[]; dataSources?: string[]; functions?: string[]; } interface SourceItem { title: string; type: string; snippet: string; } interface CompareResult { leftMode: QAMode; rightMode: QAMode; leftContent: string; rightContent: string; differences?: { consensus: string; differences: string; leftAdvantage: string; rightAdvantage: string; }; } // 多智能体协同分析相关类型 interface AgentResponse { id: string; agentId: string; agentName: string; agentCategory: string; status: 'pending' | 'responding' | 'completed' | 'adopted' | 'pending-confirm'; coreJudgment: string; content: string; structuredSummary?: { key: string; value: string; }[]; timestamp: Date; } // 多智能体消息类型 interface MultiAgentMessage { id: string; type: 'user' | 'agent'; agentName?: string; content: string; timestamp: Date; isFollowUp?: boolean; parentMessageId?: string; } interface AdoptedView { id: string; agentName: string; content: string; timestamp: Date; } interface PendingQuestion { id: string; content: string; relatedAgents: string[]; timestamp: Date; } interface SummaryDraft { title: string; sections: { title: string; content: string; }[]; } // 场景模板类型 interface SceneTemplate { id: string; name: string; type: string; description: string; agentIds: string[]; } // 场景模板数据 const sceneTemplates: SceneTemplate[] = [ { id: 'scene-1', name: '宣传策略生成', type: '策略生成', description: '生成完整的品牌传播策略方案', agentIds: ['goal-agent', 'audience-agent', 'brand-agent', 'channel-agent', 'content-agent', 'narrative-agent', 'behavior-agent', 'risk-agent'], }, { id: 'scene-2', name: '宣传方案推演', type: '方案推演', description: '对现有方案进行多角度推演验证', agentIds: ['goal-agent', 'audience-agent', 'behavior-agent', 'risk-agent', 'content-agent', 'channel-agent'], }, { id: 'scene-3', name: '宣传活动复盘', type: '效果复盘', description: '对宣传活动效果进行多维度复盘分析', agentIds: ['goal-agent', 'audience-agent', 'behavior-agent', 'channel-agent', 'risk-agent'], }, { id: 'scene-4', name: '舆情应对策略', type: '风险应对', description: '制定舆情风险应对和处置策略', agentIds: ['risk-agent', 'audience-agent', 'brand-agent', 'content-agent', 'narrative-agent', 'channel-agent', 'behavior-agent'], }, { id: 'scene-5', name: '多版本策略比较', type: '策略对比', description: '对比分析多个策略方案的优劣', agentIds: ['goal-agent', 'audience-agent', 'brand-agent', 'content-agent'], }, ]; // 智能体列表 - 按五大类别分类 const agents: Agent[] = [ // 规划类智能体 { id: 'goal-agent', name: 'GoalAgent', category: '规划类', tags: ['目标拆解', 'KPI设定', '优先级'], description: '专业的目标规划智能体,能够帮助拆解任务目标并设定可衡量的KPI', skills: ['目标拆解', 'KPI设定', '优先级排序'], dataSources: ['知识库', '历史数据分析'], }, { id: 'brand-agent', name: 'BrandAgent', category: '规划类', tags: ['品牌定位', '传播策略', '调性设计'], description: '专注品牌建设与传播策略的规划智能体', skills: ['品牌定位分析', '传播路径规划', '品牌调性设计'], dataSources: ['知识库', '行业数据库'], }, { id: 'content-agent', name: 'ContentAgent', category: '规划类', tags: ['文案撰写', '创意生成', '内容规划'], description: '智能内容创作规划助手,支持多种形式的内容生成规划', skills: ['文案撰写', '创意生成', '多形式内容'], dataSources: ['知识库', '优秀案例库'], }, { id: 'channel-agent', name: 'ChannelAgent', category: '规划类', tags: ['渠道选择', '投放策略', '媒介规划'], description: '专业的渠道规划智能体,制定最优渠道组合策略', skills: ['渠道选择', '投放策略规划', '效果评估'], dataSources: ['Y系统', 'A系统', '行业数据'], }, { id: 'narrative-agent', name: 'NarrativeAgent', category: '规划类', tags: ['故事线', '情感设计', '叙事策略'], description: '专业的叙事规划智能体,构建有感染力的内容故事线', skills: ['故事线设计', '情感共鸣设计', '内容叙事'], dataSources: ['优秀案例库', '内容分析'], }, // MNTY类智能体 { id: 'mnty-agent', name: 'MNTYAgent', category: 'MNTY类', tags: ['心智模型', '用户认知', '心智定位'], description: '专注用户心智模型分析,挖掘用户深层认知和心智定位', skills: ['心智模型构建', '认知路径分析', '心智定位设计'], dataSources: ['用户研究数据', '心理学理论库'], }, // 效果PG类智能体 { id: 'behavior-agent', name: 'BehaviorAgent', category: '效果PG类', tags: ['用户行为', '行为路径', '效果预测'], description: '专注用户行为模式分析,预测和优化用户行为效果', skills: ['用户行为分析', '行为路径设计', '转化优化'], dataSources: ['Y系统', '行为数据'], }, { id: 'pg-agent', name: 'PGAgent', category: '效果PG类', tags: ['效果评估', 'PG分析', '数据洞察'], description: '专业的效果评估智能体,提供精准的数据分析和洞察', skills: ['效果评估', '数据可视化', '趋势预测'], dataSources: ['数据分析平台', '监控系统'], }, // 知识分析类智能体 { id: 'audience-agent', name: 'AudienceAgent', category: '知识分析类', tags: ['受众分层', '画像抽取', '知识分析'], description: '专业的受众知识分析智能体,识别目标受众特征并生成画像', skills: ['受众分层', '核心受众识别', '画像抽取'], dataSources: ['知识库', 'Y系统', 'A系统'], }, { id: 'knowledge-agent', name: 'KnowledgeAgent', category: '知识分析类', tags: ['知识图谱', '语义分析', '关联挖掘'], description: '专业的知识分析智能体,构建知识图谱并进行深度语义分析', skills: ['知识图谱构建', '语义分析', '关联挖掘'], dataSources: ['知识库', '文献数据库'], }, // 协同管理类智能体 { id: 'risk-agent', name: 'RiskAgent', category: '协同管理类', tags: ['风险识别', '预案设计', '协同管理'], description: '专注风险识别与协同管理的智能体,制定完善的应急预案', skills: ['风险识别', '影响评估', '预案设计'], dataSources: ['历史案例', '风险数据库'], }, { id: 'collab-agent', name: 'CollabAgent', category: '协同管理类', tags: ['协同调度', '资源协调', '进度管理'], description: '专业的协同管理智能体,统筹调度多方资源协调推进', skills: ['协同调度', '资源协调', '进度管理'], dataSources: ['任务管理系统', '资源数据库'], }, ]; interface QAProps { initialMode?: 'new' | 'general' | 'agent' | 'multi-agent'; } const QA: React.FC = ({ initialMode }) => { const { theme } = useTheme(); const { addMessage } = useChatContext(); const isDark = theme === 'dark'; // 状态管理 const [viewMode, setViewMode] = useState('single'); const [qaProvider, setQaProvider] = useState('general'); const [qaMode, setQaMode] = useState('single-round'); const [selectedAgent, setSelectedAgent] = useState(agents[0]); const [compareLeftMode, setCompareLeftMode] = useState('single-round'); const [compareRightMode, setCompareRightMode] = useState('deep-search'); // 新建问答确认对话框 const [showNewQADialog, setShowNewQADialog] = useState(false); // 处理 initialMode - 新建问答时清空会话 useEffect(() => { if (initialMode === 'new') { // 新建问答模式:清空会话,保持通用问答模式 setMessages([]); setCompareResult(null); setInputValue(''); setQaProvider('general'); setViewMode('single'); } else if (initialMode === 'agent') { // 智能体问答模式 setQaProvider('agent'); } else if (initialMode === 'general') { // 通用问答模式 setQaProvider('general'); } else if (initialMode === 'multi-agent') { // 多智能体协同模式 setQaProvider('multi-agent'); setMessages([]); setCompareResult(null); setInputValue(''); } }, [initialMode]); // 知识范围 const [knowledgeScope, setKnowledgeScope] = useState<'all' | 'specific-kb' | 'specific-domain'>('all'); // 回答偏好 const [showSources, setShowSources] = useState(true); const [showProcess, setShowProcess] = useState(false); // 对比设置 const [compareLayout, setCompareLayout] = useState<'horizontal' | 'vertical'>('horizontal'); const [autoSummarizeDiff, setAutoSummarizeDiff] = useState(true); const [recommendBetter, setRecommendBetter] = useState(true); // 消息和结果 const [messages, setMessages] = useState([]); const [inputValue, setInputValue] = useState(''); const [isLoading, setIsLoading] = useState(false); const [compareResult, setCompareResult] = useState(null); const [agentSearchQuery, setAgentSearchQuery] = useState(''); // 检索过程展示 const [searchProcess, setSearchProcess] = useState({ currentMode: '单轮RAG', rounds: 1, hits: 5, queryRewrite: '', }); // 多智能体会商状态 const [discussionStatus, setDiscussionStatus] = useState<'idle' | 'in_progress' | 'paused' | 'completed'>('idle'); const [currentRound, setCurrentRound] = useState(1); const [currentTopic, setCurrentTopic] = useState('五四青年节宣传方向讨论'); const [speakingMode, setSpeakingMode] = useState<'broadcast' | 'targeted' | 'response'>('broadcast'); const [selectedTargetAgent, setSelectedTargetAgent] = useState(null); // 共识与分歧 const [consensusItems, setConsensusItems] = useState<{id: string; content: string; agents: string[]}[]>([]); const [disagreementItems, setDisagreementItems] = useState<{id: string; content: string; agents: string[]; details: string}[]>([]); const [conclusionDraft, setConclusionDraft] = useState(''); // 消息操作状态 const [messageAction, setMessageAction] = useState<'none' | 'adopt' | 'disagree' | 'followup' | 'respond'>('none'); const [selectedMessageId, setSelectedMessageId] = useState(null); // 原有状态(保持兼容性) const [selectedMultiAgents, setSelectedMultiAgents] = useState([agents[0], agents[4]]); const [agentResponses, setAgentResponses] = useState([]); const [adoptedViews, setAdoptedViews] = useState([]); const [pendingQuestions, setPendingQuestions] = useState([]); const [summaryDraft, setSummaryDraft] = useState({ title: '多智能体联合分析报告', sections: [], }); const [taskInfo, setTaskInfo] = useState({ name: '五四青年节宣传方向预分析', goal: '形成一版多智能体联合分析报告', status: '讨论中', background: '五四青年节品牌传播活动需要明确目标受众和传播策略', keyQuestions: ['核心受众是谁?', '如何设计参与行为?', '叙事方式如何选择?', '有哪些风险需要关注?'], }); const [sendTarget, setSendTarget] = useState<'all' | string>('all'); const [multiAgentFilter, setMultiAgentFilter] = useState<'all' | 'completed' | 'pending' | 'adopted'>('all'); const [isMultiAgentLoading, setIsMultiAgentLoading] = useState(false); const [multiAgentMessages, setMultiAgentMessages] = useState([]); const [rightPanelTab, setRightPanelTab] = useState<'structured' | 'report'>('structured'); const [messageFilter, setMessageFilter] = useState<'all' | 'user' | 'adopted'>('all'); const [agentMessageFilter, setAgentMessageFilter] = useState('all'); const [messageSort, setMessageSort] = useState<'time' | 'agent'>('time'); // 左侧菜单折叠状态 const [leftPanelCollapsed, setLeftPanelCollapsed] = useState(false); const [qaConfigCollapsed, setQaConfigCollapsed] = useState(false); const [agentListCollapsed, setAgentListCollapsed] = useState(false); // 多智能体协同 - 智能体选择状态 const [showAgentSelector, setShowAgentSelector] = useState(false); const [showSceneSelector, setShowSceneSelector] = useState(false); const [selectedSceneTemplate, setSelectedSceneTemplate] = useState(null); // 过滤智能体 const filteredAgents = agents.filter(agent => agent.name.toLowerCase().includes(agentSearchQuery.toLowerCase()) || agent.category.toLowerCase().includes(agentSearchQuery.toLowerCase()) || agent.tags.some(tag => tag.toLowerCase().includes(agentSearchQuery.toLowerCase())) ); // 多智能体协同分析处理函数 const handleMultiAgentSend = () => { if (!inputValue.trim()) return; setIsMultiAgentLoading(true); const targets = sendTarget === 'all' ? selectedMultiAgents : selectedMultiAgents.filter(a => a.id === sendTarget); // 添加用户消息到消息流 const userMessageId = `user-${Date.now()}`; const userMessage: MultiAgentMessage = { id: userMessageId, type: 'user', content: inputValue, timestamp: new Date(), }; setMultiAgentMessages(prev => [...prev, userMessage]); // 为每个目标智能体创建响应 const newResponses: AgentResponse[] = targets.map((agent, idx) => ({ id: `${Date.now()}-${agent.id}`, agentId: agent.id, agentName: agent.name, agentCategory: agent.category, status: 'responding' as const, coreJudgment: '分析中...', content: '', timestamp: new Date(), })); setAgentResponses(prev => [...prev, ...newResponses]); setInputValue(''); // 模拟智能体响应 setTimeout(() => { const completedResponses = targets.map((agent, idx) => { const responses: Record = { 'audience-agent': { core: '核心受众应优先聚焦18-25岁基层青年群体', content: '从任务背景和活动语境看,核心传播对象应聚焦能够形成参与、表达与扩散的人群,年轻基层群体更符合当前任务目标。该群体活跃于社交媒体,对节日话题有天然共鸣,是实现传播裂变的关键。', summary: [ { key: 'core_audience', value: '18-25岁基层青年' }, { key: 'secondary_audience', value: '25-30岁职场新人' }, { key: 'barriers', value: '表达门槛、品牌距离感' }, ], }, 'goal-agent': { core: '目标应分为参与层和传播层两层设计', content: '建议将五四青年节活动目标拆解为两个层次:参与层目标是引导青年参与活动并产生内容;传播层目标是鼓励青年主动分享传播,形成话题裂变。两层目标相互关联,传播层目标的达成依赖于参与层的体验设计。', summary: [ { key: '参与目标', value: '引导10000+青年参与' }, { key: '传播目标', value: '产生5000+UGC内容' }, { key: '核心KPI', value: '话题阅读量突破500万' }, ], }, 'behavior-agent': { core: '用户行为路径应设计为"触发-参与-分享"三阶段', content: '基于对年轻用户行为模式的分析,建议设计"触发-参与-分享"的完整行为路径。触发阶段通过话题挑战赛引发兴趣;参与阶段通过互动任务降低门槛;分享阶段通过激励机制促进主动传播。', summary: [ { key: '触发机制', value: '话题挑战赛' }, { key: '参与路径', value: '任务闯关+创作征集' }, { key: '分享激励', value: '荣誉体系+实物奖励' }, ], }, 'narrative-agent': { core: '叙事建议采用"真实青年故事"为主线', content: '建议采用纪实风格的叙事策略,讲述真实青年人物的故事,而非虚构的营销叙事。通过真实故事的感染力和共鸣感,提升青年群体对活动的认同和参与意愿。', summary: [ { key: '叙事风格', value: '纪实风格' }, { key: '故事原型', value: '真实青年人物' }, { key: '情感基调', value: '正向、热血、有共鸣' }, ], }, 'risk-agent': { core: '主要风险在于话题敏感性和UGC内容合规', content: '需要关注两方面风险:一是政治敏感话题的把控,需严格审核所有内容;二是UGC内容可能带来的舆论风险。建议建立完善的内容审核机制和应急预案。', summary: [ { key: '风险类型', value: '内容合规风险' }, { key: '风险等级', value: '中等' }, { key: '应对策略', value: '前置审核+应急预案' }, ], }, }; const mockData = responses[agent.id] || { core: '该智能体已完成分析', content: '基于专业能力进行了深入分析。', summary: [{ key: '分析结论', value: '待补充' }], }; const responseId = `${Date.now()}-${agent.id}`; // 添加智能体回答到消息流 const agentMessage: MultiAgentMessage = { id: responseId, type: 'agent', agentName: agent.name, content: `${mockData.core}\n\n${mockData.content}`, timestamp: new Date(), }; setMultiAgentMessages(prev => [...prev, agentMessage]); return { id: responseId, agentId: agent.id, agentName: agent.name, agentCategory: agent.category, status: 'completed' as const, coreJudgment: mockData.core, content: mockData.content, structuredSummary: mockData.summary, timestamp: new Date(), }; }); setAgentResponses(prev => { const existing = prev.filter(r => !targets.find(t => `${Date.now()}-${t.id}`.includes(r.id))); return [...existing, ...completedResponses]; }); setIsMultiAgentLoading(false); }, 1500); }; const handleAdoptResponse = (responseId: string) => { const response = agentResponses.find(r => r.id === responseId); if (response) { setAdoptedViews(prev => [...prev, { id: `adopted-${Date.now()}`, agentName: response.agentName, content: response.coreJudgment, timestamp: new Date(), }]); setAgentResponses(prev => prev.map(r => r.id === responseId ? { ...r, status: 'adopted' as const } : r )); } }; const handlePendingConfirm = (responseId: string) => { setAgentResponses(prev => prev.map(r => r.id === responseId ? { ...r, status: 'pending-confirm' as const } : r )); }; const handleWriteToReport = (responseId: string) => { const response = agentResponses.find(r => r.id === responseId); if (response) { setSummaryDraft(prev => ({ ...prev, sections: [...prev.sections, { title: `${response.agentName}分析结论`, content: response.coreJudgment + '\n\n' + response.content, }], })); } }; const handleGenerateSummary = () => { const summaryPoints = agentResponses .filter(r => r.status === 'completed' || r.status === 'adopted') .map(r => `- ${r.agentName}:${r.coreJudgment}`); setSummaryDraft(prev => ({ ...prev, sections: [ { title: '任务背景', content: taskInfo.name }, { title: '参与智能体', content: selectedMultiAgents.map(a => a.name).join('、') }, { title: '综合结论', content: summaryPoints.join('\n') }, { title: '待确认问题', content: pendingQuestions.map(q => `- ${q.content}`).join('\n') || '无' }, ], })); }; const handleExportReport = () => { alert('报告导出功能开发中...'); }; const handleSaveMultiAgentRecord = () => { alert('协同分析记录已保存'); }; const handleTransferToScene = () => { alert('转场景任务功能开发中...'); }; const handleMultiAgentFollowUp = (agentId: string) => { setSendTarget(agentId); }; // 添加智能体到协同分析 const handleAddAgent = (agent: Agent) => { if (!selectedMultiAgents.find(a => a.id === agent.id)) { setSelectedMultiAgents([...selectedMultiAgents, agent]); } setShowAgentSelector(false); }; // 从协同分析中移除智能体 const handleRemoveAgent = (agentId: string) => { setSelectedMultiAgents(selectedMultiAgents.filter(a => a.id !== agentId)); // 同时清除该智能体的响应 setAgentResponses(prev => prev.filter(r => r.agentId !== agentId)); setMultiAgentMessages(prev => prev.filter(msg => { const response = agentResponses.find(r => r.agentId === agentId); return !response || msg.agentName !== agents.find(a => a.id === agentId)?.name; })); }; // 应用场景模板 const handleApplySceneTemplate = (template: SceneTemplate) => { const templateAgents = agents.filter(a => template.agentIds.includes(a.id)); setSelectedMultiAgents(templateAgents); setSelectedSceneTemplate(template); // 清空当前分析数据 setAgentResponses([]); setMultiAgentMessages([]); setAdoptedViews([]); setPendingQuestions([]); setSummaryDraft({ title: `${template.name}分析报告`, sections: [] }); setTaskInfo({ name: template.name, goal: template.description, status: '准备中', background: template.description, keyQuestions: [], }); setShowSceneSelector(false); }; // 获取未选择的智能体列表 const availableAgentsForSelection = agents.filter( agent => !selectedMultiAgents.find(a => a.id === agent.id) ); // 处理新建问答 - 清空会话并切换到指定类型 const handleNewQA = (targetProvider?: QAProvider) => { // 清空对话 setMessages([]); setCompareResult(null); setInputValue(''); // 切换到指定类型 if (targetProvider) { setQaProvider(targetProvider); } }; const handleSend = () => { if (!inputValue.trim()) return; setIsLoading(true); const userMessage: Message = { id: Date.now().toString(), role: 'user', content: inputValue, timestamp: new Date(), }; // 保存用户消息到聊天记录 addMessage('user', inputValue, qaProvider === 'agent' ? 'agent' : 'general', qaProvider === 'agent' ? selectedAgent.name : undefined); setMessages([...messages, userMessage]); setInputValue(''); setTimeout(() => { const responseContent = qaProvider === 'agent' ? `基于${selectedAgent.name}的专业能力,我来为您分析:\n\n根据您的问题,我识别到核心受众特征如下:\n\n**核心受众识别**:\n- 主要年龄段:25-35岁\n- 职业特征:都市白领\n- 消费能力:中高端\n- 关注点:品质生活、个人成长\n\n**关键特质**:\n1. 追求个性化表达\n2. 注重社交认同\n3. 愿意为品质付费\n\n以上分析是否满足您的需求?如需调整维度,请继续补充信息。` : `RAG(检索增强生成)技术的工作原理主要包括以下几个步骤:\n\n1. **检索阶段**:系统首先将用户问题转换为查询向量,在知识库中进行相似度搜索。\n\n2. **增强阶段**:将检索到的相关文档与原始问题组合。\n\n3. **生成阶段**:将增强后的提示词发送给大语言模型。`; const response: Message = { id: (Date.now() + 1).toString(), role: 'assistant', content: responseContent, timestamp: new Date(), sources: qaProvider === 'agent' ? undefined : [ { title: 'RAG技术白皮书', type: 'PDF', snippet: 'RAG是一种结合检索和生成的技术架构...' }, ], agentName: qaProvider === 'agent' ? selectedAgent.name : undefined, skills: qaProvider === 'agent' ? selectedAgent.skills : undefined, dataSources: qaProvider === 'agent' ? selectedAgent.dataSources : undefined, }; // 保存助手回复到聊天记录 addMessage('assistant', responseContent, qaProvider === 'agent' ? 'agent' : 'general', qaProvider === 'agent' ? selectedAgent.name : undefined); setMessages(prev => [...prev, response]); setIsLoading(false); setSearchProcess({ currentMode: qaMode === 'single-round' ? '单轮RAG' : qaMode === 'multi-round' ? '多轮RAG' : '深度检索', rounds: qaMode === 'multi-round' ? 3 : 1, hits: 5, queryRewrite: qaMode === 'deep-search' ? '原问题→分解子问题→独立检索→综合回答' : '', }); }, 1500); }; const handleCompare = () => { if (!inputValue.trim()) return; setIsLoading(true); setTimeout(() => { setCompareResult({ leftMode: compareLeftMode, rightMode: compareRightMode, leftContent: '单轮RAG回答:直接检索并生成答案,响应速度快,但可能遗漏跨文档的关联信息。适用于简单事实查询。', rightContent: '深度检索回答:通过问题分解、多轮检索和综合分析,提供更全面的答案。包含详细的推理过程和更多的引用来源。', differences: { consensus: '两种方式都使用向量检索技术,都能引用原始文档', differences: '深度检索采用多轮查询改写,覆盖更全面', leftAdvantage: '响应更快,资源消耗更低', rightAdvantage: '答案更完整,引用更充分', }, }); setIsLoading(false); }, 2000); }; const handleSaveRecord = () => { alert('问答记录已保存'); }; // 新建问答 - 通用/智能体模式 const handleStartNewQA = () => { // 如果有现有消息,弹出确认对话框 if (messages.length > 0 || compareResult) { setShowNewQADialog(true); return; } // 直接新建 - 清空会话 performNewQA(); }; // 执行新建问答 const performNewQA = () => { // 清空对话 setMessages([]); setCompareResult(null); setInputValue(''); setShowNewQADialog(false); }; // 保存并新建 const handleSaveAndNewQA = () => { handleSaveRecord(); performNewQA(); }; const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); if (viewMode === 'compare') { handleCompare(); } else { handleSend(); } } }; // 获取模式标签 const getModeLabel = (mode: QAMode) => { switch (mode) { case 'single-round': return '单轮RAG'; case 'multi-round': return '多轮RAG'; case 'deep-search': return '深度检索'; } }; // 空状态快捷入口 const QuickStartCards = () => (
); return (
{/* 左侧面板 - MiniMax风格 - 可折叠 */}
{/* 顶部标题 */}
{!leftPanelCollapsed && (

{qaProvider === 'agent' ? '智能体列表' : '问答配置'}

)}
{/* 左侧面板折叠内容 */} {!leftPanelCollapsed && ( <> {/* 通用问答配置 */} {qaProvider === 'general' && (
{/* 问答模式选择 - 卡片式 */}

问答模式

{[ { value: 'single-round', label: '单轮RAG', icon: Sparkles, desc: '快速直接' }, { value: 'multi-round', label: '多轮RAG', icon: Brain, desc: '深入理解' }, { value: 'deep-search', label: '深度检索', icon: BookOpen, desc: '全面分析' }, ].map((mode) => ( ))}
{/* 知识范围 */}

知识范围

{[ { value: 'all', label: '全部知识源' }, { value: 'specific-kb', label: '指定知识库' }, { value: 'specific-domain', label: '指定资源域' }, ].map((option) => (
{/* 回答偏好 */}

回答偏好

{[ { checked: showSources, onChange: () => setShowSources(!showSources), label: '展示引用来源' }, { checked: showProcess, onChange: () => setShowProcess(!showProcess), label: '展示检索过程' }, ].map((item, idx) => ( ))}
{/* 检索过程 */} {showProcess && messages.length > 0 && (

检索过程

当前模式 {searchProcess.currentMode}
检索轮次 {searchProcess.rounds}
命中数 {searchProcess.hits}
)}
)} {/* 智能体问答配置 - MiniMax单专家风格优化 */} {qaProvider === 'agent' && (
{/* 简洁的智能体选择区 */}
{/* 当前选中智能体 - 大卡片突出显示 */}
{selectedAgent.name}
{selectedAgent.category}
{selectedAgent.description}
{/* 智能体列表 - MiniMax风格网格 */}
选择其他智能体
{agents.slice(0, 6).map((agent) => ( ))}
{/* 智能体能力标签 - 底部展示 */}
{/* 技能标签 */}
核心技能
{selectedAgent.skills.slice(0, 4).map((skill, idx) => ( {skill} ))}
{/* 数据源标签 */}
数据源
{selectedAgent.dataSources.slice(0, 3).map((source, idx) => ( {source} ))}
)} {/* 底部按钮 - 所有模式通用 */}
)}
{/* 右侧面板 - 对话区 */}
{/* 顶部模式切换 */}
{/* 右侧 - 新建问答按钮(仅通用/智能体模式显示) */} {qaProvider !== 'multi-agent' && ( )}
{/* 消息区域 */}
{/* 多智能体协同分析面板 - 正确设计 */} {qaProvider === 'multi-agent' && (
{/* 顶部标题栏 - 简洁版 */}

多智能体协同分析

{taskInfo.name} • {taskInfo.goal} {taskInfo.status}
{/* 三栏布局主体 */}
{/* 左侧:参与智能体列表 */}
{/* 场景模板选择 */}
{/* 场景模板选择下拉 */} {showSceneSelector && (
选择场景模板自动配置智能体
{sceneTemplates.map((template) => ( ))}
)}
{/* 智能体列表头部 */}

参与智能体 ({selectedMultiAgents.length})

{/* 智能体选择下拉 - 按五大类别分组 */} {showAgentSelector && (
选择要添加的智能体
{availableAgentsForSelection.length === 0 ? (
所有智能体已添加
) : (
{/* 按类别分组显示 */} {['规划类', 'MNTY类', '效果PG类', '知识分析类', '协同管理类'].map((category) => { const categoryAgents = availableAgentsForSelection.filter(a => a.category === category); if (categoryAgents.length === 0) return null; return (
{category === '规划类' && } {category === 'MNTY类' && } {category === '效果PG类' && } {category === '知识分析类' && } {category === '协同管理类' && } {category}
{categoryAgents.map((agent) => ( ))}
); })}
)}
)} {/* 参与智能体列表 */}
{selectedMultiAgents.map((agent) => { const response = agentResponses.find(r => r.agentId === agent.id); const status = response?.status || 'pending'; return (
{agent.name}
{agent.category}
{status === 'pending' ? '待回答' : status === 'responding' ? '回答中' : '已回答'}
); })} {selectedMultiAgents.length === 0 && (

请添加参与分析的智能体

)}
{/* 历史记录入口 */}
{/* 中间:问答消息流 */}
{/* 工具条 */}
{/* 消息列表 */}
{multiAgentMessages.length === 0 ? (

尚未开始提问

请在底部输入你希望多个智能体分析的问题
系统将按所选对象返回回答

) : ( multiAgentMessages.map((msg) => { const isAdopted = msg.type === 'agent' && adoptedViews.some(v => v.agentName === msg.agentName); return (
{msg.type === 'user' ? (
用户

{msg.content}

) : (
{msg.agentName} {isAdopted && ( 已采纳 )}
{msg.timestamp.toLocaleTimeString()}

{msg.content}

)}
); }) )} {isMultiAgentLoading && (
智能体正在分析中...
)}
{/* 底部统一输入区 */}
发送对象:
{selectedMultiAgents.map((agent) => ( ))}