diff --git a/background.js b/background.js index 3526d63..1e630c5 100644 --- a/background.js +++ b/background.js @@ -14,7 +14,7 @@ console.log("[ai-filter] background.js loaded – ready to classify"); (async () => { try { - const store = await browser.storage.local.get(["endpoint", "templateName", "customTemplate", "customSystemPrompt"]); + const store = await browser.storage.local.get(["endpoint", "templateName", "customTemplate", "customSystemPrompt", "aiParams"]); await browser.aiFilter.initConfig(store); console.log("[ai-filter] configuration loaded", store); try { diff --git a/modules/ExpressionSearchFilter.jsm b/modules/ExpressionSearchFilter.jsm index 694225c..15f7a7a 100644 --- a/modules/ExpressionSearchFilter.jsm +++ b/modules/ExpressionSearchFilter.jsm @@ -118,6 +118,20 @@ let gCustomTemplate = ""; let gCustomSystemPrompt = DEFAULT_CUSTOM_SYSTEM_PROMPT; let gTemplateText = ""; +let gAiParams = { + max_tokens: 4096, + temperature: 0.6, + top_p: 0.95, + seed: -1, + repetition_penalty: 1.0, + top_k: 20, + min_p: 0, + presence_penalty: 0, + frequency_penalty: 0, + typical_p: 1, + tfs: 1, +}; + function loadTemplate(name) { try { let url = `resource://aifilter/prompt_templates/${name}.txt`; @@ -147,6 +161,13 @@ function setConfig(config = {}) { if (typeof config.customSystemPrompt === "string") { gCustomSystemPrompt = config.customSystemPrompt; } + if (config.aiParams && typeof config.aiParams === "object") { + for (let [k, v] of Object.entries(config.aiParams)) { + if (k in gAiParams && typeof v !== "undefined") { + gAiParams[k] = v; + } + } + } gTemplateText = gTemplateName === "custom" ? gCustomTemplate : loadTemplate(gTemplateName); console.log(`[ai-filter][ExpressionSearchFilter] Endpoint set to ${gEndpoint}`); console.log(`[ai-filter][ExpressionSearchFilter] Template set to ${gTemplateName}`); @@ -187,20 +208,10 @@ class ClassificationTerm extends CustomerTermBase { } let body = getPlainText(msgHdr); - let payload = JSON.stringify({ - prompt: buildPrompt(body, value), - max_tokens: 4096, - temperature: 0.6, - top_p: 0.95, - seed: -1, - repetition_penalty: 1.0, - top_k: 20, - min_p: 0, - presence_penalty: 0, - frequency_penalty: 0, - typical_p: 1, - tfs: 1 - }); + let payloadObj = Object.assign({ + prompt: buildPrompt(body, value) + }, gAiParams); + let payload = JSON.stringify(payloadObj); console.log(`[ai-filter][ExpressionSearchFilter] Sending classification request to ${gEndpoint}`); diff --git a/options/options.html b/options/options.html index b0c5a78..a1a2fc5 100644 --- a/options/options.html +++ b/options/options.html @@ -142,8 +142,56 @@
+ + diff --git a/options/options.js b/options/options.js index 4e3e3a0..7f0604f 100644 --- a/options/options.js +++ b/options/options.js @@ -3,8 +3,22 @@ document.addEventListener('DOMContentLoaded', async () => { 'endpoint', 'templateName', 'customTemplate', - 'customSystemPrompt' + 'customSystemPrompt', + 'aiParams' ]); + const DEFAULT_AI_PARAMS = { + max_tokens: 4096, + temperature: 0.6, + top_p: 0.95, + seed: -1, + repetition_penalty: 1.0, + top_k: 20, + min_p: 0, + presence_penalty: 0, + frequency_penalty: 0, + typical_p: 1, + tfs: 1 + }; document.getElementById('endpoint').value = defaults.endpoint || 'http://127.0.0.1:5000/v1/classify'; const templates = { @@ -32,6 +46,18 @@ document.addEventListener('DOMContentLoaded', async () => { templateSelect.addEventListener('change', updateVisibility); updateVisibility(); + const advancedBox = document.getElementById('advanced-options'); + const advancedBtn = document.getElementById('toggle-advanced'); + advancedBtn.addEventListener('click', () => { + advancedBox.style.display = advancedBox.style.display === 'none' ? 'block' : 'none'; + }); + + const aiParams = Object.assign({}, DEFAULT_AI_PARAMS, defaults.aiParams || {}); + for (const [key, val] of Object.entries(aiParams)) { + const el = document.getElementById(key); + if (el) el.value = val; + } + const DEFAULT_SYSTEM = 'Determine whether the email satisfies the user\'s criterion.'; const systemBox = document.getElementById('system-instructions'); systemBox.value = defaults.customSystemPrompt || DEFAULT_SYSTEM; @@ -44,9 +70,17 @@ document.addEventListener('DOMContentLoaded', async () => { const templateName = templateSelect.value; const customTemplateText = customTemplate.value; const customSystemPrompt = systemBox.value; - await browser.storage.local.set({ endpoint, templateName, customTemplate: customTemplateText, customSystemPrompt }); + const aiParamsSave = {}; + for (const key of Object.keys(DEFAULT_AI_PARAMS)) { + const el = document.getElementById(key); + if (el) { + const num = parseFloat(el.value); + aiParamsSave[key] = isNaN(num) ? DEFAULT_AI_PARAMS[key] : num; + } + } + await browser.storage.local.set({ endpoint, templateName, customTemplate: customTemplateText, customSystemPrompt, aiParams: aiParamsSave }); try { - await browser.aiFilter.initConfig({ endpoint, templateName, customTemplate: customTemplateText, customSystemPrompt }); + await browser.aiFilter.initConfig({ endpoint, templateName, customTemplate: customTemplateText, customSystemPrompt, aiParams: aiParamsSave }); } catch (e) { console.error('[ai-filter][options] failed to apply config', e); }