From 5cbbe2fd3d2ec37d990c33f2d72018e526936c6f Mon Sep 17 00:00:00 2001 From: hlohaus <983577+hlohaus@users.noreply.github.com> Date: Mon, 24 Feb 2025 08:53:43 +0100 Subject: Fix model and provider in chat completion response Add login button to HuggingFace demo Custom conversation ids in chat ui Remove rate limiter in demo mode Improve YouTube support in Gemini --- g4f/gui/client/static/js/chat.v1.js | 76 ++++++++++++++++++++++++++----------- 1 file changed, 54 insertions(+), 22 deletions(-) (limited to 'g4f/gui/client/static') diff --git a/g4f/gui/client/static/js/chat.v1.js b/g4f/gui/client/static/js/chat.v1.js index 9537f78c..66845ba7 100644 --- a/g4f/gui/client/static/js/chat.v1.js +++ b/g4f/gui/client/static/js/chat.v1.js @@ -39,6 +39,7 @@ let finish_storage = {}; let usage_storage = {}; let reasoning_storage = {}; let generate_storage = {}; +let title_ids_storage = {}; let is_demo = false; let wakeLock = null; let countTokensEnabled = true; @@ -74,6 +75,8 @@ if (window.markdownit) { ) .replaceAll("', '') + .replaceAll('<i class="', '') } } @@ -301,7 +304,9 @@ const register_message_buttons = async () => { const conversation = await get_conversation(window.conversation_id); let buffer = ""; conversation.items.forEach(message => { - buffer += render_reasoning_text(message.reasoning); + if (message.reasoning) { + buffer += render_reasoning_text(message.reasoning); + } buffer += `${message.role == 'user' ? 'User' : 'Assistant'}: ${message.content.trim()}\n\n\n`; }); var download = document.getElementById("download"); @@ -435,25 +440,27 @@ const handle_ask = async (do_ask_gpt = true) => { imageInput.dataset.objects = images.join(" "); } } - message_box.innerHTML += ` -
-
- ${user_image} - - + const message_el = document.createElement("div"); + message_el.classList.add("message"); + message_el.dataset.index = message_index; + message_el.innerHTML = ` +
+ ${user_image} + + +
+
+
+ ${markdown_render(message)} + ${images.map((object)=>`Image upload`).join("")}
-
-
- ${markdown_render(message)} - ${images.map((object)=>'Image upload').join("")} -
-
- ${countTokensEnabled ? count_words_and_tokens(message, get_selected_model()?.value) : ""} -
+
+ ${countTokensEnabled ? count_words_and_tokens(message, get_selected_model()?.value) : ""}
`; - highlight(message_box); + message_box.appendChild(message_el); + highlight(message_el); if (do_ask_gpt) { const all_pinned = document.querySelectorAll(".buttons button.pinned") if (all_pinned.length > 0) { @@ -1012,7 +1019,7 @@ const ask_gpt = async (message_id, message_index = -1, regenerate = false, provi } try { let api_key; - if (is_demo && provider == "Feature") { + if (is_demo && ["OpenaiChat", "DeepSeekAPI", "PollinationsAI"].includes(provider)) { api_key = localStorage.getItem("user"); } else if (["HuggingSpace", "G4F"].includes(provider)) { api_key = localStorage.getItem("HuggingSpace-api_key"); @@ -1096,9 +1103,30 @@ const clear_conversation = async () => { } }; +var illegalRe = /[\/\?<>\\:\*\|":]/g; +var controlRe = /[\x00-\x1f\x80-\x9f]/g; +var reservedRe = /^\.+$/; +var windowsReservedRe = /^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\..*)?$/i; + +function sanitize(input, replacement) { + var sanitized = input + .replace(illegalRe, replacement) + .replace(controlRe, replacement) + .replace(reservedRe, replacement) + .replace(windowsReservedRe, replacement); + return sanitized.replaceAll(/\/|#|\s{2,}/g, replacement).trim(); +} + async function set_conversation_title(conversation_id, title) { conversation = await get_conversation(conversation_id) conversation.new_title = title; + const new_id = sanitize(title, " "); + if (new_id && !appStorage.getItem(`conversation:${new_id}`)) { + appStorage.removeItem(`conversation:${conversation.id}`); + title_ids_storage[conversation_id] = new_id; + conversation.id = new_id; + add_url_to_history(`/chat/${conversation_id}`); + } appStorage.setItem( `conversation:${conversation.id}`, JSON.stringify(conversation) @@ -1123,6 +1151,7 @@ const show_option = async (conversation_id) => { input_el.onclick = (e) => e.stopPropagation() input_el.onfocus = () => trash_el.style.display = "none"; input_el.onchange = () => set_conversation_title(conversation_id, input_el.value); + input_el.onblur = () => set_conversation_title(conversation_id, input_el.value); left_el.removeChild(title_el); left_el.appendChild(input_el); } @@ -1162,6 +1191,9 @@ const delete_conversation = async (conversation_id) => { }; const set_conversation = async (conversation_id) => { + if (title_ids_storage[conversation_id]) { + conversation_id = title_ids_storage[conversation_id]; + } try { add_url_to_history(`/chat/${conversation_id}`); } catch (e) { @@ -1912,11 +1944,11 @@ async function on_load() { messageInput.focus(); //await handle_ask(); } - } else if (/\/chat\/[^?]+/.test(window.location.href)) { - load_conversation(window.conversation_id); - } else { + } else if (/\/chat\/[?$]/.test(window.location.href)) { chatPrompt.value = document.getElementById("systemPrompt")?.value || ""; say_hello(); + } else { + load_conversation(window.conversation_id); } load_conversations(); } @@ -2007,7 +2039,8 @@ async function on_api() { } providerSelect.innerHTML = ` - + + @@ -2340,7 +2373,6 @@ fileInput.addEventListener('change', async (event) => { Object.keys(data).forEach(key => { if (key == "options") { Object.keys(data[key]).forEach(keyOption => { - console.log(keyOption, data[key][keyOption]); appStorage.setItem(keyOption, data[key][keyOption]); count += 1; }); -- cgit v1.2.3 From ee9e0c38268ae01acce4245782bb306d9cf800e5 Mon Sep 17 00:00:00 2001 From: hlohaus <983577+hlohaus@users.noreply.github.com> Date: Mon, 24 Feb 2025 15:50:50 +0100 Subject: Add Gemini provider to Demo --- g4f/gui/client/static/js/chat.v1.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'g4f/gui/client/static') diff --git a/g4f/gui/client/static/js/chat.v1.js b/g4f/gui/client/static/js/chat.v1.js index 66845ba7..68641b8e 100644 --- a/g4f/gui/client/static/js/chat.v1.js +++ b/g4f/gui/client/static/js/chat.v1.js @@ -1019,7 +1019,7 @@ const ask_gpt = async (message_id, message_index = -1, regenerate = false, provi } try { let api_key; - if (is_demo && ["OpenaiChat", "DeepSeekAPI", "PollinationsAI"].includes(provider)) { + if (is_demo && ["OpenaiChat", "DeepSeekAPI", "PollinationsAI", "Gemini"].includes(provider)) { api_key = localStorage.getItem("user"); } else if (["HuggingSpace", "G4F"].includes(provider)) { api_key = localStorage.getItem("HuggingSpace-api_key"); @@ -2043,6 +2043,7 @@ async function on_api() { + `; -- cgit v1.2.3