Browse Source

流读取

wzg 6 months ago
parent
commit
f9ff09900e
3 changed files with 63 additions and 45 deletions
  1. 27 25
      js/ai-service.js
  2. 33 17
      js/chat-ui.js
  3. 3 3
      js/content.js

+ 27 - 25
js/ai-service.js

@@ -61,33 +61,35 @@ class AIService {
       const response = await this.openai.chat.completions.create({
         model: "qwen-plus",  //模型列表:https://help.aliyun.com/zh/model-studio/getting-started/models
         messages: this.formatMessages(message),
-        stream:true
+        stream: true
       });
       // console.log(completion);
-      const signal = response.controller.signal;
-      let text = ''
-      try {
-        const iterator = response.iterator();
-        for await (const chunk of iterator) {
-          if (chunk) {
-            console.log(chunk);
-            
-            const decodedChunk = chunk.choices[0].delta.content;
-            if (decodedChunk) {
-              text += decodedChunk;
-            }
-          }
-        }
-        console.log(text);
-        
-      } catch (error) {
-        if (signal.aborted) {
-          console.log("Stream reading aborted");
-        } else {
-          console.error("Error reading stream:", error);
-        }
-      } 
-      console.log((+new Date() - a) / 1000)
+      // const signal = response.controller.signal;
+      // let text = ''
+      // try {
+      //   const iterator = response.iterator();
+      //   for await (const chunk of iterator) {
+      //     if (chunk) {
+      //       console.log(chunk);
+
+      //       const decodedChunk = chunk.choices[0].delta.content;
+      //       if (decodedChunk) {
+      //         text += decodedChunk;
+      //       }
+      //     }
+      //   }
+      //   console.log(text);
+      // } catch (error) {
+      //   if (signal.aborted) {
+      //     console.log("Stream reading aborted");
+      //   } else {
+      //     console.error("Error reading stream:", error);
+      //   }
+      // }
+      return response;
+
+
+      // console.log((+new Date() - a) / 1000)
       // console.log(completion.choices[0].message.content);
 
       // const response = await fetch(this.apiEndpoint, {

+ 33 - 17
js/chat-ui.js

@@ -195,7 +195,7 @@ class ChatUI {
         // 发送分析请求到父页面
         window.parent.postMessage({ type: "ANALYZE_PAGE" }, "*");
         console.log(2222285);
-        
+
       });
       console.log(this.iframeInfo);
       this.fileInput.click();
@@ -265,10 +265,7 @@ class ChatUI {
 基于这个Excel文件的内容,请回答以下问题:
 ${this.iframeInfo}`;
       }
-
       const response = await this.aiService.sendMessage(prompt);
-console.log(response);
-
       if (this.loadingDiv) {
         this.loadingDiv.remove();
         this.loadingDiv = null;
@@ -309,12 +306,7 @@ console.log(response);
    * @param {boolean} typing 是否使用打字效果
    * @param {boolean} isInterrupted 是否是中断消息
    */
-  async addMessage(
-    content,
-    type,
-    typing = type === "assistant",
-    isInterrupted = false
-  ) {
+  async addMessage(content, type, typing = type === "assistant", isInterrupted = false) {
     const messageDiv = document.createElement("div");
     messageDiv.className = `message ${type}`;
 
@@ -351,7 +343,31 @@ console.log(response);
 
     if (typing) {
       messageContent.classList.add("typing");
-      await this.typeMessage(paragraph, content);
+      if (typeof content !== 'string') {
+        console.log(content);
+        console.log(content.controller);
+        const signal = content.controller.signal;
+        try {
+          const iterator = content.iterator();
+          for await (const chunk of iterator) {
+            if (chunk) {
+              console.log(chunk);
+              const decodedChunk = chunk.choices[0].delta.content;
+              if (decodedChunk) {
+                paragraph.innerHTML += decodedChunk;
+              }
+            }
+          }
+        } catch (error) {
+          if (signal.aborted) {
+            console.log("Stream reading aborted");
+          } else {
+            console.error("Error reading stream:", error);
+          }
+        }
+      } else {
+        await this.typeMessage(paragraph, content);
+      }
       messageContent.classList.remove("typing");
     } else {
       paragraph.innerHTML = this.formatMessage(content);
@@ -373,7 +389,7 @@ console.log(response);
    * @param {string} text 要显示的文字
    */
   async typeMessage(element, text) {
-   return  element.innerHTML = text;
+    return element.innerHTML = text;
     let index = 0;
     const rawText = text;
     const tempDiv = document.createElement("div");
@@ -751,7 +767,7 @@ console.log(response);
         this.loadingDiv = null;
       }
 
-      await this.addMessage(response, "assistant", true);
+      await this.addMessage(response, "assistant", false);
 
       // 将总结内容添加到上下文
       this.aiService.updateContext(prompt, "user");
@@ -809,12 +825,12 @@ console.log(response);
             // 调用AI服务理解数据
             const response = await this.aiService.sendMessage(prompt);
             console.log(response);
-            
+
             if (this.loadingDiv) {
               this.loadingDiv.remove();
               this.loadingDiv = null;
             }
-           0 &&  window.parent.postMessage({
+            0 && window.parent.postMessage({
               type: "HANDLE_FILL_INPUT", data: {
                 excelData: this.excelData,
                 formData: JSON.parse(response.split('json')[1].split('```')[0])  //根据不同返回修改res
@@ -852,7 +868,7 @@ console.log(response);
     const headers = data[0];
     const rows = data.slice(1);
     const sampleRows = rows.slice(0, 2);
-    console.log(); 
+    console.log();
     data[0].forEach((header, i) => {
       if (!this.excelData[header]) this.excelData[header] = []
       this.excelData[header].push(data[1][i])
@@ -923,7 +939,7 @@ ${this.iframeInfo}
 //             .join(", ")}`;
 //         })                                                                                                  
 //         .join("\n")}
-  
+
 // 等待DOM加载完成后再初始化
 document.addEventListener("DOMContentLoaded", () => {
   try {

+ 3 - 3
js/content.js

@@ -95,7 +95,7 @@ class SidebarManager {
       // 创建并触发 change 事件
       const changeEvent = new Event('change', { bubbles: true });
       element.dispatchEvent(changeEvent);
- 
+
       // 可选:如果表单使用了 React/Vue 等框架,可能还需要触发以下事件
       element.dispatchEvent(new Event('blur'));
       element.dispatchEvent(new KeyboardEvent('keyup', { key: 'Enter' }));
@@ -164,7 +164,7 @@ class SidebarManager {
               }
             }
           }
-          
+
           if (item.type === 'date') {
             formatDate
             const input = formChildren.find(child => child.id === item.findByValue)
@@ -232,7 +232,7 @@ class SidebarManager {
           );
         }
         if (event.data.type === "ANALYZE_PAGE") {
-          form = document.querySelectorAll("form")[0];
+          form = document.querySelectorAll("form")[1];
           formChildren = [...form.elements]
           // 分析页面并返回结果
           const pageInfo = window.pageAnalyzer.analyzePage();