@@ -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
1416function 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
7482function 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