diff --git a/pages/search/[id].vue b/pages/search/[id].vue index 2683ac578bfd58c39ed9154d4205f2e98883b873..65ed642cac3cda46e7c62206b4275c23e29e7d2a 100644 --- a/pages/search/[id].vue +++ b/pages/search/[id].vue @@ -43,7 +43,7 @@
- 搜索过程 + 搜索过程{{ item.desLoading ? '中...' : '' }}
- 答案 + {{ item.ansLoading ? '回答中' : '答案' }}
@@ -145,6 +145,7 @@ const route = useRoute() const { fetchRequest } = useFetchRequest() const repos = getMockRepo(); const initLoading = ref(true); +const editIndex = ref(0); // todo mock const repoItem = repos.find(item => route.query.repo === item.label); const state = reactive({ @@ -171,10 +172,24 @@ const handleShare = (hash) => { }) } const handleCopyMD = (index) => { - + const article = data.value[index].article + useCopyToClipboard().copy(article) + toast.add({ + icon: 'i-heroicons-information-circle-20-solid', + timeout: 1000, + title: '复制成功' + }) } const handleReGenerate = (index) => { - + editIndex.value = index; + const question = data.value[editIndex.value].question; + data.value[editIndex.value] = { + question, + desLoading: true + }; + nextTick(() => { + generateFetchData(question); + }) } const steps = ['', '问题分析', '代码搜索', '整理答案', '完成!'] @@ -195,8 +210,10 @@ const recommendQuestions = [ const continueQuestion = ref(null) let asking = ref(false) const handleContinueAsk = (question) => { - if (asking.value) return; - asking.value = true; + if (asking.value) return + asking.value = true + editIndex.value = data.value.length; + createGenerateInitItem(question); generateFetchData(question); } @@ -204,6 +221,12 @@ const handleContinueAsk = (question) => { let aiChatController = null; // 用户取消操作方法 const markedEnd = '[DONE]'; let storeSource = []; +const createGenerateInitItem = (question) => { + data.value.push({ question, desLoading: true }) +} +const resetAnsLoading = () => { + Object.assign(data.value[editIndex.value], { ansLoading: false }) +} const handleFormFetchData = (fetchData) => { let message = {}; try { @@ -212,41 +235,40 @@ const handleFormFetchData = (fetchData) => { console.log(error) } if (Object.keys(message).length === 0) return; - const index = data.value.length === 0 ? 0 : data.value.length - 1; - data.value[index] = data.value[index] || {}; const { meta, choices } = message; + const index = editIndex.value; if (meta.type === 'answer') { Object.assign(data.value[index], { - question: state.query, + ansLoading: true, + desLoading: false, article: message.choices[0].message.content }) - return; + return } - if (meta.type === 'log') { - if (meta.action === 'rephrase_question') { - Object.assign(data.value[index], { description: choices[0].message.content }) - } else if (meta.action === 'search_file') { - let source = choices[0].message.content; - storeSource = source.split('\n').map(item => { - return { - label: item, - link: '', - repo: '' - } - }); - } + if (meta.type !== 'log') return + + if (meta.action === 'rephrase_question') { + Object.assign(data.value[index], { description: choices[0].message.content, desLoading: true }) + return + } + if (meta.action === 'search_file') { + Object.assign(data.value[index], { desLoading: true }) + let source = choices[0].message.content; + storeSource = source.split('\n'); } } const handleUpdateSource = () => { - const index = data.value.length === 0 ? 0 : data.value.length - 1; + const index = editIndex.value; data.value[index] = data.value[index] || {}; // https://github.com/allwefantasy/byzer-llm/blob/master/tests/functions_suite.py const endWidthGit = state.gitPath.endsWith('.git'); const baseUrl = endWidthGit ? state.gitPath.slice(0, state.gitPath.length - 4) : state.gitPath; storeSource = storeSource.map((item) => { - item.repo = state.repo; - item.link = `${baseUrl}/blob/${state.branch}/${item.label}` - return item; + return { + repo: state.repo, + link: `${baseUrl}/blob/${state.branch}/${item.label}`, + label: item + } }) Object.assign(data.value[index], { source: storeSource }); } @@ -254,9 +276,13 @@ const handleHideInitLoading = () => { initLoading.value = false; } const handleMessage = (event) => { - if (initLoading.value) handleHideInitLoading(); + if (initLoading.value) { + handleHideInitLoading() + createGenerateInitItem(state.query) + }; if (event.data === markedEnd) { asking.value = false; + resetAnsLoading(); handleUpdateSource(); return; }