diff --git a/src/api/agent.ts b/src/api/agent.ts index 4858085..4ea71b0 100644 --- a/src/api/agent.ts +++ b/src/api/agent.ts @@ -29,7 +29,7 @@ export const createProject = (data: CreateProjectParamsType): Promise => { } /** - * 获取项目信息 + * 获取项目信息和会话历史 * @param data 获取项目信息参数 * @param data.id 项目id * @returns 获取项目信息 diff --git a/src/api/upload.ts b/src/api/upload.ts index d95ed38..9cd07a6 100644 --- a/src/api/upload.ts +++ b/src/api/upload.ts @@ -1,2 +1,9 @@ import request from '@/utils/request' +export const uploadImage = (data: FormData) => { + return request({ + url: '/api/file/upload', + method: 'POST', + data + }) +} diff --git a/src/api/versitonTree.ts b/src/api/versitonTree.ts index d175f03..52995eb 100644 --- a/src/api/versitonTree.ts +++ b/src/api/versitonTree.ts @@ -32,7 +32,7 @@ export const versionTree = (data) => { * @param data 获取节点缩略信息的参数 * @param data.projectId 项目id * @param data.id 节点id - * @returns 获取节点缩略信息 + * @returns 回溯该节点之前的会话列表 */ export const getNodeAncestors = (data) => { return request({ diff --git a/src/stores/agent.ts b/src/stores/agent.ts index cd26e89..658e586 100644 --- a/src/stores/agent.ts +++ b/src/stores/agent.ts @@ -14,7 +14,7 @@ export const useAgentStore = defineStore('agent', () => { type: string area: string style: string - } | null>(null) + } | null>(null) // 保存项目初始数据 const setInitialProjectData = (data: { diff --git a/src/views/home/agent/components/Agent.vue b/src/views/home/agent/components/Agent.vue index 8102bcd..c28f9c1 100644 --- a/src/views/home/agent/components/Agent.vue +++ b/src/views/home/agent/components/Agent.vue @@ -26,7 +26,7 @@ import Input from '../../components/Input.vue' import { fetchAgentReply } from '@/api/agent' import type { AgentParamsType } from '@/api/agent' - import { useUserInfoStore, useProjectStore } from '@/stores' + import { useUserInfoStore, useProjectStore, } from '@/stores' import { useAgentStore } from '@/stores/agent' const userStore = useUserInfoStore() @@ -67,8 +67,6 @@ watch( sketchList, (newVal) => { - console.log('添加图片链接--------') - emits('update:sketchList', newVal) }, { deep: true } @@ -120,7 +118,7 @@ }, skipUserMessage = false ) => { - console.log('Message sent:', message) + // console.log('Message sent:', message) isPaused.value = false isGenerating.value = true params.message = message.text @@ -213,7 +211,7 @@ while (flag) { const { done, value } = await reader.read() if (done) { - console.log('传输结束 end---', contentBody) + // console.log('传输结束 end---', contentBody) aiMessage.streaming = false aiMessage.loading = false isGenerating.value = false @@ -254,6 +252,7 @@ // console.log('dataLInes', dataLines) if (isNodeIdEvent) { params.versionID = dataLines[0] + projectStore.setProject({nodeId:dataLines[0]}) } if (dataLines.length === 0) continue @@ -361,8 +360,47 @@ ) } + const setChatInfo = (data) => { + // messageList.value = list + const { ancestors, current } = data + const imgList = [] + const ancestorsList = [] + 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 + } + }) + 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 + } + }) + messageList.value = [...ancestorsList, ...currentList] + params.versionID = current.id + sketchList.value = imgList + // console.log('messagelist:', messageList.value) + // debugger + } + defineExpose({ - inputRef + setChatInfo }) diff --git a/src/views/home/agent/components/Item.vue b/src/views/home/agent/components/Item.vue index bd59fd9..36a6cf9 100644 --- a/src/views/home/agent/components/Item.vue +++ b/src/views/home/agent/components/Item.vue @@ -221,5 +221,8 @@ ul { list-style-position: inside; } + code { + white-space: pre-wrap; + } } diff --git a/src/views/home/agent/components/versionTree/index.vue b/src/views/home/agent/components/versionTree/index.vue index 7f71d0e..4bab113 100644 --- a/src/views/home/agent/components/versionTree/index.vue +++ b/src/views/home/agent/components/versionTree/index.vue @@ -29,7 +29,7 @@ const projectStore = useProjectStore() let oldProjectId:any = '' watch(()=>props.versionTreeData?.drawer, (newVal, oldVal) => { console.log(newVal,oldProjectId,projectStore.state.id) - if(newVal && oldProjectId !== projectStore.state.id && projectStore.state.id){ + if(newVal || (oldProjectId !== projectStore.state.id && projectStore.state.id)){ getVersionTree() oldProjectId = JSON.parse(JSON.stringify(projectStore.state.id)) } @@ -41,6 +41,7 @@ const getVersionTree = ()=>{ }).then(res => { if(!res)return setVersionsList([res]) + treeKey.value++ }) } diff --git a/src/views/home/agent/components/versionTree/tree/index.vue b/src/views/home/agent/components/versionTree/tree/index.vue index f3650fe..6713261 100644 --- a/src/views/home/agent/components/versionTree/tree/index.vue +++ b/src/views/home/agent/components/versionTree/tree/index.vue @@ -73,7 +73,6 @@ const initialize = ()=>{ const setSelectItem = (item)=>{ if(!item.versionId)return - console.log(item) projectStore.setProject({nodeId: item.id}) emit('update:selectItem', {...item}) emit('selectNode') @@ -97,10 +96,6 @@ watch(()=>treeStateTime.value,(newVal,oldVal)=>{ } }) -watch(()=>props.selectItem,(newVal,oldVal)=>{ - // scrollToActive() -},{immediate: true}) - onMounted(()=>{ initialize() }) 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 c93a3b1..9db3f8a 100644 --- a/src/views/home/agent/components/versionTree/tree/view2/index.vue +++ b/src/views/home/agent/components/versionTree/tree/view2/index.vue @@ -125,7 +125,7 @@ defineExpose({push}) -->
-
+
@@ -225,6 +225,11 @@ defineExpose({push}) margin-bottom: 2rem; background-color: #ffffff; cursor: pointer; + pointer-events: none; + &.active{ + background-color: #f5f5f5; + pointer-events: auto; + } &:hover{ background-color: #f5f5f5; } 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 f65663f..a33c2e9 100644 --- a/src/views/home/agent/components/versionTree/tree/view2/secondaryNode.vue +++ b/src/views/home/agent/components/versionTree/tree/view2/secondaryNode.vue @@ -25,7 +25,7 @@ const props = defineProps<{
- +
diff --git a/src/views/home/agent/index.vue b/src/views/home/agent/index.vue index 1033538..c902340 100644 --- a/src/views/home/agent/index.vue +++ b/src/views/home/agent/index.vue @@ -13,6 +13,7 @@ ref="VersionTreeIndexRef" v-model:versionTreeData="versionTreeData" @restore="handleRestore" + @selectNode="handleSelectNode" />
@@ -24,13 +25,14 @@ import VersionTreeIndex from './components/versionTree/index.vue' import { useProjectStore } from '@/stores' import { getProjectInfo } from '@/api/agent' + import { clearNodeChat, getNodeAncestors } from '@/api/versitonTree' import { useRoute } from 'vue-router' + const route = useRoute() + const projectStore = useProjectStore() const agentTitle = ref('Retro Sofa Sketch') const previewType = ref<'sketch' | 'report'>('sketch') - const route = useRoute() - const VersionTreeIndexRef = ref() const agentRef = ref() const sketchList = ref([]) @@ -45,39 +47,48 @@ }) const handleRestore = () => { - console.log('-----------', agentRef.value.inputRef.addReportTag) + // agentRef.value?.inputRef?.addReportTag('Restore') + clearNodeChat({ projectId: projectStore.state.id, id: projectStore.state.nodeId }).then( + (res) => {} + ) + } + const handleSelectNode = () => { + console.log('handleSelectNode') + getNodeAncestors({ projectId: projectStore.state.id, id: projectStore.state.nodeId }).then( + (res) => { + console.log('res', res) + agentRef.value.setChatInfo(res) + } + ) + } - agentRef.value?.inputRef?.addReportTag('Restore') + const handleGetProjectInfoAndHistory = () => { + getProjectInfo({ id: route.params.id }).then((res) => { + if(res?.conversation)agentRef.value.setChatInfo(res.conversation) + let data = res?.project || res + if(data?.latestNodeId)data.nodeId = data.latestNodeId + projectStore.setProject({ + ...data, + }) + }) } const proJectId = computed(() => route.params.id) - const projectStore = useProjectStore() + watch( () => proJectId.value, (newVal, oldVal) => { + projectStore.clearProject() if (newVal) { - projectStore.clearProject() - projectStore.setId(newVal) - - } - } - ) - watch( - () => projectStore.state.id, - (newVal, oldVal) => { - if (newVal) { - getProjectInfo({ id: newVal }).then((res) => { - projectStore.setProject(res.project) - }) + handleGetProjectInfoAndHistory() } } ) onMounted(() => { - if (projectStore.state.id) { - getProjectInfo({ id: projectStore.state.id }).then((res) => { - projectStore.setProject(res.project) - }) + projectStore.clearProject() + if (proJectId.value) { + handleGetProjectInfoAndHistory() } }) diff --git a/src/views/home/components/Input.vue b/src/views/home/components/Input.vue index 9802681..e9aeb18 100644 --- a/src/views/home/components/Input.vue +++ b/src/views/home/components/Input.vue @@ -188,6 +188,7 @@ import restoreCloseIcon from '@/assets/images/tag-close.png' import { createProject } from '@/api/agent' import { getStyleImage } from './style' + import { uploadImage } from '@/api/upload' // import Tag from './Tag.vue' const router = useRouter() @@ -221,18 +222,26 @@ // 处理文件选择 const handleFileChange = (event: Event) => { const input = event.target as HTMLInputElement + if (input.files) { Array.from(input.files).forEach((file) => { // 只处理图片文件 if (file.type.startsWith('image/')) { - const reader = new FileReader() - reader.onload = (e) => { - uploadedImages.value.push({ - url: e.target?.result as string, - name: file.name - }) - } - reader.readAsDataURL(file) + const formData = new FormData() + formData.append('file', file) + uploadImage(formData).then((res) => { + console.log(res) + + const reader = new FileReader() + reader.onload = (e) => { + uploadedImages.value.push({ + url: e.target?.result as string, + name: file.name, + path: res + }) + } + reader.readAsDataURL(file) + }) } }) } @@ -293,7 +302,6 @@ imgClose.src = closeIcon as unknown as string } - textSpan.innerText = tagText imgClose.addEventListener('click', (ev) => { @@ -467,19 +475,15 @@ } const handleSendAgent = async () => { - console.log('发送信息--------') - if (props.generating) { emits('pause') return } if (!inputValue.value.trim()) return - console.log('222222') + const imageUrlList = uploadedImages.value.map((item) => item.path) - const payload = { text: inputValue.value.trim(), images: uploadedImages.value } - console.log('准备发送 send 事件', payload) + const payload = { text: inputValue.value.trim(), images: imageUrlList } emits('send', payload) - console.log('send 事件已发送') // 发送后清空输入框 if (editorRef.value) { @@ -573,7 +577,7 @@ }) // console.log('Create project with:', params) - router.push('/home/agent', { query: params }) + router.push(`/home/agent/${projectres}`, { query: params }) } // 暴露方法给父组件 @@ -1056,15 +1060,14 @@ height: 1rem; cursor: pointer; flex-shrink: 0; - &.restore{ + &.restore { width: 0.5rem; height: 0.5rem; } } - .restore-icon{ + .restore-icon { width: 1.2rem; height: 1.2rem; } - }