char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
5b6ddc967
char/aliceai-t5-moe
1/** 2* ParameterSyncService - Syncs sampling parameters with the server 3* 4* Decides for each sampling parameter whether the user's setting is an 5* override of the server default, and normalizes floating-point values. 6* No reactive state; consumed by settingsStore. 7*/ 8 9import { SETTINGS_KEYS , SETTINGS_REGISTRY } from '$lib/constants' ; 10import { ParameterSource , SyncableParameterType } from '$lib/enums' ; 11import type { ParameterInfo , ParameterRecord , ParameterValue , SyncableParameter } from '$lib/types' ; 12import { normalizeFloatingPoint } from '$lib/utils' ; 13 14/** Mapping of UI setting keys to server parameter keys, derived from the registry. */ 15export const SYNCABLE_PARAMETERS :SyncableParameter [] = SETTINGS_REGISTRY . flatMap ( 16( section ) => section . settings 17) 18. filter (( s ) => s . sync !== undefined ) 19. map (( s ) => ({ 20canSync :true , 21key :s . key , 22serverKey :s . sync ! . serverKey , 23type :s . sync ! . paramType 24})); 25 26export class ParameterSyncService { 27/** 28* Check if a parameter can be synced from server. 29* 30* @param key - The parameter key to check 31* @returns True if the parameter is in the syncable parameters list 32*/ 33static canSyncParameter ( key :string ) :boolean { 34return SYNCABLE_PARAMETERS . some (( param ) => param . key === key && param . canSync ); 35} 36 37/** 38* Create a diff between current settings and server defaults. 39* Shows which parameters differ from server values, useful for debugging 40* and for the "Reset to defaults" functionality. 41* 42* @param currentSettings - Current parameter values in the settings store 43* @param serverDefaults - Default values extracted from server props 44* @returns Record of parameter diffs with current value, server value, and whether they differ 45*/ 46static createParameterDiff ( 47currentSettings :ParameterRecord , 48serverDefaults :ParameterRecord 49) :Record < string , { current :ParameterValue ; server :ParameterValue ; differs :boolean }> { 50const diff :Record < 51string , 52{ current :ParameterValue ; server :ParameterValue ; differs :boolean } 53> = {}; 54 55for ( const key of this . getSyncableParameterKeys ()) { 56const currentValue = currentSettings [ key ]; 57const serverValue = serverDefaults [ key ]; 58 59if ( serverValue !== undefined ) { 60diff [ key ] = { 61current :currentValue , 62differs :currentValue !== serverValue , 63server :serverValue 64}; 65} 66} 67 68return diff ; 69} 70 71/** 72* Extract server default parameters that can be synced from `/props` response. 73* Handles both generation settings parameters and UI-specific settings. 74* Converts samplers array to semicolon-delimited string for UI display. 75* 76* @param serverParams - Raw generation settings from server `/props` endpoint 77* @returns Record of extracted parameter key-value pairs with normalized precision 78*/ 79static extractServerDefaults ( 80serverParams :ApiLlamaCppServerProps [ 'default_generation_settings' ][ 'params' ] | null 81) :ParameterRecord { 82const extracted :ParameterRecord = {}; 83 84if ( serverParams ) { 85for ( const param of SYNCABLE_PARAMETERS ) { 86if ( param . canSync && param . serverKey in serverParams ) { 87const value = ( serverParams as unknown as Record < string , ParameterValue >)[ 88param . serverKey 89]; 90 91if ( value !== undefined ) { 92// Apply precision rounding to avoid JavaScript floating-point issues 93extracted [ param . key ] = this . roundFloatingPoint ( value ); 94} 95} 96} 97 98// Handle samplers array conversion to string 99if ( serverParams . samplers && Array . isArray ( serverParams . samplers )) { 100extracted [ SETTINGS_KEYS . SAMPLERS ] = serverParams . samplers . join ( ';' ); 101} 102} 103 104return extracted ; 105} 106 107/** 108* Get parameter information including source and values. 109* Used by SettingsChatParameterSourceIndicator to display the correct badge 110* (Custom vs Default) for each parameter in the settings UI. 111* 112* @param key - The parameter key to get info for 113* @param currentValue - The current value of the parameter 114* @param propsDefaults - Server default values from `/props` 115* @param userOverrides - Set of parameter keys explicitly overridden by the user 116* @returns Parameter info with source, server default, and user override values 117*/ 118static getParameterInfo ( 119key :string , 120currentValue :ParameterValue , 121propsDefaults :ParameterRecord , 122userOverrides :Set < string > 123) :ParameterInfo { 124const hasPropsDefault = propsDefaults [ key ] !== undefined ; 125const isUserOverride = userOverrides . has ( key ); 126// Simple logic: either using default (from props) or custom (user override) 127const source = isUserOverride ?ParameterSource . CUSTOM :ParameterSource . DEFAULT ; 128 129return { 130serverDefault :hasPropsDefault ?propsDefaults [ key ] :undefined , // Keep same field name for compatibility 131 source, 132userOverride :isUserOverride ?currentValue :undefined , 133value :currentValue 134}; 135} 136 137/** 138* Get all syncable parameter keys. 139* 140* @returns Array of parameter keys that can be synced from server 141*/ 142static getSyncableParameterKeys () :string [] { 143return SYNCABLE_PARAMETERS . filter (( param ) => param . canSync ). map (( param ) => param . key ); 144} 145 146/** 147* Merge server defaults with current user settings. 148* User overrides always take priority — only parameters not in `userOverrides` 149* set will be updated from server defaults. 150* 151* @param currentSettings - Current parameter values in the settings store 152* @param serverDefaults - Default values extracted from server props 153* @param userOverrides - Set of parameter keys explicitly overridden by the user 154* @returns Merged parameter record with user overrides preserved 155*/ 156static mergeWithServerDefaults ( 157currentSettings :ParameterRecord , 158serverDefaults :ParameterRecord , 159userOverrides :Set < string > = new Set () 160) :ParameterRecord { 161const merged = { ...currentSettings }; 162 163for ( const [ key , serverValue ] of Object . entries ( serverDefaults )) { 164// Only update if user hasn't explicitly overridden this parameter 165if ( ! userOverrides . has ( key )) { 166merged [ key ] = this . roundFloatingPoint ( serverValue ); 167} 168} 169 170return merged ; 171} 172 173/** 174* Validate a server parameter value against its expected type. 175* 176* @param key - The parameter key to validate 177* @param value - The value to validate 178* @returns True if value matches the expected type for this parameter 179*/ 180static validateServerParameter ( key :string , value :ParameterValue ) :boolean { 181const param = SYNCABLE_PARAMETERS . find (( p ) => p . key === key ); 182 183if ( ! param ) return false ; 184 185switch ( param . type ) { 186case SyncableParameterType . NUMBER : 187return typeof value === 'number' && ! isNaN ( value ); 188case SyncableParameterType . STRING : 189return typeof value === 'string' ; 190case SyncableParameterType . BOOLEAN : 191return typeof value === 'boolean' ; 192default : 193return false ; 194} 195} 196 197/** 198* Round floating-point numbers to avoid JavaScript precision issues. 199* E.g., 0.1 + 0.2 = 0.30000000000000004 → 0.3 200* 201* @param value - Parameter value to normalize 202* @returns Precision-normalized value 203*/ 204private static roundFloatingPoint ( value :ParameterValue ) :ParameterValue { 205return normalizeFloatingPoint ( value ) as ParameterValue ; 206} 207}