diff --git a/src/assets/icons/historyDelete.svg b/src/assets/icons/historyDelete.svg new file mode 100644 index 0000000..626b364 --- /dev/null +++ b/src/assets/icons/historyDelete.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/historyEdit.svg b/src/assets/icons/historyEdit.svg new file mode 100644 index 0000000..7c06228 --- /dev/null +++ b/src/assets/icons/historyEdit.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/views/home/agent/components/Agent.vue b/src/views/home/agent/components/Agent.vue index 17ad945..8f58b13 100644 --- a/src/views/home/agent/components/Agent.vue +++ b/src/views/home/agent/components/Agent.vue @@ -221,7 +221,8 @@ } buffer += decoder.decode(value, { stream: true }) - + console.log('收到chunk',new Date().getTime()); + // 优先按空行拆分事件块(SSE标准) let events = buffer.split(/\n\n/) buffer = events.pop() // 保留不完整块 @@ -261,7 +262,7 @@ try { const jsonData = JSON.parse(jsonText) - console.log('jsonData', jsonData) + // console.log('jsonData', jsonData) // 赋值 project_id 和 version_id // if (jsonData.project_id) params.projectID = jsonData.project_id @@ -361,6 +362,67 @@ ) } + // 处理对话列表,将连续的 assistant 消息合并为一条 + const processDialogue = (dialogue, startIndex, existingImgList) => { + if (!dialogue || dialogue.length === 0) return [] + + const result = [] + let i = startIndex + + while (i < dialogue.length) { + const item = dialogue[i] + + if (item.image_url) { + existingImgList.push(item.image_url) + } + + if (item.role === 'user') { + // user 角色直接添加 + result.push({ + ...item, + text: item.content, + isUser: true, + id: result.length + 1 + }) + i++ + } else if (item.role === 'assistant') { + // assistant 角色,拼接直到下一个 user + let combinedContent = item.content || '' + + // 继续往后找连续的 assistant 消息 + let j = i + 1 + while (j < dialogue.length && dialogue[j].role === 'assistant') { + if (dialogue[j].image_url) { + existingImgList.push(dialogue[j].image_url) + } + combinedContent += dialogue[j].content || '' + j++ + } + + result.push({ + ...item, + content: combinedContent, + text: combinedContent, + isUser: false, + id: result.length + 1 + }) + + i = j + } else { + // 其他角色直接添加 + result.push({ + ...item, + text: item.content, + isUser: item.role === 'user', + id: result.length + 1 + }) + i++ + } + } + + return result + } + const setChatInfo = (info) => { const initialData = agentStore.getInitialProjectData if (isGenerating.value || initialData) return @@ -389,35 +451,22 @@ const imgList = [] const ancestorsList = [] + let ancestorsIdCounter = 1 if (ancestors) { ancestors.forEach((item) => { - const list = - item.dialogue?.map((el, index) => { - if (el.image_url) { - imgList.push(el.image_url) - } - return { - ...el, - text: el.content, - isUser: el.role === 'user', - id: index + 1 - } - }) || [] + const list = processDialogue(item.dialogue, 0, imgList) + // 重新设置 id + list.forEach((el) => { + el.id = ancestorsIdCounter++ + }) ancestorsList.push(...list) }) } - const currentList = - current?.dialogue?.map((item, index) => { - if (item.image_url) { - imgList.push(item.image_url) - } - return { - ...item, - text: item.content, - isUser: item.role === 'user', - id: index + 1 + ancestorsList.length - } - }) || [] + const currentList = processDialogue(current?.dialogue, 0, imgList) + // 重新设置 id + currentList.forEach((el, index) => { + el.id = index + 1 + ancestorsList.length + }) // 延迟设置新数据,确保 UI 有时间响应清空操作 nextTick(() => { diff --git a/src/views/home/agent/components/Item.vue b/src/views/home/agent/components/Item.vue index bfa8bb6..8ecbe76 100644 --- a/src/views/home/agent/components/Item.vue +++ b/src/views/home/agent/components/Item.vue @@ -7,10 +7,7 @@
-
+
-
+
@@ -30,6 +27,7 @@ { isLoad.value = false treeList.value = [] - treeList.value.push({versionId: null,name:'index',}) + // treeList.value.push({versionId: null,name:'index',}) traverseArray(props.versionsList, (item, index) => { treeList.value.push(item) }) diff --git a/src/views/home/agent/components/versionTree/tree/view2/index.vue b/src/views/home/agent/components/versionTree/tree/view2/index.vue index 9db3f8a..b818e89 100644 --- a/src/views/home/agent/components/versionTree/tree/view2/index.vue +++ b/src/views/home/agent/components/versionTree/tree/view2/index.vue @@ -60,7 +60,7 @@ const push = (item)=>{ let className = `custom-node item${item.versionId.replace(/-/g, "_")}` let id = item.versionId let source = edges.value.length == 0?'0':item.versionId.slice(0, -2) - nodes.value.push({id,type:'SecondaryNode',class:className,position,data:item}) + nodes.value.push({id,type:nodes.value.length == 0?'SecondaryNode':'SecondaryNode',class:className,position,data:item}) edges.value.push({ id, target:id, source, type: 'smoothstep' }) } } diff --git a/src/views/home/agent/components/versionTree/tree/view2/secondaryNode.vue b/src/views/home/agent/components/versionTree/tree/view2/secondaryNode.vue index de089f3..42005cc 100644 --- a/src/views/home/agent/components/versionTree/tree/view2/secondaryNode.vue +++ b/src/views/home/agent/components/versionTree/tree/view2/secondaryNode.vue @@ -18,7 +18,7 @@ const props = defineProps<{