Browse Source

fix(aiChat): 优化AI返回内容的图片提取逻辑

1. 先处理空内容情况避免报错
2. 改用调用AI接口提取图片链接的方式
3. 简化原有的正则匹配逻辑
lsc 1 day ago
parent
commit
c91270ac3f
1 changed files with 28 additions and 29 deletions
  1. 28 29
      src/components/CollapsibleToolbar/componets/aiChat.vue

+ 28 - 29
src/components/CollapsibleToolbar/componets/aiChat.vue

@@ -945,36 +945,35 @@ const generate = async (message: ChatMessage) => {
     console.log('图片', result)
     console.log('图片', result)
     const content = await result.promise
     const content = await result.promise
     console.log('event.data', content)
     console.log('event.data', content)
-    // 从content中提取图片链接:依次尝试 1.整体就是链接 2.markdown链接格式 3.正文中任意URL(兼容反引号/文字包裹的情况)
-    const trimmedContent = content.trim()
-    const directUrlMatch = trimmedContent.match(/^(https?:\/\/\S+)$/)
-    const mdUrlMatch = directUrlMatch
-      ? null
-      : trimmedContent.replace(/\n/g, '').match(/\[.*?\]\((https?:\/\/.*?)\)/)
-    const anyUrlMatch = directUrlMatch || mdUrlMatch
-      ? null
-      : trimmedContent.match(/https?:\/\/[^\s'"`<>()【】,。;:!?]+/)
-    const rawUrl = directUrlMatch
-      ? directUrlMatch[1]
-      : mdUrlMatch
-        ? mdUrlMatch[1]
-        : (anyUrlMatch ? anyUrlMatch[1] : '')
-    // 去掉URL尾部可能带的标点
-    const imageUrl = rawUrl.replace(/[.,;:!?)'"`。,;:!?)]+$/, '')
-
-    // 判断当前页面是否是工具页(含frame元素)
-    const isToolPage = (currentSlide.value?.elements || []).some((el: any) => el.type === 'frame')
-    // 如果当前页不是工具页则直接加图片,是工具页则新建页面再加图片
-    if (!isToolPage) {
-      createImageElement(imageUrl)
-    }
-    else {
-      createSlide()
-      createImageElement(imageUrl)
+    // content为空时结束loading并退出,避免后续处理报错
+    if (!content) {
+      message.gLoading = false
+      message.chatloading = false
+      chatLoading.value = false
+      stopMessage()
+      return
     }
     }
-
-    message.gLoading = false
-    message.jsonData.isGenerate = true
+    // 让AI从返回内容中提取图片链接
+    chat_no_stream2([{
+      role: 'user',
+      content: `这是返回的内容:"${content}",从中提取图片链接。输出一个json格式的回复,格式如下:{"url":"图片链接"},如果没有图片链接则url为空字符串。`,
+    }], { type: 'json_object' }).then((res: any) => {
+      const imageUrl = JSON.parse(res).url || ''
+      if (imageUrl) {
+        // 判断当前页面是否是工具页(含frame元素)
+        const isToolPage = (currentSlide.value?.elements || []).some((el: any) => el.type === 'frame')
+        // 如果当前页不是工具页则直接加图片,是工具页则新建页面再加图片
+        if (!isToolPage) {
+          createImageElement(imageUrl)
+        }
+        else {
+          createSlide()
+          createImageElement(imageUrl)
+        }
+      }
+      message.gLoading = false
+      message.jsonData.isGenerate = true
+    })
   }
   }
   else if (message.jsonData?.gType === 'trigger_batch_tool') {
   else if (message.jsonData?.gType === 'trigger_batch_tool') {
     console.log(message.jsonData?.gType)
     console.log(message.jsonData?.gType)