diff --git a/js/mzta-menus.js b/js/mzta-menus.js index b25bb091..0072efec 100644 --- a/js/mzta-menus.js +++ b/js/mzta-menus.js @@ -22,6 +22,7 @@ import { getPrompts } from './mzta-prompts.js'; import { getLanguageDisplayName, getMenuContextCompose, getMenuContextDisplay, i18nConditionalGet, getMailSubject } from './mzta-utils.js' import { taLogger } from './mzta-logger.js'; import { placeholdersUtils } from './mzta-placeholders.js'; +import { mzta_specialCommand_AddTags } from './special_commands/mzta-add-tags.js'; export class mzta_Menus { @@ -182,7 +183,15 @@ export class mzta_Menus { if(curr_prompt.is_special == '1'){ // Special prompts switch(curr_prompt.id){ case 'prompt_add_tags': // Add tags to the email - let mail_tags = 'test'; // TODO get the tags from the API + let mail_tags = ''; + let cmd_addTags = new mzta_specialCommand_AddTags(fullPrompt,"chatgpt_api",true); + await cmd_addTags.initWorker(); + try{ + mail_tags = await cmd_addTags.sendPrompt(); + // console.log(">>>>>>>>>>> mail_tags: " + mail_tags); + }catch(err){ + console.error("[ThunderAI] Error getting tags: ", err); + } browser.tabs.sendMessage(tabs[0].id, {command: "getTags", tags: mail_tags }); return {ok:'1'}; break; diff --git a/js/special_commands/mzta-add-tags.js b/js/special_commands/mzta-add-tags.js index 56536ba9..adf70a9c 100644 --- a/js/special_commands/mzta-add-tags.js +++ b/js/special_commands/mzta-add-tags.js @@ -17,7 +17,7 @@ */ // Call the API to get the tags - import { taLogger } from './mzta-logger.js'; + import { taLogger } from '../mzta-logger.js'; export class mzta_specialCommand_AddTags { @@ -29,43 +29,22 @@ logger = null; do_debug = false; - constructor(prompt, worker, llm, do_debug = false) { + constructor(prompt, llm, do_debug = false) { this.prompt = prompt; - this.worker = worker; this.llm = llm; this.logger = new taLogger('mzta_specialCommand_AddTags', do_debug); this.do_debug = do_debug; switch (this.llm) { case "chatgpt_api": - this.worker = new Worker('../workers/model-worker-openai.js', { type: 'module' }); + this.worker = new Worker(new URL('../workers/model-worker-openai.js', import.meta.url), { type: 'module' }); break; case "ollama_api": - this.worker = new Worker('../workers/model-worker-ollama.js', { type: 'module' }); + this.worker = new Worker(new URL('../workers/model-worker-ollama.js', import.meta.url), { type: 'module' }); break; case "openai_comp_api": - this.worker = new Worker('../workers/model-worker-openai_comp.js', { type: 'module' }); + this.worker = new Worker(new URL('../workers/model-worker-openai_comp.js', import.meta.url), { type: 'module' }); break; } - - // Event listeners for worker messages - this.worker.onmessage = function(event) { - const { type, payload } = event.data; - switch (type) { - case 'messageSent': - break; - case 'newToken': - this.full_message += payload.token; - break; - case 'tokensDone': - console.log(">>>>>>>>>>>> [ThunderAI] tokensDone: " + this.full_message); - break; - case 'error': - console.error('[ThunderAI] Error from API worker:', payload); - break; - default: - console.error('[ThunderAI] Unknown event type from API worker:', type); - } - }; } async initWorker() { @@ -74,35 +53,59 @@ let prefs_api = await browser.storage.sync.get({chatgpt_api_key: '', chatgpt_model: ''}); this.worker.postMessage({ type: 'init', chatgpt_api_key: prefs_api.chatgpt_api_key, chatgpt_model: prefs_api.chatgpt_model, do_debug: this.do_debug, i18nStrings: ''}); break; - // case "ollama_api": { - // let prefs_api = await browser.storage.sync.get({ollama_host: '', ollama_model: '', do_debug: false}); - // let i18nStrings = {}; - // i18nStrings["ollama_api_request_failed"] = browser.i18n.getMessage('ollama_api_request_failed'); - // i18nStrings["error_connection_interrupted"] = browser.i18n.getMessage('error_connection_interrupted'); - // messageInput.setModel(prefs_api.ollama_model); - // messagesArea.setLLMName("Ollama Local"); - // worker.postMessage({ type: 'init', ollama_host: prefs_api.ollama_host, ollama_model: prefs_api.ollama_model, do_debug: prefs_api.do_debug, i18nStrings: i18nStrings}); - // browser.runtime.sendMessage({command: "ollama_api_ready_" + call_id, window_id: (await browser.windows.getCurrent()).id}); - // messagesArea.appendUserMessage(browser.i18n.getMessage("ollama_api_connecting") + " \"" + prefs_api.ollama_host + "\" " +browser.i18n.getMessage("AndModel") + " \"" + prefs_api.ollama_model + "\"...", "info"); - // break; - // } - // case "openai_comp_api": { - // let prefs_api = await browser.storage.sync.get({openai_comp_host: '', openai_comp_model: '', openai_comp_api_key: '', openai_comp_use_v1: true, openai_comp_chat_name: '', do_debug: false}); - // let i18nStrings = {}; - // i18nStrings["OpenAIComp_api_request_failed"] = browser.i18n.getMessage('OpenAIComp_api_request_failed'); - // i18nStrings["error_connection_interrupted"] = browser.i18n.getMessage('error_connection_interrupted'); - // messageInput.setModel(prefs_api.openai_comp_model); - // messagesArea.setLLMName(prefs_api.openai_comp_chat_name); - // worker.postMessage({ type: 'init', openai_comp_host: prefs_api.openai_comp_host, openai_comp_model: prefs_api.openai_comp_model, openai_comp_api_key: prefs_api.openai_comp_api_key, openai_comp_use_v1: prefs_api.openai_comp_use_v1, do_debug: prefs_api.do_debug, i18nStrings: i18nStrings}); - // messagesArea.appendUserMessage(browser.i18n.getMessage("OpenAIComp_api_connecting") + " \"" + prefs_api.openai_comp_host + "\" " +browser.i18n.getMessage("AndModel") + " \"" + prefs_api.openai_comp_model + "\"...", "info"); - // browser.runtime.sendMessage({command: "openai_comp_api_ready_" + call_id, window_id: (await browser.windows.getCurrent()).id}); - // break; - // } + case "ollama_api": { + let prefs_api = await browser.storage.sync.get({ollama_host: '', ollama_model: ''}); + worker.postMessage({ type: 'init', ollama_host: prefs_api.ollama_host, ollama_model: prefs_api.ollama_model, do_debug: this.do_debug, i18nStrings: ''}); + break; + } + case "openai_comp_api": { + let prefs_api = await browser.storage.sync.get({openai_comp_host: '', openai_comp_model: '', openai_comp_api_key: '', openai_comp_use_v1: true, openai_comp_chat_name: '', do_debug: false}); + worker.postMessage({ type: 'init', openai_comp_host: prefs_api.openai_comp_host, openai_comp_model: prefs_api.openai_comp_model, openai_comp_api_key: prefs_api.openai_comp_api_key, openai_comp_use_v1: prefs_api.openai_comp_use_v1, do_debug: this.do_debug, i18nStrings: ''}); + break; + } } } sendPrompt(){ - this.worker.postMessage({ type: 'chatMessage', message: this.prompt }); - } + return new Promise((resolve, reject) => { + // Event listeners for worker messages + this.worker.onmessage = (event) => { + const { type, payload } = event.data; + // console.log(`>>>>>>>>>>>> [Worker Message Received] type: ${type}`, payload); + switch (type) { + case 'newToken': + this.full_message += payload.token; + break; + case 'tokensDone': + console.log(">>>>>>>>>>>> [ThunderAI] tokensDone: " + this.full_message); + resolve(this.full_message); // Resolve the promise with the full message + break; + case 'error': + console.error('[ThunderAI] Error from API worker:', payload); + reject(payload); // Reject the promise in case of error + break; + default: + console.error('[ThunderAI] Unknown event type from API worker:', type); + } + }; + + this.worker.onerror = (error) => { + console.error('[ThunderAI] Worker Error Details:'); + console.error('Message:', error.message); + console.error('Filename:', error.filename); + console.error('Line Number:', error.lineno); + console.error('Column Number:', error.colno); + console.error('Event:', error); + reject(error); + }; + try { + // console.log('[ThunderAI] Sending prompt to worker:', this.prompt); + this.worker.postMessage({ type: 'chatMessage', message: this.prompt }); + } catch (error) { + console.error('[ThunderAI] Failed to send message to worker:', error); + reject(error); + } + }); + } } \ No newline at end of file