From 3c919ac67d8825a6af5bd00cc5d26362c8503e85 Mon Sep 17 00:00:00 2001 From: Mic Date: Mon, 8 Sep 2025 21:13:00 +0200 Subject: [PATCH 01/11] APIs constructors are now accepting an object as input argument --- js/api/anthropic.js | 10 +++++++-- js/api/google_gemini.js | 7 +++++- js/api/ollama.js | 12 +++++++--- js/api/openai.js | 10 +++++++-- js/api/openai_comp.js | 12 +++++++--- js/workers/model-worker-anthropic.js | 8 ++++++- js/workers/model-worker-google_gemini.js | 7 +++++- js/workers/model-worker-ollama.js | 9 ++++++-- js/workers/model-worker-openai.js | 8 ++++++- js/workers/model-worker-openai_comp.js | 8 ++++++- options/mzta-options.js | 28 +++++++++++++++++++----- 11 files changed, 97 insertions(+), 22 deletions(-) diff --git a/js/api/anthropic.js b/js/api/anthropic.js index 662b45df..724a092b 100644 --- a/js/api/anthropic.js +++ b/js/api/anthropic.js @@ -27,7 +27,13 @@ export class Anthropic { max_tokens = 4096; stream = false; - constructor(apiKey, version, model, max_tokens = 4096, stream = false) { + constructor({ + apiKey = '', + version = '', + model = '', + max_tokens = 4096, + stream = false, + } = {}) { this.apiKey = apiKey; this.version = version; this.model = model; @@ -104,4 +110,4 @@ export class Anthropic { } } -} \ No newline at end of file +} diff --git a/js/api/google_gemini.js b/js/api/google_gemini.js index d0d8a055..bd2f24f9 100644 --- a/js/api/google_gemini.js +++ b/js/api/google_gemini.js @@ -25,7 +25,12 @@ export class GoogleGemini { system_instruction = ''; stream = false; - constructor(apiKey, model, system_instruction, stream) { + constructor({ + apiKey = '', + model = '', + system_instruction = '', + stream = false + } = {}) { this.apiKey = apiKey; this.model = model; this.system_instruction = system_instruction; diff --git a/js/api/ollama.js b/js/api/ollama.js index 5c10763a..9a4be836 100644 --- a/js/api/ollama.js +++ b/js/api/ollama.js @@ -24,8 +24,14 @@ export class Ollama { num_ctx = 0; think = false; - constructor(host, model, stream = false, num_ctx = 0, think = false) { - this.host = host.trim().replace(/\/+$/, ""); + constructor({ + host = '', + model = '', + stream = false, + num_ctx = 0, + think = false, + } = {}) { + this.host = (host || '').trim().replace(/\/+$/, ""); this.model = model; this.stream = stream; this.num_ctx = num_ctx; @@ -123,4 +129,4 @@ export class Ollama { // return output; // } // } -} \ No newline at end of file +} diff --git a/js/api/openai.js b/js/api/openai.js index 11884e7e..6d589c4c 100644 --- a/js/api/openai.js +++ b/js/api/openai.js @@ -27,7 +27,13 @@ export class OpenAI { stream = false; store = false; - constructor(apiKey, model, developer_messages, stream, store) { + constructor({ + apiKey = '', + model = '', + developer_messages = '', + stream = false, + store = false + } = {}) { this.apiKey = apiKey; this.model = model; this.developer_messages = developer_messages; @@ -120,4 +126,4 @@ export class OpenAI { return data.token_count; } -} \ No newline at end of file +} diff --git a/js/api/openai_comp.js b/js/api/openai_comp.js index a0ba14ec..3e975b62 100644 --- a/js/api/openai_comp.js +++ b/js/api/openai_comp.js @@ -27,8 +27,14 @@ export class OpenAIComp { use_v1 = true; stream = false; - constructor(host, model, apiKey = '', stream = false, use_v1 = true) { - this.host = host.trim().replace(/\/+$/, ""); + constructor({ + host = '', + model = '', + apiKey = '', + stream = false, + use_v1 = true, + } = {}) { + this.host = (host || '').trim().replace(/\/+$/, ""); this.model = model; this.stream = stream; this.apiKey = apiKey; @@ -107,4 +113,4 @@ export class OpenAIComp { } } -} \ No newline at end of file +} diff --git a/js/workers/model-worker-anthropic.js b/js/workers/model-worker-anthropic.js index a16578c9..9f311e7d 100644 --- a/js/workers/model-worker-anthropic.js +++ b/js/workers/model-worker-anthropic.js @@ -38,7 +38,13 @@ self.onmessage = async function(event) { if (event.data.type === 'init') { anthropic_api_key = event.data.anthropic_api_key; anthropic_model = event.data.anthropic_model; - anthropic = new Anthropic(anthropic_api_key, event.data.anthropic_version, anthropic_model, event.data.anthropic_max_tokens, true); + anthropic = new Anthropic({ + apiKey: anthropic_api_key, + version: event.data.anthropic_version, + model: anthropic_model, + max_tokens: event.data.anthropic_max_tokens, + stream: true + }); do_debug = event.data.do_debug; i18nStrings = event.data.i18nStrings; taLog = new taLogger('model-worker-anthropic', do_debug); diff --git a/js/workers/model-worker-google_gemini.js b/js/workers/model-worker-google_gemini.js index e4557f52..67e69c14 100644 --- a/js/workers/model-worker-google_gemini.js +++ b/js/workers/model-worker-google_gemini.js @@ -38,7 +38,12 @@ self.onmessage = async function(event) { if (event.data.type === 'init') { google_gemini_api_key = event.data.google_gemini_api_key; google_gemini_model = event.data.google_gemini_model; - google_gemini = new GoogleGemini(google_gemini_api_key, google_gemini_model, event.data.google_gemini_system_instruction, true); + google_gemini = new GoogleGemini({ + apiKey: google_gemini_api_key, + model: google_gemini_model, + system_instruction: event.data.google_gemini_system_instruction, + stream: true + }); do_debug = event.data.do_debug; i18nStrings = event.data.i18nStrings; taLog = new taLogger('model-worker-google_gemini', do_debug); diff --git a/js/workers/model-worker-ollama.js b/js/workers/model-worker-ollama.js index f29bab62..c04f0ef6 100644 --- a/js/workers/model-worker-ollama.js +++ b/js/workers/model-worker-ollama.js @@ -42,7 +42,12 @@ self.onmessage = async function(event) { ollama_model = event.data.ollama_model; ollama_num_ctx = event.data.ollama_num_ctx; //console.log(">>>>>>>>>>> ollama_host: " + ollama_host); - ollama = new Ollama(ollama_host, ollama_model, true, ollama_num_ctx); + ollama = new Ollama({ + host: ollama_host, + model: ollama_model, + stream: true, + num_ctx: ollama_num_ctx + }); do_debug = event.data.do_debug; i18nStrings = event.data.i18nStrings; taLog = new taLogger('model-worker-ollama', do_debug); @@ -138,4 +143,4 @@ self.onmessage = async function(event) { stopStreaming = true; break; //stop } -}; \ No newline at end of file +}; diff --git a/js/workers/model-worker-openai.js b/js/workers/model-worker-openai.js index 61e4bc22..f09d06d4 100644 --- a/js/workers/model-worker-openai.js +++ b/js/workers/model-worker-openai.js @@ -38,7 +38,13 @@ self.onmessage = async function(event) { if (event.data.type === 'init') { chatgpt_api_key = event.data.chatgpt_api_key; chatgpt_model = event.data.chatgpt_model; - openai = new OpenAI(chatgpt_api_key, chatgpt_model, event.data.chatgpt_developer_messages, true, event.data.chatgpt_api_store); + openai = new OpenAI({ + apiKey: chatgpt_api_key, + model: chatgpt_model, + developer_messages: event.data.chatgpt_developer_messages, + stream: true, + store: event.data.chatgpt_api_store + }); do_debug = event.data.do_debug; i18nStrings = event.data.i18nStrings; taLog = new taLogger('model-worker-openai', do_debug); diff --git a/js/workers/model-worker-openai_comp.js b/js/workers/model-worker-openai_comp.js index 4882800f..26346caf 100644 --- a/js/workers/model-worker-openai_comp.js +++ b/js/workers/model-worker-openai_comp.js @@ -42,7 +42,13 @@ self.onmessage = async function(event) { openai_comp_model = event.data.openai_comp_model; openai_comp_api_key = event.data.openai_comp_api_key; openai_comp_use_v1 = event.data.openai_comp_use_v1; - openai_comp = new OpenAIComp(openai_comp_host, openai_comp_model, openai_comp_api_key, true, openai_comp_use_v1); + openai_comp = new OpenAIComp({ + host: openai_comp_host, + model: openai_comp_model, + apiKey: openai_comp_api_key, + stream: true, + use_v1: openai_comp_use_v1 + }); do_debug = event.data.do_debug; i18nStrings = event.data.i18nStrings; taLog = new taLogger('model-worker-openai_comp', do_debug); diff --git a/options/mzta-options.js b/options/mzta-options.js index 13604510..21e42863 100644 --- a/options/mzta-options.js +++ b/options/mzta-options.js @@ -580,7 +580,10 @@ document.addEventListener('DOMContentLoaded', async () => { document.getElementById('btnUpdateChatGPTModels').addEventListener('click', async () => { document.getElementById('chatgpt_model_fetch_loading').style.display = 'inline'; - let openai = new OpenAI(document.getElementById("chatgpt_api_key").value, '', true); + let openai = new OpenAI({ + apiKey: document.getElementById("chatgpt_api_key").value, + stream: true + }); openai.fetchModels().then((data) => { if(!data.ok){ let errorDetail; @@ -620,7 +623,10 @@ document.addEventListener('DOMContentLoaded', async () => { document.getElementById('btnUpdateGoogleGeminiModels').addEventListener('click', async () => { document.getElementById('google_gemini_model_fetch_loading').style.display = 'inline'; - let google_gemini = new GoogleGemini(document.getElementById("google_gemini_api_key").value, '', true); + let google_gemini = new GoogleGemini({ + apiKey: document.getElementById("google_gemini_api_key").value, + stream: true + }); google_gemini.fetchModels().then((data) => { if(!data.ok){ let errorDetail; @@ -660,7 +666,10 @@ document.addEventListener('DOMContentLoaded', async () => { document.getElementById('btnUpdateOllamaModels').addEventListener('click', async () => { document.getElementById('ollama_model_fetch_loading').style.display = 'inline'; - let ollama = new Ollama(document.getElementById("ollama_host").value, true); + let ollama = new Ollama({ + host: document.getElementById("ollama_host").value, + stream: true + }); try { let data = await ollama.fetchModels(); if(!data){ @@ -718,7 +727,13 @@ document.addEventListener('DOMContentLoaded', async () => { document.getElementById('btnUpdateOpenAICompModels').addEventListener('click', async () => { document.getElementById('openai_comp_model_fetch_loading').style.display = 'inline'; - let openai_comp = new OpenAIComp(document.getElementById("openai_comp_host").value , null, document.getElementById("openai_comp_api_key").value, true, document.getElementById("openai_comp_use_v1").checked); + let openai_comp = new OpenAIComp({ + host: document.getElementById("openai_comp_host").value, + model: null, + apiKey: document.getElementById("openai_comp_api_key").value, + stream: true, + use_v1: document.getElementById("openai_comp_use_v1").checked + }); openai_comp.fetchModels().then((data) => { if(!data.ok){ let errorDetail; @@ -759,7 +774,10 @@ document.addEventListener('DOMContentLoaded', async () => { document.getElementById('btnUpdateAnthropicModels').addEventListener('click', async () => { document.getElementById('anthropic_model_fetch_loading').style.display = 'inline'; - let anthropic = new Anthropic(document.getElementById("anthropic_api_key").value, document.getElementById("anthropic_version").value, ''); + let anthropic = new Anthropic({ + apiKey: document.getElementById("anthropic_api_key").value, + version: document.getElementById("anthropic_version").value + }); anthropic.fetchModels().then((data) => { if(!data.ok){ let errorDetail; From 9750592ee97bbcd318d921bdfdb88ec3e585cfe2 Mon Sep 17 00:00:00 2001 From: Mic Date: Mon, 8 Sep 2025 21:22:00 +0200 Subject: [PATCH 02/11] thinkingBudget added to google gemini. see #494 --- js/api/google_gemini.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/js/api/google_gemini.js b/js/api/google_gemini.js index bd2f24f9..2f46f8b1 100644 --- a/js/api/google_gemini.js +++ b/js/api/google_gemini.js @@ -24,17 +24,20 @@ export class GoogleGemini { model = ''; system_instruction = ''; stream = false; + thinkingBudget = 0; //Off constructor({ apiKey = '', model = '', system_instruction = '', - stream = false + stream = false, + thinkingBudget = 0 } = {}) { this.apiKey = apiKey; this.model = model; this.system_instruction = system_instruction; this.stream = stream; + this.thinkingBudget = thinkingBudget; } @@ -88,7 +91,12 @@ export class GoogleGemini { parts:{ text: this.system_instruction } - } + }; + google_gemini_body.generationConfig = { + thinkingConfig: { + thinkingBudget: this.thinkingBudget, + } + }; } // console.log("[ThunderAI] Google Gemini API request: " + JSON.stringify(google_gemini_body)); From 231cc75a2e358e8ec42b45939121d414f8c239bf Mon Sep 17 00:00:00 2001 From: Mic Date: Mon, 8 Sep 2025 21:42:00 +0200 Subject: [PATCH 03/11] printing gemini thinking budget on the API webchat. see #494 --- api_webchat/controller.js | 9 ++++++++- options/mzta-options-default.js | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/api_webchat/controller.js b/api_webchat/controller.js index ef2b4f77..69a1be27 100644 --- a/api_webchat/controller.js +++ b/api_webchat/controller.js @@ -97,7 +97,13 @@ switch (llm) { break; } case "google_gemini_api": { - let prefs_api = await browser.storage.sync.get({google_gemini_api_key: '', google_gemini_model: '', google_gemini_system_instruction: '', do_debug: false}); + let prefs_api = await browser.storage.sync.get({ + google_gemini_api_key: '', + google_gemini_model: '', + google_gemini_system_instruction: '', + google_gemini_thinking_budget: 0, + do_debug: false, + }); let i18nStrings = {}; i18nStrings["google_gemini_api_request_failed"] = browser.i18n.getMessage('google_gemini_api_request_failed'); i18nStrings["error_connection_interrupted"] = browser.i18n.getMessage('error_connection_interrupted'); @@ -107,6 +113,7 @@ switch (llm) { if(prefs_api.google_gemini_system_instruction && prefs_api.google_gemini_system_instruction.length > 0) { additional_text_elements.push({label: browser.i18n.getMessage("GoogleGemini_SystemInstruction"), value: prefs_api.google_gemini_system_instruction}); } + additional_text_elements.push({label: 'Thinking Budget', value: prefs_api.google_gemini_thinking_budget}); additional_text_elements.push({label: "Prompt", value: '[' + prompt_id + '] ' + decodeURIComponent(prompt_name)}); worker.postMessage({ type: 'init', google_gemini_api_key: prefs_api.google_gemini_api_key, google_gemini_model: prefs_api.google_gemini_model, google_gemini_system_instruction: prefs_api.google_gemini_system_instruction, do_debug: prefs_api.do_debug, i18nStrings: i18nStrings}); messagesArea.appendUserMessage(getAPIsInitMessageString({ diff --git a/options/mzta-options-default.js b/options/mzta-options-default.js index e1aeb908..93f77836 100644 --- a/options/mzta-options-default.js +++ b/options/mzta-options-default.js @@ -45,6 +45,7 @@ export const prefs_default = { google_gemini_api_key: '', google_gemini_model: '', google_gemini_system_instruction: '', + google_gemini_thinking_budget: 0, anthropic_api_key: '', anthropic_model: '', anthropic_version: '2023-06-01', From 257236077a4d434c8dff0f5a21792d982b6ada39 Mon Sep 17 00:00:00 2001 From: Mic Date: Mon, 8 Sep 2025 21:42:00 +0200 Subject: [PATCH 04/11] prefs loading code improved --- api_webchat/controller.js | 120 +++++++++++++++++++++++++++++++------- 1 file changed, 100 insertions(+), 20 deletions(-) diff --git a/api_webchat/controller.js b/api_webchat/controller.js index 69a1be27..c4ddf25c 100644 --- a/api_webchat/controller.js +++ b/api_webchat/controller.js @@ -20,6 +20,7 @@ * The original code has been released under the Apache License, Version 2.0. */ +import { prefs_default } from '../options/mzta-options-default.js'; import { placeholdersUtils } from '../js/mzta-placeholders.js'; import { getAPIsInitMessageString, convertNewlinesToBr } from '../js/mzta-utils.js'; @@ -75,13 +76,27 @@ messageInput.setMessagesArea(messagesArea); switch (llm) { case "chatgpt_api": { - let prefs_api = await browser.storage.sync.get({chatgpt_api_key: '', chatgpt_model: '', chatgpt_developer_messages:'', chatgpt_api_store: false, do_debug: false}); + let prefs_api = await browser.storage.sync.get({ + chatgpt_api_key: prefs_default.chatgpt_api_key, + chatgpt_model: prefs_default.chatgpt_model, + chatgpt_developer_messages: prefs_default.chatgpt_developer_messages, + chatgpt_api_store: prefs_default.chatgpt_api_store, + do_debug: prefs_default.do_debug, + }); let i18nStrings = {}; i18nStrings["chatgpt_api_request_failed"] = browser.i18n.getMessage('chatgpt_api_request_failed'); i18nStrings["error_connection_interrupted"] = browser.i18n.getMessage('error_connection_interrupted'); messageInput.setModel(prefs_api.chatgpt_model); messagesArea.setLLMName("ChatGPT"); - worker.postMessage({ type: 'init', chatgpt_api_key: prefs_api.chatgpt_api_key, chatgpt_model: prefs_api.chatgpt_model, chatgpt_developer_messages: prefs_api.chatgpt_developer_messages, chatgpt_api_store: prefs_api.chatgpt_api_store, do_debug: prefs_api.do_debug, i18nStrings: i18nStrings}); + worker.postMessage({ + type: 'init', + chatgpt_api_key: prefs_api.chatgpt_api_key, + chatgpt_model: prefs_api.chatgpt_model, + chatgpt_developer_messages: prefs_api.chatgpt_developer_messages, + chatgpt_api_store: prefs_api.chatgpt_api_store, + do_debug: prefs_api.do_debug, + i18nStrings: i18nStrings + }); let additional_text_elements = []; additional_text_elements.push({label: 'OpenAI Store', value: (prefs_api.chatgpt_api_store ? 'Yes' : 'No')}); if(prefs_api.chatgpt_developer_messages && prefs_api.chatgpt_developer_messages.length > 0) { @@ -93,16 +108,19 @@ switch (llm) { model_string: prefs_api.chatgpt_model, additional_messages: additional_text_elements }), "info"); - browser.runtime.sendMessage({command: "openai_api_ready_" + call_id, window_id: (await browser.windows.getCurrent()).id}); + browser.runtime.sendMessage({ + command: "openai_api_ready_" + call_id, + window_id: (await browser.windows.getCurrent()).id + }); break; } case "google_gemini_api": { let prefs_api = await browser.storage.sync.get({ - google_gemini_api_key: '', - google_gemini_model: '', - google_gemini_system_instruction: '', - google_gemini_thinking_budget: 0, - do_debug: false, + google_gemini_api_key: prefs_default.google_gemini_api_key, + google_gemini_model: prefs_default.google_gemini_model, + google_gemini_system_instruction: prefs_default.google_gemini_system_instruction, + google_gemini_thinking_budget: prefs_default.google_gemini_thinking_budget, + do_debug: prefs_default.do_debug, }); let i18nStrings = {}; i18nStrings["google_gemini_api_request_failed"] = browser.i18n.getMessage('google_gemini_api_request_failed'); @@ -115,24 +133,51 @@ switch (llm) { } additional_text_elements.push({label: 'Thinking Budget', value: prefs_api.google_gemini_thinking_budget}); additional_text_elements.push({label: "Prompt", value: '[' + prompt_id + '] ' + decodeURIComponent(prompt_name)}); - worker.postMessage({ type: 'init', google_gemini_api_key: prefs_api.google_gemini_api_key, google_gemini_model: prefs_api.google_gemini_model, google_gemini_system_instruction: prefs_api.google_gemini_system_instruction, do_debug: prefs_api.do_debug, i18nStrings: i18nStrings}); + worker.postMessage({ + type: 'init', + google_gemini_api_key: prefs_api.google_gemini_api_key, + google_gemini_model: prefs_api.google_gemini_model, + google_gemini_system_instruction: prefs_api.google_gemini_system_instruction, + do_debug: prefs_api.do_debug, + i18nStrings: i18nStrings + }); messagesArea.appendUserMessage(getAPIsInitMessageString({ api_string: "Google Gemini API", model_string: prefs_api.google_gemini_model, additional_messages: additional_text_elements }), "info"); - browser.runtime.sendMessage({command: "google_gemini_api_ready_" + call_id, window_id: (await browser.windows.getCurrent()).id}); + browser.runtime.sendMessage({ + command: "google_gemini_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: '', ollama_num_ctx: 0, ollama_think: false, do_debug: false}); + let prefs_api = await browser.storage.sync.get({ + ollama_host: prefs_default.ollama_host, + ollama_model: prefs_default.ollama_model, + ollama_num_ctx: prefs_default.ollama_num_ctx, + ollama_think: prefs_default.ollama_think, + do_debug: prefs_default.do_debug, + }); 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, ollama_num_ctx: prefs_api.ollama_num_ctx, ollama_think: prefs_api.ollama_think, do_debug: prefs_api.do_debug, i18nStrings: i18nStrings}); - browser.runtime.sendMessage({command: "ollama_api_ready_" + call_id, window_id: (await browser.windows.getCurrent()).id}); + worker.postMessage({ + type: 'init', + ollama_host: prefs_api.ollama_host, + ollama_model: prefs_api.ollama_model, + ollama_num_ctx: prefs_api.ollama_num_ctx, + ollama_think: prefs_api.ollama_think, + do_debug: prefs_api.do_debug, + i18nStrings: i18nStrings + }); + browser.runtime.sendMessage({ + command: "ollama_api_ready_" + call_id, + window_id: (await browser.windows.getCurrent()).id + }); let additional_text_elements = []; additional_text_elements.push({label: "Prompt", value: '[' + prompt_id + '] ' + decodeURIComponent(prompt_name)}); messagesArea.appendUserMessage(getAPIsInitMessageString({ @@ -144,13 +189,28 @@ switch (llm) { 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 prefs_api = await browser.storage.sync.get({ + openai_comp_host: prefs_default.openai_comp_host, + openai_comp_model: prefs_default.openai_comp_model, + openai_comp_api_key: prefs_default.openai_comp_api_key, + openai_comp_use_v1: prefs_default.openai_comp_use_v1, + openai_comp_chat_name: prefs_default.openai_comp_chat_name, + do_debug: prefs_default.do_debug, + }); 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}); + 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 + }); let additional_text_elements = []; additional_text_elements.push({label: "Prompt", value: '[' + prompt_id + '] ' + decodeURIComponent(prompt_name)}); messagesArea.appendUserMessage(getAPIsInitMessageString({ @@ -159,17 +219,34 @@ switch (llm) { host_string: prefs_api.openai_comp_host, additional_messages: additional_text_elements }), "info"); - browser.runtime.sendMessage({command: "openai_comp_api_ready_" + call_id, window_id: (await browser.windows.getCurrent()).id}); + browser.runtime.sendMessage({ + command: "openai_comp_api_ready_" + call_id, + window_id: (await browser.windows.getCurrent()).id + }); break; } case "anthropic_api": { - let prefs_api = await browser.storage.sync.get({anthropic_api_key: '', anthropic_model: '', anthropic_version: '2023-06-01', anthropic_max_tokens: 4096, do_debug: false}); + let prefs_api = await browser.storage.sync.get({ + anthropic_api_key: prefs_default.anthropic_api_key, + anthropic_model: prefs_default.anthropic_model, + anthropic_version: prefs_default.anthropic_version, + anthropic_max_tokens: prefs_default.anthropic_max_tokens, + do_debug: prefs_default.do_debug, + }); let i18nStrings = {}; i18nStrings["anthropic_api_request_failed"] = browser.i18n.getMessage('anthropic_api_request_failed'); i18nStrings["error_connection_interrupted"] = browser.i18n.getMessage('error_connection_interrupted'); messageInput.setModel(prefs_api.anthropic_model); messagesArea.setLLMName("Anthropic"); - worker.postMessage({ type: 'init', anthropic_api_key: prefs_api.anthropic_api_key, anthropic_model: prefs_api.anthropic_model, anthropic_version: prefs_api.anthropic_version, anthropic_max_tokens: prefs_api.anthropic_max_tokens, do_debug: prefs_api.do_debug, i18nStrings: i18nStrings}); + worker.postMessage({ + type: 'init', + anthropic_api_key: prefs_api.anthropic_api_key, + anthropic_model: prefs_api.anthropic_model, + anthropic_version: prefs_api.anthropic_version, + anthropic_max_tokens: prefs_api.anthropic_max_tokens, + do_debug: prefs_api.do_debug, + i18nStrings: i18nStrings + }); let additional_text_elements = []; additional_text_elements.push({label: "Prompt", value: '[' + prompt_id + '] ' + decodeURIComponent(prompt_name)}); messagesArea.appendUserMessage(getAPIsInitMessageString({ @@ -178,7 +255,10 @@ switch (llm) { version_string: prefs_api.anthropic_version, additional_messages: additional_text_elements }), "info"); - browser.runtime.sendMessage({command: "anthropic_api_ready_" + call_id, window_id: (await browser.windows.getCurrent()).id}); + browser.runtime.sendMessage({ + command: "anthropic_api_ready_" + call_id, + window_id: (await browser.windows.getCurrent()).id + }); break; } } @@ -250,4 +330,4 @@ browser.runtime.onMessage.addListener((message, sender, sendResponse) => { function sendPrompt(message){ messageInput._setMessageInputValue(convertNewlinesToBr(message.prompt)); messageInput._handleNewChatMessage(); -} \ No newline at end of file +} From c02bcc087ecef46f29c28a60f43d7f1ce8fd3c83 Mon Sep 17 00:00:00 2001 From: Mic Date: Mon, 8 Sep 2025 21:42:00 +0200 Subject: [PATCH 05/11] info added about gemini thinking budget. see #494 --- js/api/google_gemini.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/js/api/google_gemini.js b/js/api/google_gemini.js index 2f46f8b1..fbcec986 100644 --- a/js/api/google_gemini.js +++ b/js/api/google_gemini.js @@ -38,6 +38,11 @@ export class GoogleGemini { this.system_instruction = system_instruction; this.stream = stream; this.thinkingBudget = thinkingBudget; + /* Info from: https://ai.google.dev/gemini-api/docs/thinking?#set-budget + # Turn on thinking with a specific token limit: "thinkingBudget": 1024 + # Thinking off: "thinkingBudget": 0 + # Turn on dynamic thinking: "thinkingBudget": -1 + */ } From a34d3c41e08ce0b7f0fbbaab2bdb8786feacaa51 Mon Sep 17 00:00:00 2001 From: Mic Date: Mon, 8 Sep 2025 21:42:00 +0200 Subject: [PATCH 06/11] code formatted. better prefs import. --- api_webchat/messagesArea.js | 5 +++-- js/mzta-menus.js | 18 ++++++++++++++--- js/mzta-placeholders.js | 8 +++++--- js/mzta-special-commands.js | 36 ++++++++++++++++++++++++++++------ js/mzta-utils-prompt.js | 9 +++++---- js/mzta-utils.js | 5 +++-- mzta-background.js | 2 +- pages/onboarding/onboarding.js | 8 ++++++-- 8 files changed, 68 insertions(+), 23 deletions(-) diff --git a/api_webchat/messagesArea.js b/api_webchat/messagesArea.js index eb61eca0..3696dbe2 100644 --- a/api_webchat/messagesArea.js +++ b/api_webchat/messagesArea.js @@ -20,6 +20,7 @@ * The original code has been released under the Apache License, Version 2.0. */ +import { prefs_default } from '../options/mzta-options-default.js'; const messagesAreaTemplate = document.createElement('template'); const messagesAreaStyle = document.createElement('style'); @@ -383,7 +384,7 @@ class MessagesArea extends HTMLElement { splitButton.appendChild(actionButton); const fullTextHTMLAtAssignment = this.fullTextHTML.trim().replace(/^"|"$/g, '').replace(/^

"/, '

').replace(/"<\/p>$/, '

'); // strip quotation marks //console.log(">>>>>>>>>>>> fullTextHTMLAtAssignment: " + fullTextHTMLAtAssignment); - let reply_type_pref = await browser.storage.sync.get({reply_type: 'reply_all'}); + let reply_type_pref = await browser.storage.sync.get({ reply_type: prefs_default.reply_type }); if((promptData.action == "1") && (promptData.mailMessageId != -1)) { const actionButton_line2 = document.createElement('span'); actionButton_line2.classList.add('action_btn_info'); @@ -613,4 +614,4 @@ function removeAloneBRs(htmlString) { }); return doc.body.innerHTML; -} \ No newline at end of file +} diff --git a/js/mzta-menus.js b/js/mzta-menus.js index c836acde..e58be3aa 100644 --- a/js/mzta-menus.js +++ b/js/mzta-menus.js @@ -19,6 +19,7 @@ // Some original methods are derived from https://github.com/ali-raheem/Aify/blob/cfadf52f576b7be3720b5b73af7c8d3129c054da/plugin/html/actions.js import { getPrompts } from './mzta-prompts.js'; +import { prefs_default } from '../options/mzta-options-default.js'; import { getLanguageDisplayName, getMenuContextCompose, getMenuContextDisplay, i18nConditionalGet, getMailSubject, getTagsList, extractJsonObject, convertNewlinesToBr, cleanupNewlines, checkIfTagLabelExists } from './mzta-utils.js' import { taPromptUtils } from './mzta-utils-prompt.js'; import { taLogger } from './mzta-logger.js'; @@ -182,7 +183,14 @@ export class mzta_Menus { case 'prompt_add_tags': { // Add tags to the email let tags_current_email = []; let tags_current_email_final = []; - let prefs_at = await browser.storage.sync.get({add_tags_maxnum: 3, connection_type: '', add_tags_force_lang: true, add_tags_auto_force_existing: false, default_chatgpt_lang: '', do_debug: false}); + let prefs_at = await browser.storage.sync.get({ + add_tags_maxnum: prefs_default.add_tags_maxnum, + connection_type: prefs_default.connection_type, + add_tags_force_lang: prefs_default.add_tags_force_lang, + add_tags_auto_force_existing: prefs_default.add_tags_auto_force_existing, + default_chatgpt_lang: prefs_default.default_chatgpt_lang, + do_debug: prefs_default.do_debug, + }); if((prefs_at.connection_type === '')||(prefs_at.connection_type === null)||(prefs_at.connection_type === undefined)||(prefs_at.connection_type === 'chatgpt_web')){ console.error("[ThunderAI | AddTags] Invalid connection type: " + prefs_at.connection_type); taWorkingStatus.stopWorking(); @@ -226,7 +234,11 @@ export class mzta_Menus { } case 'prompt_get_calendar_event': { // Get a calendar event info let calendar_event_data = ''; - let prefs_at = await browser.storage.sync.get({connection_type: '', calendar_enforce_timezone: false, calendar_timezone: '',}); + let prefs_at = await browser.storage.sync.get({ + connection_type: prefs_default.connection_type, + calendar_enforce_timezone: prefs_default.calendar_enforce_timezone, + calendar_timezone: prefs_default.calendar_timezone, + }); if((prefs_at.connection_type === '')||(prefs_at.connection_type === null)||(prefs_at.connection_type === undefined)||(prefs_at.connection_type === 'chatgpt_web')){ console.error("[ThunderAI | GetCalendarEvent] Invalid connection type: " + prefs_at.connection_type); taWorkingStatus.stopWorking(); @@ -500,4 +512,4 @@ export class mzta_Menus { return false; } -} \ No newline at end of file +} diff --git a/js/mzta-placeholders.js b/js/mzta-placeholders.js index fb08a387..0eb6f926 100644 --- a/js/mzta-placeholders.js +++ b/js/mzta-placeholders.js @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +import { prefs_default } from '../options/mzta-options-default.js'; + /* ================= PLACEHOLDERS PROPERTIES ======================================== ================ BASE PROPERTIES @@ -480,11 +482,11 @@ export const placeholdersUtils = { finalSubs['tags_full_list'] = placeholdersUtils.failSafePlaceholders(tags_full_list[0]); break; case 'thunderai_def_sign': - let prefs_def_sign = await browser.storage.sync.get({default_sign_name: ''}); + let prefs_def_sign = await browser.storage.sync.get({ default_sign_name: prefs_default.default_sign_name }); finalSubs['thunderai_def_sign'] = placeholdersUtils.failSafePlaceholders(prefs_def_sign.default_sign_name); break; case 'thunderai_def_lang': - let prefs_def_lang = await browser.storage.sync.get({default_chatgpt_lang: ''}); + let prefs_def_lang = await browser.storage.sync.get({ default_chatgpt_lang: prefs_default.default_chatgpt_lang }); finalSubs['thunderai_def_lang'] = placeholdersUtils.failSafePlaceholders(prefs_def_lang.default_chatgpt_lang); break; case 'mail_attachments_info': @@ -516,4 +518,4 @@ export const placeholdersUtils = { return element; } -} \ No newline at end of file +} diff --git a/js/mzta-special-commands.js b/js/mzta-special-commands.js index 2ac7ac38..93685669 100644 --- a/js/mzta-special-commands.js +++ b/js/mzta-special-commands.js @@ -19,6 +19,7 @@ import { taLogger } from './mzta-logger.js'; + import { prefs_default } from '../options/mzta-options-default.js'; export class mzta_specialCommand { @@ -60,27 +61,50 @@ async initWorker() { switch (this.llm) { case "chatgpt_api": { - let prefs_api = await browser.storage.sync.get({chatgpt_api_key: '', chatgpt_model: '', chatgpt_developer_messages: ''}); + let prefs_api = await browser.storage.sync.get({ + chatgpt_api_key: prefs_default.chatgpt_api_key, + chatgpt_model: prefs_default.chatgpt_model, + chatgpt_developer_messages: prefs_default.chatgpt_developer_messages, + }); this.worker.postMessage({ type: 'init', chatgpt_api_key: prefs_api.chatgpt_api_key, chatgpt_model: prefs_api.chatgpt_model, chatgpt_developer_messages: prefs_api.chatgpt_developer_messages, do_debug: this.do_debug, i18nStrings: ''}); break; } case "google_gemini_api": { - let prefs_api = await browser.storage.sync.get({google_gemini_api_key: '', google_gemini_model: '', google_gemini_system_instruction: ''}); + let prefs_api = await browser.storage.sync.get({ + google_gemini_api_key: prefs_default.google_gemini_api_key, + google_gemini_model: prefs_default.google_gemini_model, + google_gemini_system_instruction: prefs_default.google_gemini_system_instruction, + }); this.worker.postMessage({ type: 'init', google_gemini_api_key: prefs_api.google_gemini_api_key, google_gemini_model: prefs_api.google_gemini_model, google_gemini_system_instruction: prefs_api.google_gemini_system_instruction, do_debug: this.do_debug, i18nStrings: ''}); break; } case "ollama_api": { - let prefs_api = await browser.storage.sync.get({ollama_host: '', ollama_model: ''}); + let prefs_api = await browser.storage.sync.get({ + ollama_host: prefs_default.ollama_host, + ollama_model: prefs_default.ollama_model, + }); this.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}); + let prefs_api = await browser.storage.sync.get({ + openai_comp_host: prefs_default.openai_comp_host, + openai_comp_model: prefs_default.openai_comp_model, + openai_comp_api_key: prefs_default.openai_comp_api_key, + openai_comp_use_v1: prefs_default.openai_comp_use_v1, + openai_comp_chat_name: prefs_default.openai_comp_chat_name, + do_debug: prefs_default.do_debug, + }); this.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; } case "anthropic_api": { - let prefs_api = await browser.storage.sync.get({anthropic_api_key: '', anthropic_model: '', anthropic_version: '2023-06-01', anthropic_max_tokens: 4096}); + let prefs_api = await browser.storage.sync.get({ + anthropic_api_key: prefs_default.anthropic_api_key, + anthropic_model: prefs_default.anthropic_model, + anthropic_version: prefs_default.anthropic_version, + anthropic_max_tokens: prefs_default.anthropic_max_tokens, + }); this.worker.postMessage({ type: 'init', anthropic_api_key: prefs_api.anthropic_api_key, anthropic_model: prefs_api.anthropic_model, anthropic_version: prefs_api.anthropic_version, anthropic_max_tokens: prefs_api.anthropic_max_tokens, do_debug: this.do_debug, i18nStrings: ''}); break; } @@ -131,4 +155,4 @@ } }); } - } \ No newline at end of file + } diff --git a/js/mzta-utils-prompt.js b/js/mzta-utils-prompt.js index 57098416..03f29c53 100644 --- a/js/mzta-utils-prompt.js +++ b/js/mzta-utils-prompt.js @@ -18,11 +18,12 @@ import { placeholdersUtils } from './mzta-placeholders.js'; import { extractJsonObject } from './mzta-utils.js'; +import { prefs_default } from '../options/mzta-options-default.js'; export const taPromptUtils = { async getDefaultSignature(){ - let prefs = await browser.storage.sync.get({default_sign_name: ''}); + let prefs = await browser.storage.sync.get({ default_sign_name: prefs_default.default_sign_name }); if(prefs.default_sign_name===''){ return ''; }else{ @@ -68,7 +69,7 @@ export const taPromptUtils = { selection_html: selection_html, tags_full_list: tags_full_list }); - let prefs_ph = await browser.storage.sync.get({placeholders_use_default_value: false}); + let prefs_ph = await browser.storage.sync.get({ placeholders_use_default_value: prefs_default.placeholders_use_default_value }); fullPrompt = (placeholdersUtils.replacePlaceholders({ text: curr_prompt.text, replacements: finalSubs, @@ -104,7 +105,7 @@ export const taPromptUtils = { async getDefaultLang(curr_prompt){ let chatgpt_lang = ''; if(String(curr_prompt.define_response_lang) == "1"){ - let prefs = await browser.storage.sync.get({default_chatgpt_lang: ''}); + let prefs = await browser.storage.sync.get({ default_chatgpt_lang: prefs_default.default_chatgpt_lang }); chatgpt_lang = prefs.default_chatgpt_lang; if(chatgpt_lang === ''){ chatgpt_lang = browser.i18n.getMessage("reply_same_lang"); @@ -152,4 +153,4 @@ export const taPromptUtils = { } return tags; } -}; \ No newline at end of file +}; diff --git a/js/mzta-utils.js b/js/mzta-utils.js index bf41319a..af6e82fc 100644 --- a/js/mzta-utils.js +++ b/js/mzta-utils.js @@ -16,6 +16,7 @@ * along with this program. If not, see . */ +import { prefs_default } from '../options/mzta-options-default.js'; const sparks_min = '1.2.0'; // Minimum version of ThunderAI-Sparks required for the add-on to work export const ChatGPTWeb_models = ['gpt-5','gpt-5-instant','gpt-5-t-mini','gpt-5-thinking']; // List of models available in ChatGPT Web @@ -388,7 +389,7 @@ export async function getTagsList(){ } export async function createTag(tag) { - let prefs_tag = await browser.storage.sync.get({add_tags_first_uppercase: true}); + let prefs_tag = await browser.storage.sync.get({ add_tags_first_uppercase: prefs_default.add_tags_first_uppercase }); if(prefs_tag.add_tags_first_uppercase) tag = tag.toLowerCase().charAt(0).toUpperCase() + tag.toLowerCase().slice(1); try { if(await isThunderbird128OrGreater()) { @@ -753,4 +754,4 @@ export async function* getMessages(list) { yield message; } } -} \ No newline at end of file +} diff --git a/mzta-background.js b/mzta-background.js index 4046b52a..c3c9c290 100644 --- a/mzta-background.js +++ b/mzta-background.js @@ -414,7 +414,7 @@ async function openChatGPT(promptText, action, curr_tabId, prompt_name = '', do_ if((originalText == null) || (originalText == "")) { originalText = prompt_info.body_text; } - let reply_type_pref = await browser.storage.sync.get({reply_type: 'reply_all'}); + let reply_type_pref = await browser.storage.sync.get({ reply_type: prefs_default.reply_type }); //console.log(">>>>>>>>>> prompt_info: " + JSON.stringify(prompt_info)); let pre_script = `let mztaWinId = `+ createdTab.windowId +`; let mztaStatusPageDesc="`+ browser.i18n.getMessage("prefs_status_page") +`"; diff --git a/pages/onboarding/onboarding.js b/pages/onboarding/onboarding.js index d9f8e6a7..7857e4a0 100644 --- a/pages/onboarding/onboarding.js +++ b/pages/onboarding/onboarding.js @@ -17,11 +17,15 @@ */ import { taLogger } from '../../js/mzta-logger.js'; +import { prefs_default } from '../../options/mzta-options-default.js'; let taLog = null; document.addEventListener('DOMContentLoaded', async () => { - let prefs = await browser.storage.sync.get({do_debug: false, connection_type: 'chatgpt_web'}); + let prefs = await browser.storage.sync.get({ + do_debug: prefs_default.do_debug, + connection_type: prefs_default.connection_type, + }); taLog = new taLogger("mzta-popup",prefs.do_debug); i18n.updateDocument(); if(prefs.connection_type === 'chatgpt_web'){ @@ -62,4 +66,4 @@ document.addEventListener('DOMContentLoaded', async () => { }); } } -}, { once: true }); \ No newline at end of file +}, { once: true }); From 9d34ef2cf7c32030c8c0d972033506855999ace1 Mon Sep 17 00:00:00 2001 From: Mic Date: Mon, 8 Sep 2025 22:00:00 +0200 Subject: [PATCH 07/11] gemini, added model default option for the thinking budget. see #494 --- js/api/google_gemini.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/js/api/google_gemini.js b/js/api/google_gemini.js index fbcec986..5dad89e0 100644 --- a/js/api/google_gemini.js +++ b/js/api/google_gemini.js @@ -24,24 +24,25 @@ export class GoogleGemini { model = ''; system_instruction = ''; stream = false; - thinkingBudget = 0; //Off + thinkingBudget = ''; // Model default constructor({ apiKey = '', model = '', system_instruction = '', stream = false, - thinkingBudget = 0 + thinkingBudget = '', } = {}) { this.apiKey = apiKey; this.model = model; this.system_instruction = system_instruction; this.stream = stream; - this.thinkingBudget = thinkingBudget; + this.thinkingBudget = thinkingBudget.trim(); /* Info from: https://ai.google.dev/gemini-api/docs/thinking?#set-budget # Turn on thinking with a specific token limit: "thinkingBudget": 1024 # Thinking off: "thinkingBudget": 0 # Turn on dynamic thinking: "thinkingBudget": -1 + # Keep model default thinking: "thinkingBudget": "" */ } @@ -97,6 +98,9 @@ export class GoogleGemini { text: this.system_instruction } }; + } + + if(this.thinkingBudget !== '') { google_gemini_body.generationConfig = { thinkingConfig: { thinkingBudget: this.thinkingBudget, From 2b794690d870a46039f720fcf947b199941327a3 Mon Sep 17 00:00:00 2001 From: Mic Date: Mon, 8 Sep 2025 22:00:00 +0200 Subject: [PATCH 08/11] thinkingBudget renamed to thinking_budget. see #494 --- js/api/google_gemini.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/js/api/google_gemini.js b/js/api/google_gemini.js index 5dad89e0..c8145029 100644 --- a/js/api/google_gemini.js +++ b/js/api/google_gemini.js @@ -24,25 +24,25 @@ export class GoogleGemini { model = ''; system_instruction = ''; stream = false; - thinkingBudget = ''; // Model default + thinking_budget = ''; // Model default constructor({ apiKey = '', model = '', system_instruction = '', stream = false, - thinkingBudget = '', + thinking_budget = '', } = {}) { this.apiKey = apiKey; this.model = model; this.system_instruction = system_instruction; this.stream = stream; - this.thinkingBudget = thinkingBudget.trim(); + this.thinking_budget = thinking_budget.trim(); /* Info from: https://ai.google.dev/gemini-api/docs/thinking?#set-budget - # Turn on thinking with a specific token limit: "thinkingBudget": 1024 - # Thinking off: "thinkingBudget": 0 - # Turn on dynamic thinking: "thinkingBudget": -1 - # Keep model default thinking: "thinkingBudget": "" + # Turn on thinking with a specific token limit: "thinking_budget": 1024 + # Thinking off: "thinking_budget": 0 + # Turn on dynamic thinking: "thinking_budget": -1 + # Keep model default thinking: "thinking_budget": "" */ } @@ -100,10 +100,10 @@ export class GoogleGemini { }; } - if(this.thinkingBudget !== '') { + if(this.thinking_budget !== '') { google_gemini_body.generationConfig = { thinkingConfig: { - thinkingBudget: this.thinkingBudget, + thinking_budget: this.thinking_budget, } }; } From 59758a76c0ae370e218959e5934b4ae84470d8b6 Mon Sep 17 00:00:00 2001 From: Mic Date: Mon, 8 Sep 2025 22:00:00 +0200 Subject: [PATCH 09/11] using thinking_budget in gemini. see #494 --- api_webchat/controller.js | 1 + js/mzta-special-commands.js | 48 +++++++++++++++++++++--- js/workers/model-worker-google_gemini.js | 1 + options/mzta-options-default.js | 2 +- 4 files changed, 46 insertions(+), 6 deletions(-) diff --git a/api_webchat/controller.js b/api_webchat/controller.js index c4ddf25c..ccec08d4 100644 --- a/api_webchat/controller.js +++ b/api_webchat/controller.js @@ -138,6 +138,7 @@ switch (llm) { google_gemini_api_key: prefs_api.google_gemini_api_key, google_gemini_model: prefs_api.google_gemini_model, google_gemini_system_instruction: prefs_api.google_gemini_system_instruction, + google_gemini_thinking_budget: prefs_api.google_gemini_thinking_budget, do_debug: prefs_api.do_debug, i18nStrings: i18nStrings }); diff --git a/js/mzta-special-commands.js b/js/mzta-special-commands.js index 93685669..2734f2ce 100644 --- a/js/mzta-special-commands.js +++ b/js/mzta-special-commands.js @@ -66,7 +66,14 @@ chatgpt_model: prefs_default.chatgpt_model, chatgpt_developer_messages: prefs_default.chatgpt_developer_messages, }); - this.worker.postMessage({ type: 'init', chatgpt_api_key: prefs_api.chatgpt_api_key, chatgpt_model: prefs_api.chatgpt_model, chatgpt_developer_messages: prefs_api.chatgpt_developer_messages, do_debug: this.do_debug, i18nStrings: ''}); + this.worker.postMessage({ + type: 'init', + chatgpt_api_key: prefs_api.chatgpt_api_key, + chatgpt_model: prefs_api.chatgpt_model, + chatgpt_developer_messages: prefs_api.chatgpt_developer_messages, + do_debug: this.do_debug, + i18nStrings: '' + }); break; } case "google_gemini_api": { @@ -74,8 +81,17 @@ google_gemini_api_key: prefs_default.google_gemini_api_key, google_gemini_model: prefs_default.google_gemini_model, google_gemini_system_instruction: prefs_default.google_gemini_system_instruction, + google_gemini_thinking_budget: prefs_default.google_gemini_thinking_budget, + }); + this.worker.postMessage({ + type: 'init', + google_gemini_api_key: prefs_api.google_gemini_api_key, + google_gemini_model: prefs_api.google_gemini_model, + google_gemini_system_instruction: prefs_api.google_gemini_system_instruction, + google_gemini_thinking_budget: prefs_api.google_gemini_thinking_budget, + do_debug: this.do_debug, + i18nStrings: '' }); - this.worker.postMessage({ type: 'init', google_gemini_api_key: prefs_api.google_gemini_api_key, google_gemini_model: prefs_api.google_gemini_model, google_gemini_system_instruction: prefs_api.google_gemini_system_instruction, do_debug: this.do_debug, i18nStrings: ''}); break; } case "ollama_api": { @@ -83,7 +99,13 @@ ollama_host: prefs_default.ollama_host, ollama_model: prefs_default.ollama_model, }); - this.worker.postMessage({ type: 'init', ollama_host: prefs_api.ollama_host, ollama_model: prefs_api.ollama_model, do_debug: this.do_debug, i18nStrings: ''}); + this.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": { @@ -95,7 +117,15 @@ openai_comp_chat_name: prefs_default.openai_comp_chat_name, do_debug: prefs_default.do_debug, }); - this.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: ''}); + this.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; } case "anthropic_api": { @@ -105,7 +135,15 @@ anthropic_version: prefs_default.anthropic_version, anthropic_max_tokens: prefs_default.anthropic_max_tokens, }); - this.worker.postMessage({ type: 'init', anthropic_api_key: prefs_api.anthropic_api_key, anthropic_model: prefs_api.anthropic_model, anthropic_version: prefs_api.anthropic_version, anthropic_max_tokens: prefs_api.anthropic_max_tokens, do_debug: this.do_debug, i18nStrings: ''}); + this.worker.postMessage({ + type: 'init', + anthropic_api_key: prefs_api.anthropic_api_key, + anthropic_model: prefs_api.anthropic_model, + anthropic_version: prefs_api.anthropic_version, + anthropic_max_tokens: prefs_api.anthropic_max_tokens, + do_debug: this.do_debug, + i18nStrings: '' + }); break; } } diff --git a/js/workers/model-worker-google_gemini.js b/js/workers/model-worker-google_gemini.js index 67e69c14..cb961a66 100644 --- a/js/workers/model-worker-google_gemini.js +++ b/js/workers/model-worker-google_gemini.js @@ -42,6 +42,7 @@ self.onmessage = async function(event) { apiKey: google_gemini_api_key, model: google_gemini_model, system_instruction: event.data.google_gemini_system_instruction, + thinking_budget: event.data.google_gemini_thinking_budget, stream: true }); do_debug = event.data.do_debug; diff --git a/options/mzta-options-default.js b/options/mzta-options-default.js index 93f77836..94d7ebec 100644 --- a/options/mzta-options-default.js +++ b/options/mzta-options-default.js @@ -45,7 +45,7 @@ export const prefs_default = { google_gemini_api_key: '', google_gemini_model: '', google_gemini_system_instruction: '', - google_gemini_thinking_budget: 0, + google_gemini_thinking_budget: '', anthropic_api_key: '', anthropic_model: '', anthropic_version: '2023-06-01', From ac519c3ff5b1a06bf61bcf463d4786dba073a4a4 Mon Sep 17 00:00:00 2001 From: Mic Date: Mon, 8 Sep 2025 22:09:00 +0200 Subject: [PATCH 10/11] trim fixed --- js/api/google_gemini.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/api/google_gemini.js b/js/api/google_gemini.js index c8145029..f2e2eb67 100644 --- a/js/api/google_gemini.js +++ b/js/api/google_gemini.js @@ -37,7 +37,7 @@ export class GoogleGemini { this.model = model; this.system_instruction = system_instruction; this.stream = stream; - this.thinking_budget = thinking_budget.trim(); + this.thinking_budget = String(thinking_budget ?? '').trim(); /* Info from: https://ai.google.dev/gemini-api/docs/thinking?#set-budget # Turn on thinking with a specific token limit: "thinking_budget": 1024 # Thinking off: "thinking_budget": 0 From aad9fcb06db8f6bf6cd0cd5a7f8636b6d40af0bd Mon Sep 17 00:00:00 2001 From: mic Date: Tue, 9 Sep 2025 21:44:03 +0200 Subject: [PATCH 11/11] release notes updated --- CHANGELOG.md | 1 + options/mzta-release-notes.html | 1 + 2 files changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d7f677e5..f9eb4f9c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@
  • Added the {%mail_attachments_info%} placeholder to retrieve the name, type and file size of the mail attachments [#446].
  • [ChatGPT Web] Added a message to explain to click on "Force completion" if the ChatGPT job is not done after 7 seconds [#419].
  • [All APIs] The prompt id and name are now shown in the information header in the AI API chat [#436].
  • +
  • [Google Gemini API]Support for the thinkingBudget parameter has been added [#494].
  • ...
  • Version 3.6.1 - 23/08/2025

    diff --git a/options/mzta-release-notes.html b/options/mzta-release-notes.html index dd3b1bcd..f883c3ff 100644 --- a/options/mzta-release-notes.html +++ b/options/mzta-release-notes.html @@ -12,6 +12,7 @@
  • Added the {%mail_attachments_info%} placeholder to retrieve the name, type and file size of the mail attachments [#446].
  • [ChatGPT Web] Added a message to explain to click on "Force completion" if the ChatGPT job is not done after 7 seconds [#419].
  • [All APIs] The prompt id and name are now shown in the information header in the AI API chat [#436].
  • +
  • [Google Gemini API]Support for the thinkingBudget parameter has been added [#494].
  • ...
  • Version 3.6.1 - 23/08/2025