返回提交历史
Modified
g4f/Provider/selenium/Bard.py
+1
-1
Modified
g4f/Provider/selenium/Phind.py
+1
-1
Modified
g4f/gui/__init__.py
+7
-6
Modified
g4f/gui/client/static/js/chat.v1.js
+18
-14
Modified
g4f/gui/server/api.py
+2
-1
Modified
g4f/gui/webview.py
+7
-1
XFEstudio/gpt4free
Fix abort in webview
b5b56f35
代码差异
6 个文件
+36
-24
@@ -18,7 +18,7 @@ from ...webdriver import WebDriver, WebDriverSession, element_send_text
18
18
19
19
class Bard(AbstractProvider):
20
20
url = "https://bard.google.com"
21
working = True
21
working = False
22
22
needs_auth = True
23
23
webdriver = True
24
24
@@ -10,7 +10,7 @@ from ...webdriver import WebDriver, WebDriverSession
10
10
11
11
class Phind(AbstractProvider):
12
12
url = "https://www.phind.com"
13
working = True
13
working = False
14
14
supports_gpt_4 = True
15
15
supports_stream = True
16
16
@@ -1,12 +1,13 @@
1
1
from ..errors import MissingRequirementsError
2
try:
3
from .server.app import app
4
from .server.website import Website
5
from .server.backend import Backend_Api
6
except ImportError:
7
raise MissingRequirementsError('Install "flask" package for the gui')
8
2
9
3
def run_gui(host: str = '0.0.0.0', port: int = 8080, debug: bool = False) -> None:
4
try:
5
from .server.app import app
6
from .server.website import Website
7
from .server.backend import Backend_Api
8
except ImportError:
9
raise MissingRequirementsError('Install "flask" package for the gui')
10
10
11
if debug:
11
12
import g4f
12
13
g4f.debug.logging = True
@@ -19,6 +19,8 @@ const jailbreak = document.getElementById("jailbreak");
19
19
20
20
let prompt_lock = false;
21
21
22
let content, content_inner, content_count = null;
23
22
24
const options = ["switch", "model", "model2", "jailbreak", "patch", "provider", "history"];
23
25
24
26
messageInput.addEventListener("blur", () => {
@@ -202,7 +204,7 @@ async function add_message_chunk(message) {
202
204
console.info("Conversation used:", message.conversation)
203
205
} else if (message.type == "provider") {
204
206
window.provider_result = message.provider;
205
window.content.querySelector('.provider').innerHTML = `
207
content.querySelector('.provider').innerHTML = `
206
208
<a href="${message.provider.url}" target="_blank">
207
209
${message.provider.name}
208
210
</a>
@@ -210,10 +212,10 @@ async function add_message_chunk(message) {
210
212
`
211
213
} else if (message.type == "message") {
212
214
console.error(messag.message)
213
return;
214
215
} else if (message.type == "error") {
216
window.error = message.error
215
217
console.error(message.error);
216
window.content_inner.innerHTML += `<p><strong>An error occured:</strong> ${message.error}</p>`;
218
content_inner.innerHTML += `<p><strong>An error occured:</strong> ${message.error}</p>`;
217
219
} else if (message.type == "content") {
218
220
window.text += message.content;
219
221
html = markdown_render(window.text);
@@ -228,11 +230,10 @@ async function add_message_chunk(message) {
228
230
if (lastIndex) {
229
231
html = html.substring(0, lastIndex) + '<span id="cursor"></span>' + lastElement;
230
232
}
231
window.content_inner.innerHTML = html;
232
window.content_count.innerText = count_words_and_tokens(text, window.provider_result?.model);
233
highlight(window.content_inner);
233
content_inner.innerHTML = html;
234
content_count.innerText = count_words_and_tokens(text, window.provider_result?.model);
235
highlight(content_inner);
234
236
}
235
236
237
window.scrollTo(0, 0);
237
238
if (message_box.scrollTop >= message_box.scrollHeight - message_box.clientHeight - 100) {
238
239
message_box.scrollTo({ top: message_box.scrollHeight, behavior: "auto" });
@@ -271,11 +272,12 @@ const ask_gpt = async () => {
271
272
window.controller = new AbortController();
272
273
window.text = "";
273
274
window.error = null;
275
window.abort = false;
274
276
window.provider_result = null;
275
277
276
window.content = document.getElementById(`gpt_${window.token}`);
277
window.content_inner = content.querySelector('.content_inner');
278
window.content_count = content.querySelector('.count');
278
content = document.getElementById(`gpt_${window.token}`);
279
content_inner = content.querySelector('.content_inner');
280
content_count = content.querySelector('.count');
279
281
280
282
message_box.scrollTop = message_box.scrollHeight;
281
283
window.scrollTo(0, 0);
@@ -307,9 +309,6 @@ const ask_gpt = async () => {
307
309
error = true;
308
310
text = "oops ! something went wrong, please try again / reload. [stacktrace in console]";
309
311
content_inner.innerHTML = text;
310
} else {
311
content_inner.innerHTML += " [aborted]";
312
if (text) text += " [aborted]";
313
312
}
314
313
}
315
314
if (!error && text) {
@@ -583,8 +582,13 @@ const load_conversations = async () => {
583
582
}
584
583
};
585
584
586
document.getElementById(`cancelButton`).addEventListener(`click`, async () => {
585
document.getElementById("cancelButton").addEventListener("click", async () => {
587
586
window.controller.abort();
587
if (!window.abort) {
588
window.abort = true;
589
content_inner.innerHTML += " [aborted]";
590
if (window.text) window.text += " [aborted]";
591
}
588
592
console.log(`aborted ${window.conversation_id}`);
589
593
});
590
594
@@ -80,7 +80,8 @@ class Api():
80
80
self._prepare_conversation_kwargs(options, kwargs),
81
81
options.get("conversation_id")
82
82
):
83
window.evaluate_js(f"this.add_message_chunk({json.dumps(message)})")
83
if not window.evaluate_js(f"if (!this.abort) this.add_message_chunk({json.dumps(message)}); !this.abort && !this.error;"):
84
break
84
85
85
86
def _prepare_conversation_kwargs(self, json_data: dict, kwargs: dict):
86
87
"""
@@ -1,3 +1,5 @@
1
import sys
2
import os.path
1
3
import webview
2
4
try:
3
5
from platformdirs import user_config_dir
@@ -14,9 +16,13 @@ def run_webview(
14
16
debug: bool = False,
15
17
storage_path: str = None
16
18
):
19
if getattr(sys, 'frozen', False):
20
dirname = sys._MEIPASS
21
else:
22
dirname = os.path.dirname(__file__)
17
23
webview.create_window(
18
24
f"g4f - {g4f.version.utils.current_version}",
19
"client/index.html",
25
os.path.join(dirname, "client/index.html"),
20
26
text_select=True,
21
27
js_api=Api(),
22
28
)