summaryrefslogtreecommitdiffstats
path: root/g4f/gui
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--g4f/gui/client/html/index.html5
-rw-r--r--g4f/gui/client/js/chat.v1.js26
-rw-r--r--g4f/gui/server/backend.py26
-rw-r--r--g4f/gui/server/internet.py2
4 files changed, 40 insertions, 19 deletions
diff --git a/g4f/gui/client/html/index.html b/g4f/gui/client/html/index.html
index da7aeefb..b47f2a37 100644
--- a/g4f/gui/client/html/index.html
+++ b/g4f/gui/client/html/index.html
@@ -125,6 +125,11 @@
<span class="about">Web Access</span>
</div>
<div class="field">
+ <input type="checkbox" id="patch" />
+ <label for="patch" title="Works only with Bing and some other providers"></label>
+ <span class="about">Image Generator</span>
+ </div>
+ <div class="field">
<select name="model" id="model">
<option value="gpt-3.5-turbo" selected="">gpt-3.5-turbo</option>
<option value="gpt-3.5-turbo-0613">gpt-3.5-turbo-0613</option>
diff --git a/g4f/gui/client/js/chat.v1.js b/g4f/gui/client/js/chat.v1.js
index a335a3cc..9d49d24e 100644
--- a/g4f/gui/client/js/chat.v1.js
+++ b/g4f/gui/client/js/chat.v1.js
@@ -20,7 +20,10 @@ message_input.addEventListener("focus", () => {
});
const markdown_render = (content) => {
- return markdown.render(content)
+ return markdown.render(content
+ .replaceAll(/<!--.+-->/gm, "")
+ .replaceAll(/<img data-prompt="[^>]+">/gm, "")
+ )
.replaceAll("<a href=", '<a target="_blank" href=')
.replaceAll('<code>', '<code class="language-plaintext">')
}
@@ -68,6 +71,15 @@ const ask_gpt = async () => {
regenerate.classList.add(`regenerate-hidden`);
messages = await get_messages(window.conversation_id);
+ // Remove generated images from history
+ for (i in messages) {
+ messages[i]["content"] = messages[i]["content"].replace(
+ /<!-- generated images start -->[\s\S]+<!-- generated images end -->/m,
+ ""
+ )
+ delete messages[i]["provider"];
+ }
+
window.scrollTo(0, 0);
window.controller = new AbortController();
@@ -91,7 +103,8 @@ const ask_gpt = async () => {
</div>
<div class="content" id="gpt_${window.token}">
<div class="provider"></div>
- <div class="content_inner"><div id="cursor"></div></div>
+ <div class="content_inner"></div>
+ <div id="cursor"></div>
</div>
</div>
`;
@@ -115,6 +128,7 @@ const ask_gpt = async () => {
jailbreak: jailbreak.options[jailbreak.selectedIndex].value,
internet_access: document.getElementById(`switch`).checked,
provider: provider.options[provider.selectedIndex].value,
+ patch_provider: document.getElementById('patch').checked,
meta: {
id: window.token,
content: {
@@ -163,8 +177,6 @@ const ask_gpt = async () => {
} catch (e) {
console.log(e);
- let cursorDiv = document.getElementById(`cursor`);
- if (cursorDiv) cursorDiv.parentNode.removeChild(cursorDiv);
if (e.name != `AbortError`) {
text = `oops ! something went wrong, please try again / reload. [stacktrace in console]`;
@@ -174,6 +186,8 @@ const ask_gpt = async () => {
text += ` [aborted]`
}
}
+ let cursorDiv = document.getElementById(`cursor`);
+ if (cursorDiv) cursorDiv.parentNode.removeChild(cursorDiv);
add_message(window.conversation_id, "assistant", text, provider);
message_box.scrollTop = message_box.scrollHeight;
await remove_cancel_button();
@@ -430,7 +444,7 @@ document.querySelector(".mobile-sidebar").addEventListener("click", (event) => {
});
const register_settings_localstorage = async () => {
- settings_ids = ["switch", "model", "jailbreak"];
+ settings_ids = ["switch", "model", "jailbreak", "patch", "provider"];
settings_elements = settings_ids.map((id) => document.getElementById(id));
settings_elements.map((element) =>
element.addEventListener(`change`, async (event) => {
@@ -449,7 +463,7 @@ const register_settings_localstorage = async () => {
};
const load_settings_localstorage = async () => {
- settings_ids = ["switch", "model", "jailbreak"];
+ settings_ids = ["switch", "model", "jailbreak", "patch", "provider"];
settings_elements = settings_ids.map((id) => document.getElementById(id));
settings_elements.map((element) => {
if (localStorage.getItem(element.id)) {
diff --git a/g4f/gui/server/backend.py b/g4f/gui/server/backend.py
index 595f5aa1..67f13de4 100644
--- a/g4f/gui/server/backend.py
+++ b/g4f/gui/server/backend.py
@@ -1,11 +1,11 @@
import logging
-import g4f
-from g4f.Provider import __providers__
-
import json
-from flask import request, Flask
-from .internet import get_search_message
-from g4f import debug, version
+from flask import request, Flask
+from g4f import debug, version, models
+from g4f import _all_models, get_last_provider, ChatCompletion
+from g4f.Provider import __providers__
+from g4f.Provider.bing.create_images import patch_provider
+from .internet import get_search_message
debug.logging = True
@@ -45,7 +45,7 @@ class Backend_Api:
return 'ok', 200
def models(self):
- return g4f._all_models
+ return _all_models
def providers(self):
return [
@@ -69,25 +69,27 @@ class Backend_Api:
if request.json.get('internet_access'):
messages[-1]["content"] = get_search_message(messages[-1]["content"])
model = request.json.get('model')
- model = model if model else g4f.models.default
+ model = model if model else models.default
provider = request.json.get('provider', '').replace('g4f.Provider.', '')
provider = provider if provider and provider != "Auto" else None
-
+ patch = patch_provider if request.json.get('patch_provider') else None
+
def try_response():
try:
first = True
- for chunk in g4f.ChatCompletion.create(
+ for chunk in ChatCompletion.create(
model=model,
provider=provider,
messages=messages,
stream=True,
- ignore_stream_and_auth=True
+ ignore_stream_and_auth=True,
+ patch_provider=patch
):
if first:
first = False
yield json.dumps({
'type' : 'provider',
- 'provider': g4f.get_last_provider(True)
+ 'provider': get_last_provider(True)
}) + "\n"
yield json.dumps({
'type' : 'content',
diff --git a/g4f/gui/server/internet.py b/g4f/gui/server/internet.py
index 97f842d7..6c2e3a89 100644
--- a/g4f/gui/server/internet.py
+++ b/g4f/gui/server/internet.py
@@ -145,5 +145,5 @@ User request:
"""
return message
except Exception as e:
- print("Couldn't search DuckDuckGo:", e)
+ print("Couldn't do web search:", e)
return prompt