From 575f8a28293b269caca539bf1687ca597c137beb Mon Sep 17 00:00:00 2001 From: G-Fourteen Date: Thu, 11 Sep 2025 13:38:08 -0600 Subject: [PATCH] Use POST Pollinations endpoint --- chat-core.js | 127 +++++++++++++++++++++++++++---------------------- screensaver.js | 43 +++++++++-------- storage.js | 7 ++- ui.js | 35 +++++++------- 4 files changed, 118 insertions(+), 94 deletions(-) diff --git a/chat-core.js b/chat-core.js index 7155830..bb409a4 100644 --- a/chat-core.js +++ b/chat-core.js @@ -469,64 +469,75 @@ document.addEventListener("DOMContentLoaded", () => { } } - let prompt = window.aiInstructions; - const memories = Memory.getMemories(); - if (memories?.length) { - prompt += `\nRelevant memory:\n${memories.join("\n")}\nUse it in your response.`; - } - - const HISTORY = 10; - const end = currentSession.messages.length - 1; - const start = Math.max(0, end - HISTORY); - for (let i = start; i < end; i++) { - const m = currentSession.messages[i]; - prompt += `\n${m.role === "ai" ? "AI" : "User"}: ${m.content}`; - } - - const lastUser = overrideContent || currentSession.messages[end]?.content; - if (lastUser) { - prompt += `\nUser: ${lastUser}`; - } - - const modelSelectEl = document.getElementById("model-select"); - const model = modelSelectEl?.value || currentSession.model; - if (!model) throw new Error("No model selected"); - const apiUrl = `https://text.pollinations.ai/${encodeURIComponent(prompt)}?model=${encodeURIComponent(model)}`; - - try { - const res = await window.pollinationsFetch(apiUrl, { - method: "GET", - headers: { "Accept": "text/plain" } - }, { timeoutMs: 45000 }); - const aiContentRaw = await res.text(); - - loadingDiv.remove(); - - let aiContent = aiContentRaw; - - const memRegex = /\[memory\]([\s\S]*?)\[\/memory\]/gi; - let m; - while ((m = memRegex.exec(aiContent)) !== null) Memory.addMemoryEntry(m[1].trim()); - aiContent = aiContent.replace(memRegex, "").trim(); - - window.addNewMessage({ role: "ai", content: aiContent }); - if (autoSpeakEnabled) { - const sentences = aiContent.split(/(?<=[.!?])\s+/).filter(s => s.trim().length > 0); - speakSentences(sentences); - } else { - stopSpeaking(); - } - if (callback) callback(); - } catch (err) { - loadingDiv.textContent = "Error: Failed to get a response."; - setTimeout(() => loadingDiv.remove(), 3000); - console.error("Pollinations error:", err); - if (callback) callback(); - const btn = window._chatInternals?.sendButton || document.getElementById("send-button"); - const input = window._chatInternals?.chatInput || document.getElementById("chat-input"); - if (btn) btn.disabled = false; - if (input) input.disabled = false; - } + const messages = []; + if (window.aiInstructions) { + messages.push({ role: "system", content: window.aiInstructions }); + } + const memories = Memory.getMemories(); + if (memories?.length) { + messages.push({ role: "system", content: `Relevant memory:\n${memories.join("\n")}\nUse it in your response.` }); + } + + const HISTORY = 10; + const end = currentSession.messages.length - 1; + const start = Math.max(0, end - HISTORY); + for (let i = start; i < end; i++) { + messages.push(currentSession.messages[i]); + } + + const lastUser = overrideContent || currentSession.messages[end]?.content; + if (lastUser) { + messages.push({ role: "user", content: lastUser }); + } + + const modelSelectEl = document.getElementById("model-select"); + const model = modelSelectEl?.value || currentSession.model || Storage.getDefaultModel(); + if (!model) { + loadingDiv.textContent = "Error: No model selected."; + setTimeout(() => loadingDiv.remove(), 3000); + const btn = window._chatInternals?.sendButton || document.getElementById("send-button"); + const input = window._chatInternals?.chatInput || document.getElementById("chat-input"); + if (btn) btn.disabled = false; + if (input) input.disabled = false; + showToast("Please select a model before sending a message."); + if (callback) callback(); + return; + } + + try { + const res = await window.pollinationsFetch("https://text.pollinations.ai/openai", { + method: "POST", + headers: { "Content-Type": "application/json", Accept: "application/json" }, + body: JSON.stringify({ model, messages }) + }, { timeoutMs: 45000 }); + const data = await res.json(); + loadingDiv.remove(); + const aiContentRaw = data?.choices?.[0]?.message?.content || ""; + let aiContent = aiContentRaw; + + const memRegex = /\[memory\]([\s\S]*?)\[\/memory\]/gi; + let m; + while ((m = memRegex.exec(aiContent)) !== null) Memory.addMemoryEntry(m[1].trim()); + aiContent = aiContent.replace(memRegex, "").trim(); + + window.addNewMessage({ role: "ai", content: aiContent }); + if (autoSpeakEnabled) { + const sentences = aiContent.split(/(?<=[.!?])\s+/).filter(s => s.trim().length > 0); + speakSentences(sentences); + } else { + stopSpeaking(); + } + if (callback) callback(); + } catch (err) { + loadingDiv.textContent = "Error: Failed to get a response."; + setTimeout(() => loadingDiv.remove(), 3000); + console.error("Pollinations error:", err); + if (callback) callback(); + const btn = window._chatInternals?.sendButton || document.getElementById("send-button"); + const input = window._chatInternals?.chatInput || document.getElementById("chat-input"); + if (btn) btn.disabled = false; + if (input) input.disabled = false; + } }; function initSpeechRecognition() { diff --git a/screensaver.js b/screensaver.js index ea867f2..d1dd07c 100644 --- a/screensaver.js +++ b/screensaver.js @@ -190,25 +190,30 @@ document.addEventListener("DOMContentLoaded", () => { }); } - async function fetchDynamicPrompt() { - const metaPrompt = "Generate exactly one short-125-character, new, fucked up and explicit wild image prompt as text only of outlandish and psychologically thrilling image. i.e. demented, evil, psychotic art."; - const textModel = document.getElementById("model-select")?.value; - const seed = generateSeed(); - const apiUrl = `https://text.pollinations.ai/${encodeURIComponent(metaPrompt)}?seed=${seed}&safe=false${textModel ? `&model=${encodeURIComponent(textModel)}` : ""}`; - try { - const response = await window.pollinationsFetch(apiUrl, { - method: "GET", - headers: { Accept: "text/plain" }, - cache: "no-store" - }); - const generatedPrompt = await response.text(); - if (!generatedPrompt) throw new Error("No fucking prompt returned from API"); - return generatedPrompt; - } catch (err) { - console.error("Failed to fetch dynamic prompt:", err); - throw err; - } - } + async function fetchDynamicPrompt() { + const metaPrompt = "Generate exactly one short-125-character, new, fucked up and explicit wild image prompt as text only of outlandish and psychologically thrilling image. i.e. demented, evil, psychotic art."; + const textModel = document.getElementById("model-select")?.value; + const seed = generateSeed(); + try { + const response = await window.pollinationsFetch("https://text.pollinations.ai/openai", { + method: "POST", + headers: { "Content-Type": "application/json", Accept: "application/json" }, + cache: "no-store", + body: JSON.stringify({ + model: textModel || "openai", + seed, + messages: [{ role: "user", content: metaPrompt }] + }) + }); + const data = await response.json(); + const generatedPrompt = data?.choices?.[0]?.message?.content?.trim(); + if (!generatedPrompt) throw new Error("No fucking prompt returned from API"); + return generatedPrompt; + } catch (err) { + console.error("Failed to fetch dynamic prompt:", err); + throw err; + } + } async function updatePrompt() { if (!screensaverActive || paused || !autoPromptEnabled || isFetchingPrompt) { diff --git a/storage.js b/storage.js index 82befa2..598af0f 100644 --- a/storage.js +++ b/storage.js @@ -44,7 +44,12 @@ document.addEventListener("DOMContentLoaded", () => { } function getDefaultModel() { - return localStorage.getItem("defaultModelPreference") || ""; + let model = localStorage.getItem("defaultModelPreference"); + if (!model) { + model = "unity"; + localStorage.setItem("defaultModelPreference", model); + } + return model; } function setDefaultModel(modelName) { diff --git a/ui.js b/ui.js index 2fd9103..5a3b49c 100644 --- a/ui.js +++ b/ui.js @@ -148,41 +148,44 @@ document.addEventListener("DOMContentLoaded", () => { }); const currentSession = Storage.getCurrentSession(); - if (currentSession && currentSession.model) { - const modelExists = Array.from(modelSelect.options).some(option => option.value === currentSession.model); - if (modelExists) { - modelSelect.value = currentSession.model; + const preferredModel = currentSession?.model || Storage.getDefaultModel(); + if (preferredModel) { + const exists = Array.from(modelSelect.options).some(option => option.value === preferredModel); + if (exists) { + modelSelect.value = preferredModel; } else { const tempOpt = document.createElement("option"); - tempOpt.value = currentSession.model; - tempOpt.textContent = `${currentSession.model} (Previously Selected - May Be Unavailable)`; + tempOpt.value = preferredModel; + tempOpt.textContent = `${preferredModel} (Previously Selected - May Be Unavailable)`; tempOpt.title = "This model may no longer be available"; modelSelect.appendChild(tempOpt); - modelSelect.value = currentSession.model; - console.warn(`Model ${currentSession.model} not found in fetched list. Added as unavailable option.`); + modelSelect.value = preferredModel; + console.warn(`Model ${preferredModel} not found in fetched list. Added as unavailable option.`); } } if (!modelSelect.value && modelSelect.options.length > 0) { - const firstModel = modelSelect.options[0].value; + const unityOption = Array.from(modelSelect.options).find(opt => opt.value === "unity"); + const firstModel = unityOption ? unityOption.value : modelSelect.options[0].value; modelSelect.value = firstModel; if (currentSession) { Storage.setSessionModel(currentSession.id, firstModel); } } - } catch (err) { + } catch (err) { console.error("Failed to fetch text models:", err); modelSelect.innerHTML = ""; const currentSession = Storage.getCurrentSession(); - if (currentSession && currentSession.model) { + const fallbackModel = currentSession?.model || Storage.getDefaultModel(); + if (fallbackModel) { const sessOpt = document.createElement("option"); - sessOpt.value = currentSession.model; - sessOpt.textContent = `${currentSession.model} (From Session - May Be Unavailable)`; + sessOpt.value = fallbackModel; + sessOpt.textContent = `${fallbackModel} (From Session - May Be Unavailable)`; modelSelect.appendChild(sessOpt); - modelSelect.value = currentSession.model; + modelSelect.value = fallbackModel; } - } - } + } + } fetchPollinationsModels(); newSessionBtn.addEventListener("click", () => { const newSess = Storage.createSession("New Chat");