浏览代码

fix: fix gemini pro streaming api duplicated issue (#3721)

* fix: streaming duplicated issue

* chore: remove debug logs

* chore: add types defination
Fred Liang 1 年之前
父节点
当前提交
a80502f7db
共有 1 个文件被更改,包括 23 次插入5 次删除
  1. 23 5
      app/client/platforms/google.ts

+ 23 - 5
app/client/platforms/google.ts

@@ -9,6 +9,7 @@ import { prettyObject } from "@/app/utils/format";
 import { getClientConfig } from "@/app/config/client";
 import { getClientConfig } from "@/app/config/client";
 import Locale from "../../locales";
 import Locale from "../../locales";
 import { getServerSideConfig } from "@/app/config/server";
 import { getServerSideConfig } from "@/app/config/server";
+import de from "@/app/locales/de";
 export class GeminiProApi implements LLMApi {
 export class GeminiProApi implements LLMApi {
   extractMessage(res: any) {
   extractMessage(res: any) {
     console.log("[Response] gemini-pro response: ", res);
     console.log("[Response] gemini-pro response: ", res);
@@ -87,9 +88,11 @@ export class GeminiProApi implements LLMApi {
           "streamGenerateContent",
           "streamGenerateContent",
         );
         );
         let finished = false;
         let finished = false;
+
+        let existingTexts: string[] = [];
         const finish = () => {
         const finish = () => {
           finished = true;
           finished = true;
-          options.onFinish(responseText + remainText);
+          options.onFinish(existingTexts.join(""));
         };
         };
 
 
         // animate response to make it looks smooth
         // animate response to make it looks smooth
@@ -134,11 +137,26 @@ export class GeminiProApi implements LLMApi {
 
 
               try {
               try {
                 let data = JSON.parse(ensureProperEnding(partialData));
                 let data = JSON.parse(ensureProperEnding(partialData));
-                console.log(data);
-                let fetchText = apiClient.extractMessage(data[data.length - 1]);
-                console.log("[Response Animation] fetchText: ", fetchText);
-                remainText += fetchText;
+
+                const textArray = data.reduce(
+                  (acc: string[], item: { candidates: any[] }) => {
+                    const texts = item.candidates.map((candidate) =>
+                      candidate.content.parts
+                        .map((part: { text: any }) => part.text)
+                        .join(""),
+                    );
+                    return acc.concat(texts);
+                  },
+                  [],
+                );
+
+                if (textArray.length > existingTexts.length) {
+                  const deltaArray = textArray.slice(existingTexts.length);
+                  existingTexts = textArray;
+                  remainText += deltaArray.join("");
+                }
               } catch (error) {
               } catch (error) {
+                // console.log("[Response Animation] error: ", error,partialData);
                 // skip error message when parsing json
                 // skip error message when parsing json
               }
               }