summaryrefslogtreecommitdiffstats
path: root/g4f/gui
diff options
context:
space:
mode:
authorH Lohaus <hlohaus@users.noreply.github.com>2024-03-17 10:52:54 +0100
committerGitHub <noreply@github.com>2024-03-17 10:52:54 +0100
commit9536b857d67b2b9b819580eeb55c6a051454075f (patch)
tree6002f32229f616f16738c35d4b0a63d59b5ee378 /g4f/gui
parentUpdate GigaChat.py (diff)
parentFix abort in webview (diff)
downloadgpt4free-0.2.5.4.tar
gpt4free-0.2.5.4.tar.gz
gpt4free-0.2.5.4.tar.bz2
gpt4free-0.2.5.4.tar.lz
gpt4free-0.2.5.4.tar.xz
gpt4free-0.2.5.4.tar.zst
gpt4free-0.2.5.4.zip
Diffstat (limited to 'g4f/gui')
-rw-r--r--g4f/gui/__init__.py13
-rw-r--r--g4f/gui/client/static/js/chat.v1.js32
-rw-r--r--g4f/gui/server/api.py3
-rw-r--r--g4f/gui/webview.py8
4 files changed, 34 insertions, 22 deletions
diff --git a/g4f/gui/__init__.py b/g4f/gui/__init__.py
index dff720ac..3f695200 100644
--- a/g4f/gui/__init__.py
+++ b/g4f/gui/__init__.py
@@ -1,12 +1,13 @@
from ..errors import MissingRequirementsError
-try:
- from .server.app import app
- from .server.website import Website
- from .server.backend import Backend_Api
-except ImportError:
- raise MissingRequirementsError('Install "flask" package for the gui')
def run_gui(host: str = '0.0.0.0', port: int = 8080, debug: bool = False) -> None:
+ try:
+ from .server.app import app
+ from .server.website import Website
+ from .server.backend import Backend_Api
+ except ImportError:
+ raise MissingRequirementsError('Install "flask" package for the gui')
+
if debug:
import g4f
g4f.debug.logging = True
diff --git a/g4f/gui/client/static/js/chat.v1.js b/g4f/gui/client/static/js/chat.v1.js
index c2bb77a9..0da72988 100644
--- a/g4f/gui/client/static/js/chat.v1.js
+++ b/g4f/gui/client/static/js/chat.v1.js
@@ -19,6 +19,8 @@ const jailbreak = document.getElementById("jailbreak");
let prompt_lock = false;
+let content, content_inner, content_count = null;
+
const options = ["switch", "model", "model2", "jailbreak", "patch", "provider", "history"];
messageInput.addEventListener("blur", () => {
@@ -202,7 +204,7 @@ async function add_message_chunk(message) {
console.info("Conversation used:", message.conversation)
} else if (message.type == "provider") {
window.provider_result = message.provider;
- window.content.querySelector('.provider').innerHTML = `
+ content.querySelector('.provider').innerHTML = `
<a href="${message.provider.url}" target="_blank">
${message.provider.name}
</a>
@@ -210,10 +212,10 @@ async function add_message_chunk(message) {
`
} else if (message.type == "message") {
console.error(messag.message)
- return;
} else if (message.type == "error") {
+ window.error = message.error
console.error(message.error);
- window.content_inner.innerHTML += `<p><strong>An error occured:</strong> ${message.error}</p>`;
+ content_inner.innerHTML += `<p><strong>An error occured:</strong> ${message.error}</p>`;
} else if (message.type == "content") {
window.text += message.content;
html = markdown_render(window.text);
@@ -228,11 +230,10 @@ async function add_message_chunk(message) {
if (lastIndex) {
html = html.substring(0, lastIndex) + '<span id="cursor"></span>' + lastElement;
}
- window.content_inner.innerHTML = html;
- window.content_count.innerText = count_words_and_tokens(text, window.provider_result?.model);
- highlight(window.content_inner);
+ content_inner.innerHTML = html;
+ content_count.innerText = count_words_and_tokens(text, window.provider_result?.model);
+ highlight(content_inner);
}
-
window.scrollTo(0, 0);
if (message_box.scrollTop >= message_box.scrollHeight - message_box.clientHeight - 100) {
message_box.scrollTo({ top: message_box.scrollHeight, behavior: "auto" });
@@ -271,11 +272,12 @@ const ask_gpt = async () => {
window.controller = new AbortController();
window.text = "";
window.error = null;
+ window.abort = false;
window.provider_result = null;
- window.content = document.getElementById(`gpt_${window.token}`);
- window.content_inner = content.querySelector('.content_inner');
- window.content_count = content.querySelector('.count');
+ content = document.getElementById(`gpt_${window.token}`);
+ content_inner = content.querySelector('.content_inner');
+ content_count = content.querySelector('.count');
message_box.scrollTop = message_box.scrollHeight;
window.scrollTo(0, 0);
@@ -307,9 +309,6 @@ const ask_gpt = async () => {
error = true;
text = "oops ! something went wrong, please try again / reload. [stacktrace in console]";
content_inner.innerHTML = text;
- } else {
- content_inner.innerHTML += " [aborted]";
- if (text) text += " [aborted]";
}
}
if (!error && text) {
@@ -583,8 +582,13 @@ const load_conversations = async () => {
}
};
-document.getElementById(`cancelButton`).addEventListener(`click`, async () => {
+document.getElementById("cancelButton").addEventListener("click", async () => {
window.controller.abort();
+ if (!window.abort) {
+ window.abort = true;
+ content_inner.innerHTML += " [aborted]";
+ if (window.text) window.text += " [aborted]";
+ }
console.log(`aborted ${window.conversation_id}`);
});
diff --git a/g4f/gui/server/api.py b/g4f/gui/server/api.py
index 966319e4..4dfc43d4 100644
--- a/g4f/gui/server/api.py
+++ b/g4f/gui/server/api.py
@@ -80,7 +80,8 @@ class Api():
self._prepare_conversation_kwargs(options, kwargs),
options.get("conversation_id")
):
- window.evaluate_js(f"this.add_message_chunk({json.dumps(message)})")
+ if not window.evaluate_js(f"if (!this.abort) this.add_message_chunk({json.dumps(message)}); !this.abort && !this.error;"):
+ break
def _prepare_conversation_kwargs(self, json_data: dict, kwargs: dict):
"""
diff --git a/g4f/gui/webview.py b/g4f/gui/webview.py
index a8e745f3..ba764947 100644
--- a/g4f/gui/webview.py
+++ b/g4f/gui/webview.py
@@ -1,3 +1,5 @@
+import sys
+import os.path
import webview
try:
from platformdirs import user_config_dir
@@ -14,9 +16,13 @@ def run_webview(
debug: bool = False,
storage_path: str = None
):
+ if getattr(sys, 'frozen', False):
+ dirname = sys._MEIPASS
+ else:
+ dirname = os.path.dirname(__file__)
webview.create_window(
f"g4f - {g4f.version.utils.current_version}",
- "client/index.html",
+ os.path.join(dirname, "client/index.html"),
text_select=True,
js_api=Api(),
)