diff --git a/index.html b/index.html index 466f67f..d0d599d 100644 --- a/index.html +++ b/index.html @@ -79,55 +79,75 @@ + +
+ +
+ + +
+ + +
+
+ +
- + +
- - -
-
- - -

Variety. Lower = predictable.

-
-
- - -

Nucleus sampling.

-
-
- - -

Token shortlist size.

-
-
- - -

Discourage repeats by count.

-
-
- - -

Discourage seen tokens.

-
-
- - -

Reduce verbatim echoes.

-
-
- - -

Minimum token prob vs best.

-
-
- - -

Adaptive nucleus filter.

+ + +

Variety. Lower = predictable.

+
+
+ + +

Nucleus sampling.

+
+
+ + +

Token shortlist size.

+
+
+ + +

Discourage repeats by count.

+
+
+ + +

Discourage seen tokens.

+
+
+ + +

Reduce verbatim echoes.

+
+
+ + +

Minimum token prob vs best.

+
+
+ + +

Adaptive nucleus filter.

+
-
+ + + +
@@ -158,6 +178,12 @@ settingsForm: document.getElementById('settingsForm'), closeSettings: document.getElementById('closeSettings'), cancelSettings: document.getElementById('cancelSettings'), + // tab buttons & panels + tabModel: document.getElementById('tabModel'), + tabPrompt: document.getElementById('tabPrompt'), + panelModel: document.getElementById('panelModel'), + panelPrompt: document.getElementById('panelPrompt'), + // inputs set_model: document.getElementById('set_model'), set_temperature: document.getElementById('set_temperature'), set_top_p: document.getElementById('set_top_p'), @@ -167,6 +193,7 @@ set_repetition_penalty: document.getElementById('set_repetition_penalty'), set_min_p: document.getElementById('set_min_p'), set_top_a: document.getElementById('set_top_a'), + set_system_prompt: document.getElementById('set_system_prompt'), }; // === Local storage === @@ -176,6 +203,9 @@ set apiKey(v) { localStorage.setItem('openrouter_api_key', v || ''); updateStatus(); }, get model() { return localStorage.getItem('openrouter_model') || DEFAULT_MODEL; }, set model(v) { localStorage.setItem('openrouter_model', v || DEFAULT_MODEL); }, + // system prompt + get system_prompt() { return localStorage.getItem('openrouter_system_prompt') || ''; }, + set system_prompt(v) { localStorage.setItem('openrouter_system_prompt', v || ''); }, // sampling params get temperature() { return num(localStorage.getItem('openrouter_temperature'), 1.0); }, @@ -317,9 +347,14 @@ } try { state.controller = new AbortController(); + // Build messages with optional system prompt + const msgs = []; + if (store.system_prompt) msgs.push({ role: 'system', content: store.system_prompt }); + msgs.push(...state.messages.filter(m => m.role !== 'system')); + const body = payloadWithSampling({ model, - messages: state.messages.filter(m => m.role !== 'system'), + messages: msgs, stream: true, }); const res = await fetch('https://openrouter.ai/api/v1/chat/completions', { @@ -409,18 +444,37 @@ el.set_repetition_penalty.value = store.repetition_penalty; el.set_min_p.value = store.min_p; el.set_top_a.value = store.top_a; + el.set_system_prompt.value = store.system_prompt; + showModelTab(); el.settingsModal.classList.remove('hidden'); } function closeSettings() { el.settingsModal.classList.add('hidden'); } + // Tab toggling + function showModelTab() { + el.tabModel.classList.add('border-black'); + el.tabPrompt.classList.remove('border-black'); + el.panelModel.classList.remove('hidden'); + el.panelPrompt.classList.add('hidden'); + } + function showPromptTab() { + el.tabPrompt.classList.add('border-black'); + el.tabModel.classList.remove('border-black'); + el.panelPrompt.classList.remove('hidden'); + el.panelModel.classList.add('hidden'); + } + el.closeSettings.addEventListener('click', closeSettings); el.cancelSettings.addEventListener('click', closeSettings); el.settingsModal.addEventListener('click', (e) => { if (e.target === el.settingsModal || e.target.classList.contains('bg-black/30')) closeSettings(); }); + el.tabModel.addEventListener('click', showModelTab); + el.tabPrompt.addEventListener('click', showPromptTab); + el.settingsForm.addEventListener('submit', (e) => { e.preventDefault(); // collect + clamp @@ -444,6 +498,7 @@ store.repetition_penalty = repetition_penalty; store.min_p = min_p; store.top_a = top_a; + store.system_prompt = el.set_system_prompt.value.trim(); closeSettings(); });