fix: AgentChatPage conversation data extraction issue

This commit is contained in:
AI Clinical Dev Team
2025-10-11 17:56:19 +08:00
parent 35b0c396c3
commit 5e06a68189
2 changed files with 82 additions and 29 deletions

View File

@@ -15,18 +15,22 @@ const AgentChatPage = () => {
const { currentProject } = useProjectStore() const { currentProject } = useProjectStore()
const { knowledgeBases, fetchKnowledgeBases } = useKnowledgeBaseStore() const { knowledgeBases, fetchKnowledgeBases } = useKnowledgeBaseStore()
// 智能体相关状æ€? const [agent, setAgent] = useState<AgentConfig | null>(null) // 智能体相关状态
const [agent, setAgent] = useState<AgentConfig | null>(null)
const [agentLoading, setAgentLoading] = useState(true) const [agentLoading, setAgentLoading] = useState(true)
const [error, setError] = useState<string | null>(null) const [error, setError] = useState<string | null>(null)
// 对è¯<EFBFBD>ç¸å…³çжæ€? const [conversation, setConversation] = useState<Conversation | null>(null) // 对话相关状态
const [conversation, setConversation] = useState<Conversation | null>(null)
const [messages, setMessages] = useState<Message[]>([]) const [messages, setMessages] = useState<Message[]>([])
const [selectedModel, setSelectedModel] = useState<ModelType>('deepseek-v3') const [selectedModel, setSelectedModel] = useState<ModelType>('deepseek-v3')
// 消æ<EFBFBD>¯å<EFBFBD>é€<EFBFBD>状æ€? const [sending, setSending] = useState(false) // 消息发送状态
const [sending, setSending] = useState(false)
const [streamingContent, setStreamingContent] = useState('') const [streamingContent, setStreamingContent] = useState('')
// 加载智能体é…<EFBFBD>ç½? useEffect(() => { // 加载智能体配置
useEffect(() => {
const fetchAgent = async () => { const fetchAgent = async () => {
if (!agentId) return if (!agentId) return
@@ -41,8 +45,8 @@ const AgentChatPage = () => {
} }
} catch (err) { } catch (err) {
console.error('Failed to load agent:', err) console.error('Failed to load agent:', err)
setError('加载智能体é…<EFBFBD>置失è´?) setError('加载智能体配置失败')
message.error('加载æºèƒ½ä½é<EFBFBD>置失è´?) message.error('加载智能体配置失败')
} finally { } finally {
setAgentLoading(false) setAgentLoading(false)
} }
@@ -51,25 +55,46 @@ const AgentChatPage = () => {
fetchAgent() fetchAgent()
}, [agentId]) }, [agentId])
// 加载知识库列è¡? useEffect(() => { // 加载知识库列表
useEffect(() => {
fetchKnowledgeBases() fetchKnowledgeBases()
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []) }, [])
// 创建或加载对è¯? useEffect(() => { // 创建或加载对话
useEffect(() => {
const initConversation = async () => { const initConversation = async () => {
if (!agent || !currentProject) return console.log('🔷 [initConversation] 开始', { agent, currentProject })
if (!agent || !currentProject) {
console.warn('⚠️ [initConversation] agent或currentProject为空跳过')
return
}
try { try {
// 创建新对è¯? const response = await conversationApi.createConversation({ console.log('📞 [initConversation] 调用API创建对话')
// 创建新对话
const response = await conversationApi.createConversation({
projectId: currentProject.id, projectId: currentProject.id,
agentId: agent.id, agentId: agent.id,
title: `ä¸?{agent.name}的对è¯<C3A8>`, title: `${agent.name}的对话`,
}) })
setConversation(response.data.data || null) console.log('✅ [initConversation] 对话创建成功', response)
console.log('📦 [initConversation] response:', response)
// response 本身就是 ApiResponse<Conversation>
// response.data 是 Conversation | undefined
if (response.data) {
console.log('💾 [initConversation] 设置conversation为:', response.data)
setConversation(response.data as any)
setMessages([]) setMessages([])
} else {
console.error('❌ [initConversation] response.data为空')
message.error('创建对话失败:无数据返回')
}
} catch (err) { } catch (err) {
console.error('Failed to create conversation:', err) console.error('❌ [initConversation] 创建对话失败:', err)
message.error('创建对话失败') message.error('创建对话失败')
} }
} }
@@ -77,20 +102,38 @@ const AgentChatPage = () => {
initConversation() initConversation()
}, [agent, currentProject]) }, [agent, currentProject])
// å<EFBFBD>é€<EFBFBD>消æ<EFBFBD>¯ï¼ˆæµ<EFBFBD>å¼<EFBFBD>ï¼? const handleSendMessage = async (content: string, knowledgeBaseIds: string[]) => { // 发送消息(流式)
if (!conversation || sending) return 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) setSending(true)
setStreamingContent('') setStreamingContent('')
// 添加用户消æ<EFBFBD>¯åˆ°åˆ—è¡? const userMessage: Message = { // 添加用户消息到列表
const userMessage: Message = {
id: `temp-${Date.now()}`, id: `temp-${Date.now()}`,
conversationId: conversation.id, conversationId: conversation.id,
role: 'user', role: 'user',
content, content,
createdAt: new Date().toISOString(), createdAt: new Date().toISOString(),
} }
setMessages(prev => [...prev, userMessage]) console.log('📝 [handleSendMessage] 添加用户消息', userMessage)
setMessages(prev => {
const newMessages = [...prev, userMessage]
console.log('📋 [handleSendMessage] 更新后的消息列表', newMessages)
return newMessages
})
try { try {
let fullContent = '' let fullContent = ''
@@ -109,7 +152,8 @@ const AgentChatPage = () => {
}, },
// onComplete // onComplete
() => { () => {
// æµ<EFBFBD>å¼<EFBFBD>完æˆ<EFBFBD>å<EFBFBD>Žï¼Œæ·»åŠ å®Œæ•´çš„åŠ©æ‰æ¶ˆæ<EFBFBD>? const assistantMessage: Message = { // 流式完成后,添加完整的助手消息
const assistantMessage: Message = {
id: `temp-assistant-${Date.now()}`, id: `temp-assistant-${Date.now()}`,
conversationId: conversation.id, conversationId: conversation.id,
role: 'assistant', role: 'assistant',
@@ -131,7 +175,7 @@ const AgentChatPage = () => {
) )
} catch (err) { } catch (err) {
console.error('Failed to send message:', err) console.error('Failed to send message:', err)
message.error('å<EFBFBD>é€<EFBFBD>消æ<EFBFBD>¯å¤±è´?) message.error('发送消息失败')
setStreamingContent('') setStreamingContent('')
setSending(false) setSending(false)
} }
@@ -139,8 +183,15 @@ const AgentChatPage = () => {
if (agentLoading) { if (agentLoading) {
return ( return (
<div style={{ textAlign: 'center', padding: '100px 0' }}> <div style={{
<Spin size="large" tip="加载智能体é…<C3A9>置中..." /> display: 'flex',
alignItems: 'center',
justifyContent: 'center',
height: '100vh'
}}>
<Spin size="large" tip="加载智能体配置中...">
<div style={{ width: 200, height: 100 }} />
</Spin>
</div> </div>
) )
} }
@@ -149,7 +200,7 @@ const AgentChatPage = () => {
return ( return (
<Alert <Alert
message="请先选择项目" message="请先选择项目"
description="请在侧边æ <C3A6>选æ©ä¸€ä¸ªé¡¹ç®å<C2AE>Žå†<C3A5>å¼€å§å¯¹è¯? description="请在侧边栏选择一个项目后再开始对话"
type="info" type="info"
showIcon showIcon
/> />
@@ -180,7 +231,7 @@ const AgentChatPage = () => {
return ( return (
<div style={{ height: '100%', display: 'flex', flexDirection: 'column' }}> <div style={{ height: '100%', display: 'flex', flexDirection: 'column' }}>
{/* 顶部工具æ ?- 紧凑设计 */} {/* 顶部工具栏 - 紧凑设计 */}
<div style={{ <div style={{
padding: '12px 24px', padding: '12px 24px',
background: '#fff', background: '#fff',
@@ -202,7 +253,7 @@ const AgentChatPage = () => {
</div> </div>
</Space> </Space>
{/* 模型选择å™?*/} {/* 模型选择器 */}
<ModelSelector <ModelSelector
value={selectedModel} value={selectedModel}
onChange={setSelectedModel} onChange={setSelectedModel}
@@ -226,15 +277,17 @@ const AgentChatPage = () => {
flex: 1, flex: 1,
display: 'flex', display: 'flex',
flexDirection: 'column', flexDirection: 'column',
minHeight: 0, // é‡<C3A9>è¦<C3A8>:确ä¿<C3A4>å<EFBFBD>¯ä»¥æ»šåŠ? overflow: 'hidden', minHeight: 0, // 重要:确保可以滚动
overflow: 'hidden',
}}> }}>
{messages.length === 0 && !sending ? ( {messages.length === 0 && !sending ? (
<div style={{ flex: 1, display: 'flex', alignItems: 'center', justifyContent: 'center', background: '#fafafa' }}> <div style={{ flex: 1, display: 'flex', alignItems: 'center', justifyContent: 'center', background: '#fafafa' }}>
<div style={{ textAlign: 'center', color: '#999' }}> <div style={{ textAlign: 'center', color: '#999' }}>
<RobotOutlined style={{ fontSize: 64, marginBottom: 16 }} /> <RobotOutlined style={{ fontSize: 64, marginBottom: 16 }} />
<div style={{ fontSize: 16 }}>å¼å§å¯¹è¯<EFBFBD>,æˆå°ä¸ºæ¨æ<EFBFBD><EFBFBD>ä¾ä¸ä¸šçšç ç©å»ºè®?/div> <div style={{ fontSize: 16 }}></div>
<div style={{ fontSize: 14, marginTop: 8 }}> <div style={{ fontSize: 14, marginTop: 8 }}>
æ¨å<EFBFBD>¯ä»¥ç´æŽ¥è¾å¥é®é¢˜ï¼Œæˆä½¿ç¨@知è¯åºåŠŸèƒ½å¼ç¨æçŒ? </div> 使@知识库功能引用文献
</div>
</div> </div>
</div> </div>
) : ( ) : (
@@ -251,7 +304,7 @@ const AgentChatPage = () => {
onSend={handleSendMessage} onSend={handleSendMessage}
loading={sending} loading={sending}
knowledgeBases={knowledgeBases} knowledgeBases={knowledgeBases}
placeholder={`å<EFBFBD>?{agent.name}æ<><C3A6>é—®...(Shift+Enteræ<72>¢è¡Œï¼ŒEnterå<72>é€<C3A9>)`} placeholder={`${agent.name}提问...Shift+Enter换行Enter发送`}
/> />
</div> </div>
</div> </div>

0
重启所有服务.bat Normal file
View File