Skip to content

Commit a155f34

Browse files
committed
feat: thinking budget toggle to proxy chat
1 parent ca4556e commit a155f34

2 files changed

Lines changed: 84 additions & 11 deletions

File tree

index.html

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -240,15 +240,15 @@ <h3>生成参数</h3>
240240
</div>
241241
</div>
242242

243-
<div class="settings-group">
243+
<div class="settings-group" id="thinkingModeGroup">
244244
<label for="enableThinkingToggle">思考模式 (Thinking Mode):</label>
245245
<input type="checkbox" id="enableThinkingToggle">
246246
<div class="settings-description">
247247
关闭则不使用思考模式;开启时可选择“思考等级”或设置“思考预算”。
248248
</div>
249249
</div>
250250

251-
<div class="settings-group">
251+
<div class="settings-group" id="thinkingLevelGroup">
252252
<label for="thinkingLevelSelector">思考等级 (Thinking Level):</label>
253253
<select id="thinkingLevelSelector" class="settings-input">
254254
<option value="">未指定</option>
@@ -260,9 +260,17 @@ <h3>生成参数</h3>
260260
</div>
261261
</div>
262262

263-
<div class="settings-group">
263+
<div class="settings-group" id="manualBudgetGroup">
264+
<label for="enableManualBudgetToggle">限制思考预算 (Manual Budget):</label>
265+
<input type="checkbox" id="enableManualBudgetToggle">
266+
<div class="settings-description">
267+
打开以手动限制思考预算;关闭则不限制预算。
268+
</div>
269+
</div>
270+
271+
<div class="settings-group" id="thinkingBudgetGroup">
264272
<label for="thinkingBudgetValue">思考预算 (Thinking Budget):</label>
265-
<div class="settings-slider-container">
273+
<div id="thinkingBudgetControlsContainer" class="settings-slider-container">
266274
<input type="range" id="thinkingBudgetSlider" class="settings-slider" min="128" max="32768" step="1" value="8192">
267275
<input type="number" id="thinkingBudgetValue" class="settings-number" min="128" max="32768" step="1" value="8192">
268276
</div>

webui.js

Lines changed: 72 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ let chatbox, userInput, sendButton, clearButton, sidebarPanel, toggleSidebarButt
88
topPValue, stopSequencesInput, saveModelSettingsButton, resetModelSettingsButton,
99
settingsStatusElement, apiKeyStatus, newApiKeyInput, toggleApiKeyVisibilityButton,
1010
testApiKeyButton, apiKeyList,
11-
enableThinkingToggle, thinkingLevelSelector, thinkingBudgetSlider, thinkingBudgetValue,
11+
enableThinkingToggle, thinkingLevelSelector, enableManualBudgetToggle, thinkingBudgetSlider, thinkingBudgetValue,
12+
thinkingBudgetControlsContainer,
13+
thinkingModeGroup, thinkingLevelGroup, manualBudgetGroup, thinkingBudgetGroup,
1214
enableGoogleSearchToggle;
1315

1416
function initializeDOMReferences() {
@@ -48,8 +50,14 @@ function initializeDOMReferences() {
4850

4951
enableThinkingToggle = document.getElementById('enableThinkingToggle');
5052
thinkingLevelSelector = document.getElementById('thinkingLevelSelector');
53+
enableManualBudgetToggle = document.getElementById('enableManualBudgetToggle');
5154
thinkingBudgetSlider = document.getElementById('thinkingBudgetSlider');
5255
thinkingBudgetValue = document.getElementById('thinkingBudgetValue');
56+
thinkingBudgetControlsContainer = document.getElementById('thinkingBudgetControlsContainer');
57+
thinkingModeGroup = document.getElementById('thinkingModeGroup');
58+
thinkingLevelGroup = document.getElementById('thinkingLevelGroup');
59+
manualBudgetGroup = document.getElementById('manualBudgetGroup');
60+
thinkingBudgetGroup = document.getElementById('thinkingBudgetGroup');
5361

5462
enableGoogleSearchToggle = document.getElementById('enableGoogleSearchToggle');
5563

@@ -73,12 +81,31 @@ function modelUsesThinkingLevel(modelId) {
7381

7482
function computeReasoningEffort(settings) {
7583
try {
76-
if (!settings.enableThinking) return 0;
77-
const lvl = (settings.thinkingLevel || '').toLowerCase();
78-
const budget = parseInt(settings.thinkingBudget);
7984
const useLevels = modelUsesThinkingLevel(SELECTED_MODEL);
80-
if (useLevels && (lvl === 'low' || lvl === 'high')) return lvl;
81-
if (!isNaN(budget) && budget > 0) return budget;
85+
const id = String(SELECTED_MODEL || '').toLowerCase();
86+
const hasMainToggle = id.includes('flash');
87+
88+
if (useLevels) {
89+
if (!settings.enableThinking) return 0;
90+
const lvl = (settings.thinkingLevel || '').toLowerCase();
91+
if (lvl === 'low' || lvl === 'high') return lvl;
92+
return 'low';
93+
}
94+
95+
if (hasMainToggle) {
96+
if (!settings.enableThinking) return 0;
97+
if (settings.enableManualBudget) {
98+
const budget = parseInt(settings.thinkingBudget);
99+
if (!isNaN(budget) && budget > 0) return budget;
100+
}
101+
return 'none';
102+
}
103+
104+
if (settings.enableManualBudget) {
105+
const budget = parseInt(settings.thinkingBudget);
106+
if (!isNaN(budget) && budget > 0) return budget;
107+
return 8192;
108+
}
82109
return 'none';
83110
} catch (e) {
84111
return 'none';
@@ -111,6 +138,7 @@ let modelSettings = {
111138
topP: -1,
112139
stopSequences: "",
113140
enableThinking: false,
141+
enableManualBudget: false,
114142
thinkingBudget: 8192,
115143
thinkingLevel: "",
116144
enableGoogleSearch: false
@@ -282,6 +310,35 @@ function updateControlsForSelectedModel() {
282310
modelSettings.temperature = parseFloat(temp);
283311
modelSettings.maxOutputTokens = parseInt(maxTokens);
284312
modelSettings.topP = parseFloat(topP);
313+
314+
try {
315+
const id = String(SELECTED_MODEL || '').toLowerCase();
316+
let budgetMax = 32768;
317+
if (id.includes('flash-lite')) {
318+
budgetMax = 24576;
319+
} else if (id.includes('flash')) {
320+
budgetMax = 24576;
321+
} else if (id.includes('gemini-2.5-pro')) {
322+
budgetMax = 32768;
323+
}
324+
if (thinkingBudgetSlider) thinkingBudgetSlider.max = String(budgetMax);
325+
if (thinkingBudgetValue) thinkingBudgetValue.max = String(budgetMax);
326+
327+
const isGemini3Pro = id.includes('gemini-3') && id.includes('pro');
328+
const isGemini25Pro = id.includes('gemini-2.5-pro');
329+
const isFlashLite = id.includes('flash-lite');
330+
const isFlash = id.includes('flash');
331+
332+
if (thinkingModeGroup) thinkingModeGroup.style.display = (isGemini3Pro || isGemini25Pro) ? 'none' : '';
333+
if (thinkingLevelGroup) thinkingLevelGroup.style.display = isGemini3Pro ? '' : 'none';
334+
if (manualBudgetGroup) manualBudgetGroup.style.display = (isGemini3Pro) ? 'none' : '';
335+
if (thinkingBudgetGroup) thinkingBudgetGroup.style.display = (isGemini3Pro) ? 'none' : '';
336+
337+
if (thinkingBudgetControlsContainer) {
338+
const shouldShowControls = !!(enableManualBudgetToggle && enableManualBudgetToggle.checked);
339+
thinkingBudgetControlsContainer.style.display = shouldShowControls ? 'flex' : 'none';
340+
}
341+
} catch (e) { /* ignore */ }
285342
}
286343

287344
// --- Theme Switching ---
@@ -934,8 +991,10 @@ function updateModelSettingsUI() {
934991
stopSequencesInput.value = modelSettings.stopSequences;
935992
if (enableThinkingToggle) enableThinkingToggle.checked = !!modelSettings.enableThinking;
936993
if (thinkingLevelSelector) thinkingLevelSelector.value = modelSettings.thinkingLevel || "";
994+
if (enableManualBudgetToggle) enableManualBudgetToggle.checked = !!modelSettings.enableManualBudget;
937995
if (thinkingBudgetSlider) thinkingBudgetSlider.value = modelSettings.thinkingBudget;
938996
if (thinkingBudgetValue) thinkingBudgetValue.value = modelSettings.thinkingBudget;
997+
if (thinkingBudgetControlsContainer) thinkingBudgetControlsContainer.style.display = modelSettings.enableManualBudget ? 'flex' : 'none';
939998
if (enableGoogleSearchToggle) enableGoogleSearchToggle.checked = !!modelSettings.enableGoogleSearch;
940999

9411000
}
@@ -948,6 +1007,7 @@ function saveModelSettings() {
9481007
modelSettings.stopSequences = stopSequencesInput.value.trim();
9491008
if (enableThinkingToggle) modelSettings.enableThinking = !!enableThinkingToggle.checked;
9501009
if (thinkingLevelSelector) modelSettings.thinkingLevel = (thinkingLevelSelector.value || "").toLowerCase();
1010+
if (enableManualBudgetToggle) modelSettings.enableManualBudget = !!enableManualBudgetToggle.checked;
9511011
if (thinkingBudgetValue) {
9521012
const budgetVal = parseInt(thinkingBudgetValue.value);
9531013
modelSettings.thinkingBudget = isNaN(budgetVal) ? 8192 : budgetVal;
@@ -1102,6 +1162,11 @@ function bindEventListeners() {
11021162
}
11031163
if (enableThinkingToggle) enableThinkingToggle.addEventListener('change', () => showSettingsStatus("思考模式设置已更新", false));
11041164
if (thinkingLevelSelector) thinkingLevelSelector.addEventListener('change', () => showSettingsStatus("思考等级已更新", false));
1165+
if (enableManualBudgetToggle) enableManualBudgetToggle.addEventListener('change', () => {
1166+
const checked = !!enableManualBudgetToggle.checked;
1167+
if (thinkingBudgetControlsContainer) thinkingBudgetControlsContainer.style.display = checked ? 'flex' : 'none';
1168+
showSettingsStatus("思考预算限制已更新", false);
1169+
});
11051170

11061171
saveModelSettingsButton.addEventListener('click', saveModelSettings);
11071172
resetModelSettingsButton.addEventListener('click', resetModelSettings);
@@ -1111,7 +1176,7 @@ function bindEventListeners() {
11111176

11121177

11131178
const debouncedSave = debounce(saveModelSettings, 1000);
1114-
[systemPromptInput, temperatureValue, maxOutputTokensValue, topPValue, stopSequencesInput, thinkingBudgetValue, thinkingLevelSelector, enableThinkingToggle, enableGoogleSearchToggle].forEach(
1179+
[systemPromptInput, temperatureValue, maxOutputTokensValue, topPValue, stopSequencesInput, thinkingBudgetValue, thinkingLevelSelector, enableThinkingToggle, enableManualBudgetToggle, enableGoogleSearchToggle].forEach(
11151180
element => element && element.addEventListener('input', debouncedSave)
11161181
);
11171182
}

0 commit comments

Comments
 (0)