mirror of
https://github.com/Yidadaa/ChatGPT-Next-Web.git
synced 2025-08-08 16:15:50 +08:00
fix: #1498 missing text caused by streaming
This commit is contained in:
@@ -3,6 +3,7 @@ import { useAccessStore, useAppConfig, useChatStore } from "@/app/store";
|
||||
|
||||
import { ChatOptions, getHeaders, LLMApi, LLMUsage } from "../api";
|
||||
import Locale from "../../locales";
|
||||
import { fetchEventSource } from "@microsoft/fetch-event-source";
|
||||
|
||||
export class ChatGPTApi implements LLMApi {
|
||||
public ChatPath = "v1/chat/completions";
|
||||
@@ -71,40 +72,20 @@ export class ChatGPTApi implements LLMApi {
|
||||
options.onFinish(responseText);
|
||||
};
|
||||
|
||||
const res = await fetch(chatPath, chatPayload);
|
||||
clearTimeout(reqestTimeoutId);
|
||||
|
||||
if (res.status === 401) {
|
||||
responseText += "\n\n" + Locale.Error.Unauthorized;
|
||||
return finish();
|
||||
}
|
||||
|
||||
if (
|
||||
!res.ok ||
|
||||
!res.headers.get("Content-Type")?.includes("stream") ||
|
||||
!res.body
|
||||
) {
|
||||
return options.onError?.(new Error());
|
||||
}
|
||||
|
||||
const reader = res.body.getReader();
|
||||
const decoder = new TextDecoder("utf-8");
|
||||
|
||||
while (true) {
|
||||
const { done, value } = await reader.read();
|
||||
if (done) {
|
||||
return finish();
|
||||
}
|
||||
|
||||
const chunk = decoder.decode(value, { stream: true });
|
||||
const lines = chunk.split("data: ");
|
||||
|
||||
for (const line of lines) {
|
||||
const text = line.trim();
|
||||
if (line.startsWith("[DONE]")) {
|
||||
fetchEventSource(chatPath, {
|
||||
...chatPayload,
|
||||
async onopen(res) {
|
||||
clearTimeout(reqestTimeoutId);
|
||||
if (res.status === 401) {
|
||||
responseText += "\n\n" + Locale.Error.Unauthorized;
|
||||
return finish();
|
||||
}
|
||||
if (text.length === 0) continue;
|
||||
},
|
||||
onmessage(msg) {
|
||||
if (msg.data === "[DONE]") {
|
||||
return finish();
|
||||
}
|
||||
const text = msg.data;
|
||||
try {
|
||||
const json = JSON.parse(text);
|
||||
const delta = json.choices[0].delta.content;
|
||||
@@ -113,10 +94,16 @@ export class ChatGPTApi implements LLMApi {
|
||||
options.onUpdate?.(responseText, delta);
|
||||
}
|
||||
} catch (e) {
|
||||
console.error("[Request] parse error", text, chunk);
|
||||
console.error("[Request] parse error", text, msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
onclose() {
|
||||
finish();
|
||||
},
|
||||
onerror(e) {
|
||||
options.onError?.(e);
|
||||
},
|
||||
});
|
||||
} else {
|
||||
const res = await fetch(chatPath, chatPayload);
|
||||
clearTimeout(reqestTimeoutId);
|
||||
|
Reference in New Issue
Block a user