feat: 设置面板新增温度(Temperature)滑块控制

- 设置面板新增温度滑块 (0~2, 步长0.1)
- 实时显示当前值,保存到 IndexedDB 持久化
- 切换预设时自动同步温度滑块 UI
- 应用启动时从 DB 恢复温度设置
This commit is contained in:
thzxx
2026-04-05 20:07:38 +08:00
parent 4b72a1fc5d
commit 8a8c5da968
4 changed files with 29 additions and 1 deletions
+3
View File
@@ -193,6 +193,9 @@
<span class="text-muted" style="white-space:nowrap;">tokens</span>
</div>
<p class="text-muted" style="margin-top:4px;font-size:11px;">常见值:2048 / 4096 / 8192 / 32768。值越大上下文越长,显存占用越高。</p>
<label class="setting-label" style="margin-top:12px;">温度(Temperature):<span id="tempValue">0.7</span></label>
<input type="range" id="inputTemperature" class="preset-temp-slider" min="0" max="2" step="0.1" value="0.7">
<p class="text-muted" style="margin-top:4px;font-size:11px;">低值更精确稳定,高值更有创意多样(0 = 确定性,2 = 最大随机)</p>
</div>
<div class="setting-group">
<label class="setting-label">运行中的模型</label>
+5 -1
View File
@@ -142,19 +142,23 @@ async function init() {
await db.saveSetting('selectedModel', savedModel);
}
// 8. 恢复系统提示词上下文长度
// 8. 恢复系统提示词上下文长度、温度
const systemPromptEnabled = await db.getSetting('systemPromptEnabled', false);
const systemPrompt = await db.getSetting('systemPrompt', '');
const numCtx = await db.getSetting('numCtx', 24576);
const temperature = await db.getSetting('temperature', 0.7);
state.set(KEYS.SYSTEM_PROMPT_ENABLED, systemPromptEnabled);
state.set(KEYS.SYSTEM_PROMPT, systemPrompt);
state.set(KEYS.NUM_CTX, numCtx);
state.set('temperature', temperature);
document.querySelector('#toggleSystemPrompt').checked = systemPromptEnabled;
document.querySelector('#inputSystemPrompt').disabled = !systemPromptEnabled;
document.querySelector('#inputSystemPrompt').value = systemPrompt;
document.querySelector('#inputNumCtx').value = numCtx;
document.querySelector('#inputTemperature').value = temperature;
document.querySelector('#tempValue').textContent = parseFloat(temperature).toFixed(1);
// 9. 聚焦输入框
document.querySelector('#chatInput')?.focus();
+15
View File
@@ -62,6 +62,21 @@ export function initSettingsModal() {
}, 500);
document.querySelector('#inputNumCtx').addEventListener('input', saveNumCtx);
// 温度滑块
const tempSlider = document.querySelector('#inputTemperature');
const tempDisplay = document.querySelector('#tempValue');
tempSlider.addEventListener('input', () => {
const val = parseFloat(tempSlider.value);
tempDisplay.textContent = val.toFixed(1);
});
const saveTemperature = debounce(async () => {
const db = state.get(KEYS.DB);
const val = parseFloat(tempSlider.value);
state.set('temperature', val);
if (db) await db.saveSetting('temperature', val);
}, 300);
tempSlider.addEventListener('change', saveTemperature);
// 释放显存
document.querySelector('#btnReleaseVRAM').addEventListener('click', async () => {
const api = state.get(KEYS.API);
+6
View File
@@ -227,6 +227,12 @@ function syncPresetToUI(preset) {
const inputCtx = document.querySelector('#inputNumCtx');
if (inputCtx) inputCtx.value = preset.numCtx || 24576;
// Temperature
const tempSlider = document.querySelector('#inputTemperature');
const tempDisplay = document.querySelector('#tempValue');
if (tempSlider) tempSlider.value = preset.temperature ?? 0.7;
if (tempDisplay) tempDisplay.textContent = (preset.temperature ?? 0.7).toFixed(1);
// Think toggle
const thinkCheckbox = document.querySelector('#toggleThink');
if (thinkCheckbox) {