@@ -17,6 +17,13 @@ const elements = {
1717 gpuSlider : document . getElementById ( 'gpu-slider' ) ,
1818 parallelRequests : document . getElementById ( 'parallel-requests' ) ,
1919 parallelSlider : document . getElementById ( 'parallel-slider' ) ,
20+ contextSize : document . getElementById ( 'context-size' ) ,
21+ contextSlider : document . getElementById ( 'context-slider' ) ,
22+ flashAttention : document . getElementById ( 'flash-attention' ) ,
23+ cacheTypeK : document . getElementById ( 'cache-type-k' ) ,
24+ cacheTypeV : document . getElementById ( 'cache-type-v' ) ,
25+ advancedSettingsToggle : document . getElementById ( 'advanced-settings-toggle' ) ,
26+ advancedSettingsContent : document . getElementById ( 'advanced-settings-content' ) ,
2027 mainActionBtn : document . getElementById ( 'main-action-btn' ) ,
2128 themeToggle : document . getElementById ( 'theme-toggle' ) ,
2229 modelsPathBtn : document . getElementById ( 'models-path-btn' ) ,
@@ -439,6 +446,10 @@ async function startApiServer() {
439446 const modelName = elements . modelSelect . value ;
440447 const ngl = parseInt ( elements . gpuLayers . value ) || 0 ;
441448 const np = parseInt ( elements . parallelRequests . value ) || 1 ;
449+ const ctxSize = parseInt ( elements . contextSize . value ) || 2048 ;
450+ const flashAttention = elements . flashAttention . checked ;
451+ const cacheTypeK = elements . cacheTypeK . value ;
452+ const cacheTypeV = elements . cacheTypeV . value ;
442453 const apiKey = elements . apiKeyInput . value ;
443454
444455 if ( ! modelName ) {
@@ -462,14 +473,22 @@ async function startApiServer() {
462473 apiKey,
463474 rpcNodes : rpcNodes , // 使用過濾後的RPC節點
464475 ngl,
465- np
476+ np,
477+ ctxSize,
478+ flashAttention,
479+ cacheTypeK,
480+ cacheTypeV
466481 } ) ;
467482
468483 if ( result . success ) {
469484 logMessage ( '系統' , result . message , 'success' ) ;
470485 logMessage ( '系統' , `使用模型: ${ modelName } ` , 'info' ) ;
471486 logMessage ( '系統' , `GPU 層數: ${ ngl } ` , 'info' ) ;
472487 logMessage ( '系統' , `並行請求數: ${ np } ` , 'info' ) ;
488+ logMessage ( '系統' , `Context Size: ${ ctxSize } ` , 'info' ) ;
489+ logMessage ( '系統' , `Flash Attention: ${ flashAttention ? '啟用' : '停用' } ` , 'info' ) ;
490+ logMessage ( '系統' , `KV Cache Type K: ${ cacheTypeK } ` , 'info' ) ;
491+ logMessage ( '系統' , `KV Cache Type V: ${ cacheTypeV } ` , 'info' ) ;
473492 logMessage ( '系統' , `RPC節點: ${ rpcNodes . join ( ', ' ) || '無' } ` , 'info' ) ;
474493 logMessage ( '系統' , `本機作為API伺服器參與計算` , 'info' ) ;
475494 } else {
@@ -505,9 +524,9 @@ function syncGpuControls() {
505524 } ) ;
506525
507526 elements . gpuLayers . addEventListener ( 'input' , ( e ) => {
508- const value = Math . max ( 0 , Math . min ( 100 , parseInt ( e . target . value ) || 0 ) ) ;
527+ const value = Math . max ( 0 , parseInt ( e . target . value ) || 0 ) ;
509528 elements . gpuLayers . value = value ;
510- elements . gpuSlider . value = value ;
529+ elements . gpuSlider . value = Math . min ( value , 200 ) ; // 滑動條最大值限制為200,但輸入框無限制
511530 } ) ;
512531
513532 // 並行請求數控制
@@ -516,9 +535,39 @@ function syncGpuControls() {
516535 } ) ;
517536
518537 elements . parallelRequests . addEventListener ( 'input' , ( e ) => {
519- const value = Math . max ( 1 , Math . min ( 16 , parseInt ( e . target . value ) || 1 ) ) ;
538+ const value = Math . max ( 1 , parseInt ( e . target . value ) || 1 ) ;
520539 elements . parallelRequests . value = value ;
521- elements . parallelSlider . value = value ;
540+ elements . parallelSlider . value = Math . min ( value , 100 ) ; // 滑動條最大值限制為100,但輸入框無限制
541+ } ) ;
542+
543+ // Context Size 控制
544+ elements . contextSlider . addEventListener ( 'input' , ( e ) => {
545+ elements . contextSize . value = e . target . value ;
546+ } ) ;
547+
548+ elements . contextSize . addEventListener ( 'input' , ( e ) => {
549+ const value = Math . max ( 512 , parseInt ( e . target . value ) || 2048 ) ;
550+ // 確保值是512的倍數
551+ const roundedValue = Math . round ( value / 512 ) * 512 ;
552+ elements . contextSize . value = roundedValue ;
553+ elements . contextSlider . value = Math . min ( roundedValue , 131072 ) ; // 滑動條最大值限制為128K,但輸入框無限制
554+ } ) ;
555+ }
556+
557+ // 設定進階設定摺疊功能
558+ function setupAdvancedSettings ( ) {
559+ elements . advancedSettingsToggle . addEventListener ( 'click' , ( ) => {
560+ const header = elements . advancedSettingsToggle ;
561+ const content = elements . advancedSettingsContent ;
562+
563+ header . classList . toggle ( 'expanded' ) ;
564+ content . classList . toggle ( 'expanded' ) ;
565+
566+ if ( content . classList . contains ( 'expanded' ) ) {
567+ logMessage ( '系統' , '已展開進階設定' , 'info' ) ;
568+ } else {
569+ logMessage ( '系統' , '已收合進階設定' , 'info' ) ;
570+ }
522571 } ) ;
523572}
524573
@@ -763,6 +812,9 @@ function setupEventListeners() {
763812 // GPU 控制同步
764813 syncGpuControls ( ) ;
765814
815+ // 進階設定摺疊功能
816+ setupAdvancedSettings ( ) ;
817+
766818 // API Key 模態框事件
767819 elements . saveApiKeyBtn . addEventListener ( 'click' , saveApiKey ) ;
768820 elements . cancelApiKeyBtn . addEventListener ( 'click' , ( ) => {
0 commit comments