import { useParams } from 'react-router-dom' import { useState, useEffect } from 'react' import { Space, Alert, Spin, message } from 'antd' import { RobotOutlined } from '@ant-design/icons' import { agentApi, type AgentConfig } from '../api/agentApi' import conversationApi, { type Conversation, type Message } from '../api/conversationApi' import MessageList from '../components/chat/MessageList' import MessageInput from '../components/chat/MessageInput' import ModelSelector, { type ModelType } from '../components/chat/ModelSelector' import { useProjectStore } from '../stores/useProjectStore' import { useKnowledgeBaseStore } from '../stores/useKnowledgeBaseStore' const AgentChatPage = () => { const { agentId } = useParams() const { currentProject } = useProjectStore() const { knowledgeBases, fetchKnowledgeBases } = useKnowledgeBaseStore() // 智能体相关状态 const [agent, setAgent] = useState(null) const [agentLoading, setAgentLoading] = useState(true) const [error, setError] = useState(null) // 对话相关状态 const [conversation, setConversation] = useState(null) const [messages, setMessages] = useState([]) const [selectedModel, setSelectedModel] = useState('deepseek-v3') // 消息发送状态 const [sending, setSending] = useState(false) const [streamingContent, setStreamingContent] = useState('') // 加载智能体配置 useEffect(() => { const fetchAgent = async () => { if (!agentId) return try { setAgentLoading(true) const response = await agentApi.getById(agentId) if (response.success && response.data) { setAgent(response.data) } else { setError(response.message || '智能体不存在') } } catch (err) { console.error('Failed to load agent:', err) setError('加载智能体配置失败') message.error('加载智能体配置失败') } finally { setAgentLoading(false) } } fetchAgent() }, [agentId]) // 加载知识库列表 useEffect(() => { fetchKnowledgeBases() // eslint-disable-next-line react-hooks/exhaustive-deps }, []) // 创建或加载对话 useEffect(() => { const initConversation = async () => { console.log('🔷 [initConversation] 开始', { agent, currentProject }) if (!agent || !currentProject) { console.warn('⚠️ [initConversation] agent或currentProject为空,跳过') return } try { console.log('📞 [initConversation] 调用API创建对话') // 创建新对话 const response = await conversationApi.createConversation({ projectId: currentProject.id, agentId: agent.id, title: `与${agent.name}的对话`, }) console.log('✅ [initConversation] 对话创建成功', response) console.log('📦 [initConversation] response:', response) // response 本身就是 ApiResponse // response.data 是 Conversation | undefined if (response.data) { console.log('💾 [initConversation] 设置conversation为:', response.data) setConversation(response.data as any) setMessages([]) } else { console.error('❌ [initConversation] response.data为空') message.error('创建对话失败:无数据返回') } } catch (err) { console.error('❌ [initConversation] 创建对话失败:', err) message.error('创建对话失败') } } initConversation() }, [agent, currentProject]) // 发送消息(流式) const handleSendMessage = async (content: string, knowledgeBaseIds: string[]) => { console.log('🔵 [handleSendMessage] 开始', { content, knowledgeBaseIds, conversation, sending }) if (!conversation) { console.error('❌ [handleSendMessage] conversation为空!') message.error('对话未初始化,请刷新页面') return } if (sending) { console.warn('⚠️ [handleSendMessage] 正在发送中,忽略本次请求') return } setSending(true) setStreamingContent('') // 添加用户消息到列表 const userMessage: Message = { id: `temp-${Date.now()}`, conversationId: conversation.id, role: 'user', content, createdAt: new Date().toISOString(), } console.log('📝 [handleSendMessage] 添加用户消息', userMessage) setMessages(prev => { const newMessages = [...prev, userMessage] console.log('📋 [handleSendMessage] 更新后的消息列表', newMessages) return newMessages }) try { let fullContent = '' await conversationApi.sendMessageStream( { conversationId: conversation.id, content, modelType: selectedModel, knowledgeBaseIds, }, // onChunk (chunk) => { fullContent += chunk setStreamingContent(fullContent) }, // onComplete () => { // 流式完成后,添加完整的助手消息 const assistantMessage: Message = { id: `temp-assistant-${Date.now()}`, conversationId: conversation.id, role: 'assistant', content: fullContent, model: selectedModel, createdAt: new Date().toISOString(), } setMessages(prev => [...prev, assistantMessage]) setStreamingContent('') setSending(false) }, // onError (error) => { console.error('Stream error:', error) message.error('发送消息失败:' + error.message) setStreamingContent('') setSending(false) } ) } catch (err) { console.error('Failed to send message:', err) message.error('发送消息失败') setStreamingContent('') setSending(false) } } if (agentLoading) { return (
) } if (!currentProject) { return ( ) } if (error || !agent) { return ( ) } if (!agent.enabled) { return ( ) } return (
{/* 顶部工具栏 - 紧凑设计 */}
{agent.icon}
{agent.name}
{agent.category} · {currentProject?.name}
{/* 模型选择器 */}
{/* 聊天区域 - 去掉Card,直接使用div */}
{/* 消息列表区域 */}
{messages.length === 0 && !sending ? (
开始对话,我将为您提供专业的研究建议
您可以直接输入问题,或使用@知识库功能引用文献
) : ( )}
{/* 消息输入 */}
) } export default AgentChatPage