From d8d9f09bf41ef715d3ac21d648ccb1c96aba55ff Mon Sep 17 00:00:00 2001 From: "X1627315083@163.com" <1627315083@qq.com> Date: Tue, 24 Mar 2026 13:58:36 +0800 Subject: [PATCH 01/10] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=8D=A1=E7=89=87?= =?UTF-8?q?=E4=BC=9A=E5=88=A0=E9=99=A4=E5=8D=A1=E7=89=87=E9=93=BE=E8=B7=AF?= =?UTF-8?q?=E6=89=80=E6=9C=89=E7=94=9F=E6=88=90=E8=8A=82=E7=82=B9=EF=BC=8C?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E6=A0=91=E6=96=B0=E5=A2=9E=E7=82=B9=E5=87=BB?= =?UTF-8?q?=E9=81=AE=E7=BD=A9=E5=85=B3=E9=97=AD=E7=89=88=E6=9C=AC=E6=A0=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/nodes/cards/cards-select.vue | 4 +- .../components/nodes/cards/fast-mode.vue | 12 +-- .../components/nodes/cards/index.vue | 14 ++-- .../components/nodes/cards/to-3d-model.vue | 6 +- .../components/nodes/cards/to-3view.vue | 4 +- .../components/nodes/result-image.vue | 7 -- .../Canvas/FlowCanvas/manager/EventManager.ts | 2 +- .../Canvas/FlowCanvas/manager/NodeManager.ts | 3 +- .../Canvas/FlowCanvas/manager/StateManager.ts | 80 +++++++++++++------ src/lang/en.ts | 4 +- src/lang/zh-cn.ts | 3 +- .../agent/components/versionTree/index.vue | 1 - 12 files changed, 85 insertions(+), 55 deletions(-) diff --git a/src/components/Canvas/FlowCanvas/components/nodes/cards/cards-select.vue b/src/components/Canvas/FlowCanvas/components/nodes/cards/cards-select.vue index 04ba1aa..bdc907b 100644 --- a/src/components/Canvas/FlowCanvas/components/nodes/cards/cards-select.vue +++ b/src/components/Canvas/FlowCanvas/components/nodes/cards/cards-select.vue @@ -70,13 +70,13 @@ const id = props.node.id if (!id) return const superiorID = props.node.data.superiorID + stateManager.deleteNode(id) if(v.secondaryMenu){ nodeManager.createCardsSelect({ data: { tier: props.node.data?.tier, superiorID, isActive: props.node.data?.isActive, - originalImage: props.node.data?.originalImage, secondaryMenu: v.secondaryMenu, createIndexPosition: props.node.data.createIndexPosition, } @@ -89,11 +89,9 @@ superiorID, isActive: props.node.data?.isActive, createIndexPosition: props.node.data.createIndexPosition, - originalImage: props.node.data?.originalImage, } }) } - stateManager.deleteNode(id) } defineExpose({}) diff --git a/src/components/Canvas/FlowCanvas/components/nodes/cards/fast-mode.vue b/src/components/Canvas/FlowCanvas/components/nodes/cards/fast-mode.vue index bdf6c78..949b7ef 100644 --- a/src/components/Canvas/FlowCanvas/components/nodes/cards/fast-mode.vue +++ b/src/components/Canvas/FlowCanvas/components/nodes/cards/fast-mode.vue @@ -9,24 +9,26 @@ \ No newline at end of file + :deep(.report-card) { + width: 52.5rem; + height: 8rem; + box-sizing: border-box; + } + diff --git a/src/views/home/components/Input.vue b/src/views/home/components/Input.vue index f3062d1..02650ff 100644 --- a/src/views/home/components/Input.vue +++ b/src/views/home/components/Input.vue @@ -35,7 +35,7 @@
-
+
Date: Tue, 24 Mar 2026 15:34:07 +0800 Subject: [PATCH 05/10] fix --- .../Canvas/FlowCanvas/manager/StateManager.ts | 10 ++++++---- src/components/Canvas/components/fullscreen-dialog.vue | 4 ++-- src/lang/en.ts | 1 + src/lang/zh-cn.ts | 1 + .../agent/components/versionTree/tree/view2/index.vue | 2 +- 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/components/Canvas/FlowCanvas/manager/StateManager.ts b/src/components/Canvas/FlowCanvas/manager/StateManager.ts index 0146a23..5165bb4 100644 --- a/src/components/Canvas/FlowCanvas/manager/StateManager.ts +++ b/src/components/Canvas/FlowCanvas/manager/StateManager.ts @@ -93,7 +93,7 @@ export class StateManager { this.nodes.value.forEach((node, index) => { const superiorID = node.data.superiorID; const isSuperior = this.nodes.value.some((v) => v.id === superiorID) - if (superiorID && isSuperior) { + if (isSuperior) { const source = node.data.superiorID const target = node.id arr.push({ @@ -101,7 +101,7 @@ export class StateManager { source: source, target: target, selectable: false, - visible: (node.data.isActive), + visible: (node.data.type == NODE_DATATYPE.RESULT_IMAGE && node.data.isActive) || node.data.type !== NODE_DATATYPE.RESULT_IMAGE, type: 'default' }) } @@ -148,6 +148,7 @@ export class StateManager { if (node.data.disableDelete) return ElMessage.error(t('flowCanvas.initialNodeProhibited')) const result = [node] + const findChildren = (parentId: string) => { const children = this.nodes.value.filter(item => item.data.superiorID === parentId) children.forEach(child => { @@ -157,11 +158,12 @@ export class StateManager { findChildren(child.id) }) } + findChildren(id) let deletePromise: any = true - if (isElMessageBox && result.length > 1) { + if (isElMessageBox) { deletePromise = await new Promise((resolve, reject) => { ElMessageBox.confirm( - t('flowCanvas.deleteSubordinateCard'), + result.length > 1 ? t('flowCanvas.deleteSubordinateCard') : t('flowCanvas.deleteCardConfirm'), '', { confirmButtonText: t('flowCanvas.confirm'), diff --git a/src/components/Canvas/components/fullscreen-dialog.vue b/src/components/Canvas/components/fullscreen-dialog.vue index 911bb73..f1116dc 100644 --- a/src/components/Canvas/components/fullscreen-dialog.vue +++ b/src/components/Canvas/components/fullscreen-dialog.vue @@ -86,8 +86,8 @@ } } .fullscreen-dialog { - --size: 0.25rem; - --width: 4rem; + --size: 0.125rem; + --width: 2rem; --color: #bfbfbf; background-color: #fffcf4; background-image: repeating-radial-gradient( diff --git a/src/lang/en.ts b/src/lang/en.ts index fa84f6e..f672a9f 100644 --- a/src/lang/en.ts +++ b/src/lang/en.ts @@ -178,6 +178,7 @@ export default { export: 'Export', }, flowCanvas: { + deleteCardConfirm: 'Are you sure you want to delete this function card?', confirm: 'Confirm', cancel: 'Cancel', confirmLeave: 'Are you sure you want to leave? You may have unsaved changes.', diff --git a/src/lang/zh-cn.ts b/src/lang/zh-cn.ts index 6ed4825..b5bd8f6 100644 --- a/src/lang/zh-cn.ts +++ b/src/lang/zh-cn.ts @@ -179,6 +179,7 @@ export default { edit: '编辑' }, flowCanvas: { + deleteCardConfirm: '确定要删除该功能卡片吗?', confirm: '确认', cancel: '取消', confirmLeave: '您可能有未保存的更改,确定要离开吗?', 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 78b80d2..5c45705 100644 --- a/src/views/home/agent/components/versionTree/tree/view2/index.vue +++ b/src/views/home/agent/components/versionTree/tree/view2/index.vue @@ -237,7 +237,7 @@ defineExpose({push}) margin-bottom: 0; } > .icon{ - margin-right: .4rem; + margin-right: .8rem; color: rgba(0, 0, 0, 0.5); } > span{ From b7f9a7818ca7e6470b45134d6dada054d913bc74 Mon Sep 17 00:00:00 2001 From: zhangyahui Date: Tue, 24 Mar 2026 15:45:28 +0800 Subject: [PATCH 06/10] =?UTF-8?q?feat:=20sketch=E5=8D=A1=E7=89=87=E5=9B=BA?= =?UTF-8?q?=E5=AE=9A=E5=87=BA=E7=8E=B0=E5=9C=A8=E5=AF=B9=E8=AF=9D=E5=BA=95?= =?UTF-8?q?=E9=83=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/home/agent/components/Agent.vue | 50 ++++++++++++----------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/src/views/home/agent/components/Agent.vue b/src/views/home/agent/components/Agent.vue index 76b7ae1..c3ad3d2 100644 --- a/src/views/home/agent/components/Agent.vue +++ b/src/views/home/agent/components/Agent.vue @@ -221,12 +221,17 @@ const decoder = new TextDecoder() let previousEventName = '' // 记录上一个事件名称 let hasReportStarted = false // 标记 report 是否已经开始 + + let hasSketchEvent = false try { let flag = true while (flag) { const { done, value } = await reader.read() if (done) { - // console.log('传输结束 end---', contentBody) + if (hasSketchEvent) { + aiMessage.text += `` + } + aiMessage.streaming = false aiMessage.loading = false isGenerating.value = false @@ -251,7 +256,7 @@ if (!hasReportStarted && eventName === 'report') { isGeneratingReport.value = true - contentBody += `123` + contentBody += `` hasReportStarted = true } @@ -319,20 +324,21 @@ // console.log('jsonData', jsonData) if (jsonData.webAddress) { aiMessage.webAddress = JSON.parse(jsonData.webAddress) - contentBody += `123` + contentBody += `` } if (jsonData.title) { emits('setTitle', jsonData.title) } if (hasSketch) { + hasSketchEvent = true sketchList.value.push({ [Object.keys(jsonData)[0]]: jsonData[Object.keys(jsonData)[0]] }) // 通知 Preview 有新 sketch 正在加载,传入 sketch 索引 MyEvent.emit('loading-sketch', sketchList.value.length - 1) MyEvent.emit('OpenSketch') - contentBody += `` + // contentBody += `` } if (eventName === 'report') { reportsContent.value += jsonData.report @@ -355,6 +361,7 @@ } } if (jsonData.type === 'end') { + console.log('end------hasSketch', hasSketch) aiMessage.streaming = false aiMessage.loading = false isGenerating.value = false @@ -364,7 +371,10 @@ } catch (e) { // 检查是否为纯文本 [DONE] if (jsonText.trim() === '[DONE]') { + console.log('done-----------hasSketch', hasSketch) + console.log('结束-----------------------') + aiMessage.text = contentBody aiMessage.streaming = false aiMessage.loading = false isGenerating.value = false @@ -463,11 +473,16 @@ // assistant 角色,拼接直到下一个 user let combinedContent = item.content || '' let combinedThinkingText = item.reasoning || '' + let combinedImageUrl = item.image_url || null // 继续往后找连续的 assistant 消息 let j = i + 1 while (j < dialogue.length && dialogue[j].role === 'assistant') { combinedContent += dialogue[j].content || '' combinedThinkingText += dialogue[j].reasoning || '' + // 如果有 image_url 则保留 + if (dialogue[j].image_url) { + combinedImageUrl = dialogue[j].image_url + } j++ } @@ -476,6 +491,7 @@ content: combinedContent, thinkingText: combinedThinkingText, text: combinedContent, + image_url: combinedImageUrl, isUser: false, id: result.length + 1, sessionId: sessionId @@ -512,7 +528,7 @@ } } - // 2. 收集 report 内容并保存到 localStorage + // 2. 收集 report 内容并保存到 sessionStorage let reportStr = '' session.dialogue?.forEach((item) => { if (item.report) { @@ -536,9 +552,7 @@ ancestorsList.push(...list) } -const setChatInfo = (info) => { - console.log('11111111111',info); - + const setChatInfo = (info) => { const initialData = agentStore.getInitialProjectData if (isGenerating.value || initialData) return @@ -556,39 +570,27 @@ const setChatInfo = (info) => { params.configParams.style = project.style params.configParams.temperature = project.temperature } - // 如果没有数据,直接返回 if (!data) { messageList.value = [] return } const { ancestors, current } = data - // 处理单个会话(ancestor 或 current) - const imgList = [] const ancestorsList = [] const idCounterRef = { value: 1 } - // 处理所有 ancestors ancestors?.forEach((item) => { processSession(item, imgList, ancestorsList, idCounterRef) }) - // 处理 current processSession(current, imgList, ancestorsList, idCounterRef) - // 延迟设置新数据,确保 UI 有时间响应清空操作 nextTick(() => { - // 找到每个 sessionId 对应的最后一项,插入sketch卡片 - const sessionLastIndexMap = new Map() - ancestorsList.forEach((item, index) => { - console.log('item', item) - // if (item.image_url) { - sessionLastIndexMap.set(item.sessionId, index) - // } - }) - sessionLastIndexMap.forEach((lastIndex) => { - ancestorsList[lastIndex].text += '' + ancestorsList.forEach((item) => { + if (item.image_url) { + item.text += `` + } }) messageList.value = [...ancestorsList] From 4baaa0b0d561caa439fae2b7a9a76c4a280c017b Mon Sep 17 00:00:00 2001 From: "X1627315083@163.com" <1627315083@qq.com> Date: Tue, 24 Mar 2026 16:05:52 +0800 Subject: [PATCH 07/10] fix --- .../Canvas/FlowCanvas/components/nodes/cards/cards-select.vue | 2 +- src/components/Canvas/FlowCanvas/manager/NodeManager.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/Canvas/FlowCanvas/components/nodes/cards/cards-select.vue b/src/components/Canvas/FlowCanvas/components/nodes/cards/cards-select.vue index bdc907b..2a348ca 100644 --- a/src/components/Canvas/FlowCanvas/components/nodes/cards/cards-select.vue +++ b/src/components/Canvas/FlowCanvas/components/nodes/cards/cards-select.vue @@ -70,7 +70,6 @@ const id = props.node.id if (!id) return const superiorID = props.node.data.superiorID - stateManager.deleteNode(id) if(v.secondaryMenu){ nodeManager.createCardsSelect({ data: { @@ -92,6 +91,7 @@ } }) } + // stateManager.deleteNode(id) } defineExpose({}) diff --git a/src/components/Canvas/FlowCanvas/manager/NodeManager.ts b/src/components/Canvas/FlowCanvas/manager/NodeManager.ts index 6c201fc..ee1298b 100644 --- a/src/components/Canvas/FlowCanvas/manager/NodeManager.ts +++ b/src/components/Canvas/FlowCanvas/manager/NodeManager.ts @@ -53,7 +53,6 @@ export class NodeManager { return current.data.createIndexPosition > max.data.createIndexPosition ? current : max }, superiorGenerateNodes[0]) const snode = superiorID ? this.stateManager.flowManager.getNodeById(superiorID) : this.stateManager.flowManager.getLastNode(); - console.log(snode) const id = options.id || createId() const positionX = options.positionX || 0 const positionY = options.positionY || 0 @@ -82,6 +81,7 @@ export class NodeManager { position, data } + if(currentNode)this.stateManager.deleteNode(currentNode.id) this.addNode(options_) return options_; } From 0428783f5cb3bcb37c9476cedbe29bd84616bfdc Mon Sep 17 00:00:00 2001 From: zhangyahui Date: Tue, 24 Mar 2026 16:57:40 +0800 Subject: [PATCH 08/10] =?UTF-8?q?feat:=20=E5=9B=BE=E7=89=87=E5=BC=95?= =?UTF-8?q?=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lang/en.ts | 3 ++ src/lang/zh-cn.ts | 5 ++- src/stores/agent.ts | 2 + src/views/home/agent/components/Agent.vue | 21 +++++++--- src/views/home/agent/components/Item.vue | 8 +++- src/views/home/agent/components/Preview.vue | 17 ++++++-- .../home/agent/components/ReportCard.vue | 6 ++- .../home/agent/components/SketchCard.vue | 6 +-- src/views/home/components/Input.vue | 39 ++++++++++++++----- 9 files changed, 79 insertions(+), 28 deletions(-) diff --git a/src/lang/en.ts b/src/lang/en.ts index f672a9f..0db9570 100644 --- a/src/lang/en.ts +++ b/src/lang/en.ts @@ -155,6 +155,9 @@ export default { deleteSuccess: 'Successfully deleted', thinking: 'Thinking...', thinkComplete: 'Thinking complete.', + quote: 'Quote', + delete: 'Delete', + edit: 'Edit', }, // Version Tree diff --git a/src/lang/zh-cn.ts b/src/lang/zh-cn.ts index b5bd8f6..44e444c 100644 --- a/src/lang/zh-cn.ts +++ b/src/lang/zh-cn.ts @@ -149,7 +149,10 @@ export default { Download: '下载', deleteSuccess: '删除成功', thinking:'已思考', - thinkComplete: '思考完成。' + thinkComplete: '思考完成。', + quote: '引用', + delete: '删除', + edit: '编辑', }, // Version Tree diff --git a/src/stores/agent.ts b/src/stores/agent.ts index 34c458e..3fbdfe9 100644 --- a/src/stores/agent.ts +++ b/src/stores/agent.ts @@ -15,6 +15,8 @@ type InitialProjectData = { style: string useReport:boolean needSuggestion:boolean + quoteList: Array + tempImages: any[] } export const useAgentStore = defineStore('agent', () => { const initialProjectData = ref(null) diff --git a/src/views/home/agent/components/Agent.vue b/src/views/home/agent/components/Agent.vue index c3ad3d2..8c5fedb 100644 --- a/src/views/home/agent/components/Agent.vue +++ b/src/views/home/agent/components/Agent.vue @@ -64,7 +64,8 @@ region: '', style: '' }, - imageUrlList: [] + imageUrlList: [], + quotaUrl: [] }) const sketchList = ref([]) @@ -110,7 +111,8 @@ text: initialData.text, images: initialData.images, useReport: initialData.useReport, - tempImages: initialData.tempImages + tempImages: initialData.tempImages, + quoteList: initialData.quoteList }) // 更新 configParams @@ -125,6 +127,7 @@ images: Array<{ url: string; name: string }> tempImages: any[] useReport: boolean + quoteList: Array }, skipUserMessage = false ) => { @@ -136,14 +139,14 @@ } params.imageUrlList = message.images || [] - + params.quotaUrl = message.quoteList || [] // 如果不是重新生成模式,则添加用户消息到列表 if (!skipUserMessage) { messageList.value.push({ id: messageList.value.length + 1, text: message.text, isUser: true, - imageUrls: message.tempImages + imageUrls: message.tempImages.concat(message.quoteList) }) } @@ -223,6 +226,8 @@ let hasReportStarted = false // 标记 report 是否已经开始 let hasSketchEvent = false + let hasReportEvent = false + try { let flag = true while (flag) { @@ -231,6 +236,9 @@ if (hasSketchEvent) { aiMessage.text += `` } + if (hasReportEvent) { + aiMessage.text += `` + } aiMessage.streaming = false aiMessage.loading = false @@ -256,7 +264,8 @@ if (!hasReportStarted && eventName === 'report') { isGeneratingReport.value = true - contentBody += `` + hasReportEvent = true + // contentBody += `` hasReportStarted = true } @@ -588,7 +597,7 @@ nextTick(() => { ancestorsList.forEach((item) => { - if (item.image_url) { + if (item.image_url && item.role !== 'user') { item.text += `` } }) diff --git a/src/views/home/agent/components/Item.vue b/src/views/home/agent/components/Item.vue index 1597d49..b892d75 100644 --- a/src/views/home/agent/components/Item.vue +++ b/src/views/home/agent/components/Item.vue @@ -129,7 +129,7 @@ }>() // watch( - // () => props.content, + // () => props, // (newVal) => { // console.log('newVal-----', newVal) // }, @@ -139,8 +139,12 @@ const emit = defineEmits(['regenerate']) const imageList = computed(() => { - const { imageUrls } = props.content + const { imageUrls, role } = props.content const list = [] + if (role === 'user') { + const quotaList = props.content.image_url ?? [] + list.push(...quotaList) + } if (!imageUrls || imageUrls.length === 0) return list imageUrls.forEach((item) => { if (typeof item === 'string') { diff --git a/src/views/home/agent/components/Preview.vue b/src/views/home/agent/components/Preview.vue index e86a782..18d8aab 100644 --- a/src/views/home/agent/components/Preview.vue +++ b/src/views/home/agent/components/Preview.vue @@ -13,12 +13,15 @@ @@ -37,7 +40,7 @@ class="edit-btn flex align-center space-between" @click="handleClickEdit(item)" > -
Edit
+
{{ $t('agent.edit') }}
@@ -218,6 +221,12 @@ myEvent.emit('openFlowCanvas', { url, imgId, nodeId }) } + const handleClickQuote = (item) => { + console.log(item) + const url = Object.values(item)[0] + MyEvent.emit('quote', url) + } + const handleClickDelete = (item: string | Object) => { deleteSketchFlowCanvas({ id: Object.keys(item)[0], diff --git a/src/views/home/agent/components/ReportCard.vue b/src/views/home/agent/components/ReportCard.vue index b30ba75..6f17ef1 100644 --- a/src/views/home/agent/components/ReportCard.vue +++ b/src/views/home/agent/components/ReportCard.vue @@ -48,8 +48,12 @@ } &.is-sketch { background: url('@/assets/images/sketch-card.png') no-repeat; - background-size: contain; padding: 2rem 3rem; + max-width: 52.5rem; + height: 8rem; + box-sizing: border-box; + background-size: 100% 100%; + min-height: initial; .report-card-header { margin-bottom: 0; } diff --git a/src/views/home/agent/components/SketchCard.vue b/src/views/home/agent/components/SketchCard.vue index a0397df..aa785df 100644 --- a/src/views/home/agent/components/SketchCard.vue +++ b/src/views/home/agent/components/SketchCard.vue @@ -7,9 +7,5 @@ diff --git a/src/views/home/components/Input.vue b/src/views/home/components/Input.vue index 02650ff..e16d797 100644 --- a/src/views/home/components/Input.vue +++ b/src/views/home/components/Input.vue @@ -2,15 +2,17 @@
-
+
@@ -211,7 +213,8 @@
@@ -222,7 +225,7 @@