ThunderAI Release Notes
-
Version 3.8.0 - ??/??/2025
+
Version 3.8.0 - ??/??/2026
+ - [All APIs] Now it is possible to define an API and its settings for any custom prompt. This allows anyone to use different AI providers for different prompts [#102].
- [All APIs] When using special prompts (like automatically adding tags or the spam filter) with a specific API integration, all the settings for that integration can be specific. In this way you can use different api keys for the same integration, or different system prompt or temperature [#590].
- [All APIs] Added the temperature parameter [#561].
- [OpenAI API] Model filtering improved when choosing a model in the options page.
@@ -16,6 +17,7 @@
- It is now possible to define a custom placeholder with dynamic data to retrieve any header present in the current email [#527].
- [All APIs] The configuration information reported in the webchat API has been improved for all integrations.
- Spanish (es) translation added, thanks to Gerardo Sobarzo, Andrés Rendón Hernández, Erick Limon.
+ - Swedish (sv) translation added, thanks to Andreas Pettersson.
- Various fixes.
- ...
diff --git a/pages/addtags/mzta-add-tags.js b/pages/addtags/mzta-add-tags.js
index 7f323fd8..c2a20275 100644
--- a/pages/addtags/mzta-add-tags.js
+++ b/pages/addtags/mzta-add-tags.js
@@ -80,6 +80,7 @@ document.addEventListener('DOMContentLoaded', async () => {
let addtags_textarea = document.getElementById('addtags_prompt_text');
let addtags_save_btn = document.getElementById('btn_save_prompt');
let addtags_reset_btn = document.getElementById('btn_reset_prompt');
+ let add_tags_use_specific_integration = document.getElementById('add_tags_use_specific_integration');
addtags_textarea.addEventListener('input', (event) => {
addtags_reset_btn.disabled = (event.target.value === browser.i18n.getMessage('prompt_add_tags_full_text'));
@@ -91,6 +92,12 @@ document.addEventListener('DOMContentLoaded', async () => {
}
});
+ add_tags_use_specific_integration.addEventListener('change', (event) => {
+ if (!event.target.checked) {
+ browser.storage.sync.set({ add_tags_connection_type: '' });
+ }
+ });
+
let add_tags_auto_el = document.getElementById('add_tags_auto');
let add_tags_auto_only_inbox_tr = document.getElementById('add_tags_auto_only_inbox_tr');
let account_selector_container = document.getElementById('account_selector_container');
diff --git a/pages/customprompts/mzta-custom-prompts.js b/pages/customprompts/mzta-custom-prompts.js
index 2b01f6e6..2a70510e 100644
--- a/pages/customprompts/mzta-custom-prompts.js
+++ b/pages/customprompts/mzta-custom-prompts.js
@@ -482,6 +482,37 @@ function handleEditClick(e) {
selectEl.value = '';
selectEl.dispatchEvent(new Event('change'));
}
+
+ // Clear UI inputs
+ for (const [integration, options] of Object.entries(integration_options_config)) {
+ for (const key of Object.keys(options)) {
+ const propName = `${integration}_${key}`;
+ const inputId = `${prefix}${propName}`;
+ const inputEl = document.getElementById(inputId);
+ if (inputEl) {
+ if (inputEl.type === 'checkbox') {
+ inputEl.checked = false;
+ } else {
+ inputEl.value = '';
+ }
+ }
+ }
+ }
+
+ // Update promptsList
+ const item = promptsList.get('id', id)[0];
+ if (item) {
+ let newValues = item.values();
+ newValues.api_type = '';
+ for (const [integration, options] of Object.entries(integration_options_config)) {
+ for (const key of Object.keys(options)) {
+ const propName = `${integration}_${key}`;
+ newValues[propName] = '';
+ }
+ }
+ item.values(newValues);
+ }
+ setSomethingChanged();
}
}).then(() => {
populateConnectionUI(tr, id, prefix, selectId);
diff --git a/pages/spamfilter/mzta-spamfilter.js b/pages/spamfilter/mzta-spamfilter.js
index e2e0a36a..a40cbe21 100644
--- a/pages/spamfilter/mzta-spamfilter.js
+++ b/pages/spamfilter/mzta-spamfilter.js
@@ -80,6 +80,7 @@ document.addEventListener('DOMContentLoaded', async () => {
let spamfilter_textarea = document.getElementById('spamfilter_prompt_text');
let spamfilter_save_btn = document.getElementById('btn_save_prompt');
let spamfilter_reset_btn = document.getElementById('btn_reset_prompt');
+ let spamfilter_use_specific_integration = document.getElementById('spamfilter_use_specific_integration');
spamfilter_textarea.addEventListener('input', (event) => {
spamfilter_reset_btn.disabled = (event.target.value === browser.i18n.getMessage('prompt_spamfilter_full_text'));
@@ -91,6 +92,12 @@ document.addEventListener('DOMContentLoaded', async () => {
}
});
+ spamfilter_use_specific_integration.addEventListener('change', (event) => {
+ if (!event.target.checked) {
+ browser.storage.sync.set({ spamfilter_connection_type: '' });
+ }
+ });
+
spamfilter_reset_btn.addEventListener('click', () => {
spamfilter_textarea.value = browser.i18n.getMessage('prompt_spamfilter_full_text');
spamfilter_reset_btn.disabled = true;