From 3b7b79f5bac793c2d76ab6c58f8d553859332ded Mon Sep 17 00:00:00 2001 From: Heiner Lohaus Date: Sun, 15 Dec 2024 12:23:04 +0100 Subject: [PATCH] Fix show html in gui --- g4f/client/service.py | 12 +++++++----- g4f/gui/client/static/js/chat.v1.js | 26 ++++++++++++-------------- g4f/gui/server/api.py | 3 ++- g4f/requests/raise_for_status.py | 6 ++++-- 4 files changed, 25 insertions(+), 22 deletions(-) diff --git a/g4f/client/service.py b/g4f/client/service.py index 80dc70df..aa0d4871 100644 --- a/g4f/client/service.py +++ b/g4f/client/service.py @@ -26,7 +26,8 @@ def get_model_and_provider(model : Union[Model, str], stream : bool, ignored : list[str] = None, ignore_working: bool = False, - ignore_stream: bool = False) -> tuple[str, ProviderType]: + ignore_stream: bool = False, + logging: bool = True) -> tuple[str, ProviderType]: """ Retrieves the model and provider based on input parameters. @@ -92,10 +93,11 @@ def get_model_and_provider(model : Union[Model, str], if not ignore_stream and not provider.supports_stream and stream: raise StreamNotSupportedError(f'{provider_name} does not support "stream" argument') - if model: - debug.log(f'Using {provider_name} provider and {model} model') - else: - debug.log(f'Using {provider_name} provider') + if logging: + if model: + debug.log(f'Using {provider_name} provider and {model} model') + else: + debug.log(f'Using {provider_name} provider') debug.last_provider = provider debug.last_model = model diff --git a/g4f/gui/client/static/js/chat.v1.js b/g4f/gui/client/static/js/chat.v1.js index 54853226..f8bd894d 100644 --- a/g4f/gui/client/static/js/chat.v1.js +++ b/g4f/gui/client/static/js/chat.v1.js @@ -503,7 +503,7 @@ async function add_message_chunk(message, message_id) { } else if (message.type == "error") { error_storage[message_id] = message.error console.error(message.error); - content_map.inner.innerHTML += `

An error occured: ${message.error}

`; + content_map.inner.innerHTML += markdown_render(`**An error occured:** ${message.error}`); let p = document.createElement("p"); p.innerText = message.error; log_storage.appendChild(p); @@ -609,7 +609,7 @@ const ask_gpt = async (message_id, message_index = -1, regenerate = false, provi const files = input && input.files.length > 0 ? input.files : null; const auto_continue = document.getElementById("auto_continue")?.checked; const download_images = document.getElementById("download_images")?.checked; - let api_key = get_api_key_by_provider(provider); + const api_key = get_api_key_by_provider(provider); const ignored = Array.from(settings.querySelectorAll("input.provider:not(:checked)")).map((el)=>el.value); await api("conversation", { id: message_id, @@ -635,7 +635,7 @@ const ask_gpt = async (message_id, message_index = -1, regenerate = false, provi console.error(e); if (e.name != "AbortError") { error_storage[message_id] = true; - content_map.inner.innerHTML += `

An error occured: ${e}

`; + content_map.inner.innerHTML += markdown_render(`**An error occured:** ${e}`); } } delete controller_storage[message_id]; @@ -771,7 +771,6 @@ const set_conversation = async (conversation_id) => { await load_conversation(conversation_id); load_conversations(); hide_sidebar(); - log_storage.classList.add("hidden"); }; const new_conversation = async () => { @@ -785,7 +784,6 @@ const new_conversation = async () => { } load_conversations(); hide_sidebar(); - log_storage.classList.add("hidden"); say_hello(); }; @@ -1104,10 +1102,10 @@ async function hide_sidebar() { window.addEventListener('popstate', hide_sidebar, false); -sidebar_button.addEventListener("click", (event) => { +sidebar_button.addEventListener("click", async () => { settings.classList.add("hidden"); if (sidebar.classList.contains("shown")) { - hide_sidebar(); + await hide_sidebar(); } else { sidebar.classList.add("shown"); sidebar_button.classList.add("rotated"); @@ -1365,11 +1363,10 @@ async function on_api() { option = document.createElement("div"); option.classList.add("field"); option.innerHTML = ` -
- Enable ${provider.label} - - -
`; + Enable ${provider.label} + + + `; option.querySelector("input").addEventListener("change", (event) => load_provider_option(event.target, provider.name)); settings.querySelector(".paper").appendChild(option); provider_options[provider.name] = option; @@ -1405,7 +1402,7 @@ async function on_api() { }); document.querySelector(".slide-systemPrompt")?.addEventListener("click", () => { hide_systemPrompt.click(); - let checked = hide_systemPrompt.checked; + const checked = hide_systemPrompt.checked; systemPrompt.classList[checked ? "add": "remove"]("hidden"); slide_systemPrompt_icon.classList[checked ? "remove": "add"]("fa-angles-up"); slide_systemPrompt_icon.classList[checked ? "add": "remove"]("fa-angles-down"); @@ -1599,8 +1596,9 @@ function get_api_key_by_provider(provider) { let api_key = null; if (provider) { api_key = document.getElementById(`${provider}-api_key`)?.value || null; - if (api_key == null) + if (api_key == null) { api_key = document.querySelector(`.${provider}-api_key`)?.value || null; + } } return api_key; } diff --git a/g4f/gui/server/api.py b/g4f/gui/server/api.py index 877d47f2..d811bfc3 100644 --- a/g4f/gui/server/api.py +++ b/g4f/gui/server/api.py @@ -130,7 +130,8 @@ class Api: model, provider_handler = get_model_and_provider( kwargs.get("model"), provider, stream=True, - ignore_stream=True + ignore_stream=True, + logging=False ) first = True try: diff --git a/g4f/requests/raise_for_status.py b/g4f/requests/raise_for_status.py index 3566ead2..2864132a 100644 --- a/g4f/requests/raise_for_status.py +++ b/g4f/requests/raise_for_status.py @@ -29,8 +29,8 @@ async def raise_for_status_async(response: Union[StreamResponse, ClientResponse] elif response.status == 403 and is_openai(message): raise ResponseStatusError(f"Response {response.status}: OpenAI Bot detected") elif not response.ok: - if "" in message: - message = "HTML content" + if message is None and response.headers.get("content-type") == "text/html": + message = "Bad gateway" if response.status == 502 else "HTML content" raise ResponseStatusError(f"Response {response.status}: {message}") def raise_for_status(response: Union[Response, StreamResponse, ClientResponse, RequestsResponse], message: str = None): @@ -42,4 +42,6 @@ def raise_for_status(response: Union[Response, StreamResponse, ClientResponse, R elif response.status_code == 403 and is_cloudflare(response.text): raise CloudflareError(f"Response {response.status_code}: Cloudflare detected") elif not response.ok: + if message is None and response.headers.get("content-type") == "text/html": + message = "Bad gateway" if response.status_code == 502 else "HTML content" raise ResponseStatusError(f"Response {response.status_code}: {response.text if message is None else message}") \ No newline at end of file