From 31914ada82bbcbac6306e4accd0a4bf394b56f7f Mon Sep 17 00:00:00 2001 From: Mic Date: Tue, 3 Jun 2025 22:43:00 +0200 Subject: [PATCH] trying to use fetch from the apiwebchat and not the worker --- api_webchat/controller.js | 39 ++++++++++++++++++++-- js/api/openai_comp.js | 1 + js/workers/model-worker-openai_comp.js | 45 ++++++++++++++++++++++++++ 3 files changed, 83 insertions(+), 2 deletions(-) diff --git a/api_webchat/controller.js b/api_webchat/controller.js index 18b1bd48..16160ae1 100644 --- a/api_webchat/controller.js +++ b/api_webchat/controller.js @@ -137,7 +137,7 @@ switch (llm) { //let prefs_ph = await browser.storage.sync.get({placeholders_use_default_value: false}); // Event listeners for worker messages -worker.onmessage = function(event) { +worker.onmessage = async function(event) { const { type, payload } = event.data; switch (type) { case 'messageSent': @@ -155,6 +155,41 @@ worker.onmessage = function(event) { messagesArea.appendBotMessage(payload,'error'); messageInput.enableInput(); break; + case 'proxy-fetch': { + const [url, options] = event.data.args; + const requestId = event.data.requestId; + try { + const res = await fetch(url, options); + const body = await res.text(); + const headersObj = {}; + for (const [key, value] of res.headers.entries()) { + headersObj[key.toLowerCase()] = value; + } + worker.postMessage({ + type: 'proxy-fetch-response', + requestId, + response: { + body, + status: res.status, + statusText: res.statusText, + ok: res.ok, + headers: headersObj, + } + }); + } catch (err) { + worker.postMessage({ + type: 'proxy-fetch-response', + requestId, + response: { + body: err.message, + status: 500, + statusText: 'Internal Error', + ok: false, + headers: {}, + } + }); + } + } default: console.error('[ThunderAI] Unknown event type from API worker:', type); } @@ -197,4 +232,4 @@ browser.runtime.onMessage.addListener((message, sender, sendResponse) => { function sendPrompt(message){ messageInput._setMessageInputValue(message.prompt); messageInput._handleNewChatMessage(); -} \ No newline at end of file +} diff --git a/js/api/openai_comp.js b/js/api/openai_comp.js index 459f968f..d5423248 100644 --- a/js/api/openai_comp.js +++ b/js/api/openai_comp.js @@ -73,6 +73,7 @@ export class OpenAIComp { if(this.apiKey !== '') curr_headers["Authorization"] = "Bearer "+ this.apiKey; try { + console.log(">>>>>>>>>>> OpenAI API Comp request: ", this.host + (this.use_v1 ? "/v1" : "") + "/chat/completions"); const response = await fetch(this.host + (this.use_v1 ? "/v1" : "") + "/chat/completions", { method: "POST", headers: curr_headers, diff --git a/js/workers/model-worker-openai_comp.js b/js/workers/model-worker-openai_comp.js index 7df91d49..71b57c94 100644 --- a/js/workers/model-worker-openai_comp.js +++ b/js/workers/model-worker-openai_comp.js @@ -1,3 +1,48 @@ + +// --- Patch fetch in the worker to delegate to main thread with streaming support --- +let fetchCounter = 0; +self.fetch = (...args) => { + const requestId = 'fetch_' + (++fetchCounter); + postMessage({ type: 'proxy-fetch', requestId, args }); + + return new Promise((resolve) => { + if (!self._fetchResolvers) self._fetchResolvers = {}; + self._fetchResolvers[requestId] = resolve; + }); +}; + +onmessage = (e) => { + if (e.data.type === 'proxy-fetch-response') { + const { requestId, response } = e.data; + const resolve = self._fetchResolvers?.[requestId]; + if (resolve) { + const stream = new ReadableStream({ + start(controller) { + controller.enqueue(new TextEncoder().encode(response.body)); + controller.close(); + } + }); + + const fakeResponse = { + ok: response.ok, + status: response.status, + statusText: response.statusText, + headers: { + get: (name) => response.headers[name.toLowerCase()] || null + }, + body: stream, + text: async () => response.body, + json: async () => JSON.parse(response.body) + }; + + resolve(fakeResponse); + delete self._fetchResolvers[requestId]; + } + } +}; +// --- End patch --- + + /* * ThunderAI [https://micz.it/thunderbird-addon-thunderai/] * Copyright (C) 2024 - 2025 Mic (m@micz.it)