Fix abort in webview

This commit is contained in:
Heiner Lohaus 2024-03-17 10:51:08 +01:00
parent 8ed63693e4
commit b5b56f35ca
6 changed files with 36 additions and 24 deletions

View file

@ -18,7 +18,7 @@ from ...webdriver import WebDriver, WebDriverSession, element_send_text
class Bard(AbstractProvider): class Bard(AbstractProvider):
url = "https://bard.google.com" url = "https://bard.google.com"
working = True working = False
needs_auth = True needs_auth = True
webdriver = True webdriver = True

View file

@ -10,7 +10,7 @@ from ...webdriver import WebDriver, WebDriverSession
class Phind(AbstractProvider): class Phind(AbstractProvider):
url = "https://www.phind.com" url = "https://www.phind.com"
working = True working = False
supports_gpt_4 = True supports_gpt_4 = True
supports_stream = True supports_stream = True

View file

@ -1,12 +1,13 @@
from ..errors import MissingRequirementsError 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: 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: if debug:
import g4f import g4f
g4f.debug.logging = True g4f.debug.logging = True

View file

@ -19,6 +19,8 @@ const jailbreak = document.getElementById("jailbreak");
let prompt_lock = false; let prompt_lock = false;
let content, content_inner, content_count = null;
const options = ["switch", "model", "model2", "jailbreak", "patch", "provider", "history"]; const options = ["switch", "model", "model2", "jailbreak", "patch", "provider", "history"];
messageInput.addEventListener("blur", () => { messageInput.addEventListener("blur", () => {
@ -202,7 +204,7 @@ async function add_message_chunk(message) {
console.info("Conversation used:", message.conversation) console.info("Conversation used:", message.conversation)
} else if (message.type == "provider") { } else if (message.type == "provider") {
window.provider_result = message.provider; window.provider_result = message.provider;
window.content.querySelector('.provider').innerHTML = ` content.querySelector('.provider').innerHTML = `
<a href="${message.provider.url}" target="_blank"> <a href="${message.provider.url}" target="_blank">
${message.provider.name} ${message.provider.name}
</a> </a>
@ -210,10 +212,10 @@ async function add_message_chunk(message) {
` `
} else if (message.type == "message") { } else if (message.type == "message") {
console.error(messag.message) console.error(messag.message)
return;
} else if (message.type == "error") { } else if (message.type == "error") {
window.error = message.error
console.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") { } else if (message.type == "content") {
window.text += message.content; window.text += message.content;
html = markdown_render(window.text); html = markdown_render(window.text);
@ -228,11 +230,10 @@ async function add_message_chunk(message) {
if (lastIndex) { if (lastIndex) {
html = html.substring(0, lastIndex) + '<span id="cursor"></span>' + lastElement; html = html.substring(0, lastIndex) + '<span id="cursor"></span>' + lastElement;
} }
window.content_inner.innerHTML = html; content_inner.innerHTML = html;
window.content_count.innerText = count_words_and_tokens(text, window.provider_result?.model); content_count.innerText = count_words_and_tokens(text, window.provider_result?.model);
highlight(window.content_inner); highlight(content_inner);
} }
window.scrollTo(0, 0); window.scrollTo(0, 0);
if (message_box.scrollTop >= message_box.scrollHeight - message_box.clientHeight - 100) { if (message_box.scrollTop >= message_box.scrollHeight - message_box.clientHeight - 100) {
message_box.scrollTo({ top: message_box.scrollHeight, behavior: "auto" }); message_box.scrollTo({ top: message_box.scrollHeight, behavior: "auto" });
@ -271,11 +272,12 @@ const ask_gpt = async () => {
window.controller = new AbortController(); window.controller = new AbortController();
window.text = ""; window.text = "";
window.error = null; window.error = null;
window.abort = false;
window.provider_result = null; window.provider_result = null;
window.content = document.getElementById(`gpt_${window.token}`); content = document.getElementById(`gpt_${window.token}`);
window.content_inner = content.querySelector('.content_inner'); content_inner = content.querySelector('.content_inner');
window.content_count = content.querySelector('.count'); content_count = content.querySelector('.count');
message_box.scrollTop = message_box.scrollHeight; message_box.scrollTop = message_box.scrollHeight;
window.scrollTo(0, 0); window.scrollTo(0, 0);
@ -307,9 +309,6 @@ const ask_gpt = async () => {
error = true; error = true;
text = "oops ! something went wrong, please try again / reload. [stacktrace in console]"; text = "oops ! something went wrong, please try again / reload. [stacktrace in console]";
content_inner.innerHTML = text; content_inner.innerHTML = text;
} else {
content_inner.innerHTML += " [aborted]";
if (text) text += " [aborted]";
} }
} }
if (!error && text) { 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(); 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}`); console.log(`aborted ${window.conversation_id}`);
}); });

View file

@ -80,7 +80,8 @@ class Api():
self._prepare_conversation_kwargs(options, kwargs), self._prepare_conversation_kwargs(options, kwargs),
options.get("conversation_id") 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): def _prepare_conversation_kwargs(self, json_data: dict, kwargs: dict):
""" """

View file

@ -1,3 +1,5 @@
import sys
import os.path
import webview import webview
try: try:
from platformdirs import user_config_dir from platformdirs import user_config_dir
@ -14,9 +16,13 @@ def run_webview(
debug: bool = False, debug: bool = False,
storage_path: str = None storage_path: str = None
): ):
if getattr(sys, 'frozen', False):
dirname = sys._MEIPASS
else:
dirname = os.path.dirname(__file__)
webview.create_window( webview.create_window(
f"g4f - {g4f.version.utils.current_version}", f"g4f - {g4f.version.utils.current_version}",
"client/index.html", os.path.join(dirname, "client/index.html"),
text_select=True, text_select=True,
js_api=Api(), js_api=Api(),
) )