+
diff --git a/app/icons/pause.svg b/app/icons/pause.svg
new file mode 100644
index 00000000..382f7a93
--- /dev/null
+++ b/app/icons/pause.svg
@@ -0,0 +1 @@
+
diff --git a/app/requests.ts b/app/requests.ts
index c48ef281..db91f6fc 100644
--- a/app/requests.ts
+++ b/app/requests.ts
@@ -2,7 +2,7 @@ import type { ChatRequest, ChatResponse } from "./api/openai/typing";
import { Message, ModelConfig, useAccessStore, useChatStore } from "./store";
import { showToast } from "./components/ui-lib";
-const TIME_OUT_MS = 30000;
+const TIME_OUT_MS = 60000;
const makeRequestParam = (
messages: Message[],
@@ -167,15 +167,14 @@ export async function requestChatStream(
options?.onController?.(controller);
while (true) {
- // handle time out, will stop if no response in 10 secs
const resTimeoutId = setTimeout(() => finish(), TIME_OUT_MS);
const content = await reader?.read();
clearTimeout(resTimeoutId);
-
+
if (!content || !content.value) {
break;
}
-
+
const text = decoder.decode(content.value, { stream: true });
responseText += text;
@@ -235,6 +234,14 @@ export const ControllerPool = {
controller?.abort();
},
+ stopAll() {
+ Object.values(this.controllers).forEach((v) => v.abort());
+ },
+
+ hasPending() {
+ return Object.values(this.controllers).length > 0;
+ },
+
remove(sessionIndex: number, messageId: number) {
const key = this.key(sessionIndex, messageId);
delete this.controllers[key];
diff --git a/app/store/app.ts b/app/store/app.ts
index 81366890..c4c1c341 100644
--- a/app/store/app.ts
+++ b/app/store/app.ts
@@ -421,7 +421,7 @@ export const useChatStore = create
()(
onError(error, statusCode) {
if (statusCode === 401) {
botMessage.content = Locale.Error.Unauthorized;
- } else {
+ } else if (!error.message.includes("aborted")) {
botMessage.content += "\n\n" + Locale.Store.Error;
}
botMessage.streaming = false;
diff --git a/package.json b/package.json
index 9fcb74e7..9a3e6d41 100644
--- a/package.json
+++ b/package.json
@@ -9,7 +9,8 @@
"start": "next start",
"lint": "next lint",
"fetch": "node ./scripts/fetch-prompts.mjs",
- "prepare": "husky install"
+ "prepare": "husky install",
+ "proxy-dev": "sh ./scripts/init-proxy.sh && proxychains -f ./scripts/proxychains.conf yarn dev"
},
"dependencies": {
"@hello-pangea/dnd": "^16.2.0",
diff --git a/scripts/.gitignore b/scripts/.gitignore
new file mode 100644
index 00000000..80fe56c3
--- /dev/null
+++ b/scripts/.gitignore
@@ -0,0 +1 @@
+proxychains.conf
diff --git a/scripts/init-proxy.sh b/scripts/init-proxy.sh
new file mode 100644
index 00000000..acba064f
--- /dev/null
+++ b/scripts/init-proxy.sh
@@ -0,0 +1,5 @@
+dir="$(dirname "$0")"
+config=$dir/proxychains.conf
+host_ip=$(grep nameserver /etc/resolv.conf | sed 's/nameserver //')
+cp $dir/proxychains.template.conf $config
+sed -i "\$s/.*/http $host_ip 7890/" $config
diff --git a/scripts/proxychains.template.conf b/scripts/proxychains.template.conf
new file mode 100644
index 00000000..e78b96a6
--- /dev/null
+++ b/scripts/proxychains.template.conf
@@ -0,0 +1,12 @@
+strict_chain
+proxy_dns
+
+remote_dns_subnet 224
+
+tcp_read_time_out 15000
+tcp_connect_time_out 8000
+
+localnet 127.0.0.0/255.0.0.0
+
+[ProxyList]
+socks4 127.0.0.1 9050