Skip to content

Commit 75f4419

Browse files
webui: sync settings from server /props
- Add webui_settings support in parameter sync service - Adds WebUI params to SYNCABLE_PARAMETERS User-specific settings (apiKey, theme, etc.) excluded
1 parent 9906d57 commit 75f4419

File tree

5 files changed

+96
-14
lines changed

5 files changed

+96
-14
lines changed

tools/server/webui/src/lib/services/parameter-sync.spec.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,5 +130,19 @@ describe('ParameterSyncService', () => {
130130
expect(result.max_tokens).toBe(-1);
131131
expect(result.temperature).toBe(0.7);
132132
});
133+
134+
it('should merge webui settings from props when provided', () => {
135+
const result = ParameterSyncService.extractServerDefaults(null, {
136+
pasteLongTextToFileLen: 0,
137+
pdfAsImage: true,
138+
renderUserContentAsMarkdown: false,
139+
theme: 'dark'
140+
});
141+
142+
expect(result.pasteLongTextToFileLen).toBe(0);
143+
expect(result.pdfAsImage).toBe(true);
144+
expect(result.renderUserContentAsMarkdown).toBe(false);
145+
expect(result.theme).toBeUndefined();
146+
});
133147
});
134148
});

tools/server/webui/src/lib/services/parameter-sync.ts

Lines changed: 75 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,55 @@ export const SYNCABLE_PARAMETERS: SyncableParameter[] = [
5555
{ key: 'dry_allowed_length', serverKey: 'dry_allowed_length', type: 'number', canSync: true },
5656
{ key: 'dry_penalty_last_n', serverKey: 'dry_penalty_last_n', type: 'number', canSync: true },
5757
{ key: 'max_tokens', serverKey: 'max_tokens', type: 'number', canSync: true },
58-
{ key: 'samplers', serverKey: 'samplers', type: 'string', canSync: true }
58+
{ key: 'samplers', serverKey: 'samplers', type: 'string', canSync: true },
59+
{
60+
key: 'pasteLongTextToFileLen',
61+
serverKey: 'pasteLongTextToFileLen',
62+
type: 'number',
63+
canSync: true
64+
},
65+
{ key: 'pdfAsImage', serverKey: 'pdfAsImage', type: 'boolean', canSync: true },
66+
{
67+
key: 'showThoughtInProgress',
68+
serverKey: 'showThoughtInProgress',
69+
type: 'boolean',
70+
canSync: true
71+
},
72+
{ key: 'showToolCalls', serverKey: 'showToolCalls', type: 'boolean', canSync: true },
73+
{
74+
key: 'disableReasoningFormat',
75+
serverKey: 'disableReasoningFormat',
76+
type: 'boolean',
77+
canSync: true
78+
},
79+
{ key: 'keepStatsVisible', serverKey: 'keepStatsVisible', type: 'boolean', canSync: true },
80+
{ key: 'showMessageStats', serverKey: 'showMessageStats', type: 'boolean', canSync: true },
81+
{
82+
key: 'askForTitleConfirmation',
83+
serverKey: 'askForTitleConfirmation',
84+
type: 'boolean',
85+
canSync: true
86+
},
87+
{ key: 'disableAutoScroll', serverKey: 'disableAutoScroll', type: 'boolean', canSync: true },
88+
{
89+
key: 'renderUserContentAsMarkdown',
90+
serverKey: 'renderUserContentAsMarkdown',
91+
type: 'boolean',
92+
canSync: true
93+
},
94+
{ key: 'autoMicOnEmpty', serverKey: 'autoMicOnEmpty', type: 'boolean', canSync: true },
95+
{
96+
key: 'pyInterpreterEnabled',
97+
serverKey: 'pyInterpreterEnabled',
98+
type: 'boolean',
99+
canSync: true
100+
},
101+
{
102+
key: 'enableContinueGeneration',
103+
serverKey: 'enableContinueGeneration',
104+
type: 'boolean',
105+
canSync: true
106+
}
59107
];
60108

61109
export class ParameterSyncService {
@@ -74,25 +122,39 @@ export class ParameterSyncService {
74122
* Extract server default parameters that can be synced
75123
*/
76124
static extractServerDefaults(
77-
serverParams: ApiLlamaCppServerProps['default_generation_settings']['params'] | null
125+
serverParams: ApiLlamaCppServerProps['default_generation_settings']['params'] | null,
126+
webuiSettings?: Record<string, string | number | boolean>
78127
): ParameterRecord {
79-
if (!serverParams) return {};
80-
81128
const extracted: ParameterRecord = {};
82129

83-
for (const param of SYNCABLE_PARAMETERS) {
84-
if (param.canSync && param.serverKey in serverParams) {
85-
const value = (serverParams as unknown as Record<string, ParameterValue>)[param.serverKey];
86-
if (value !== undefined) {
87-
// Apply precision rounding to avoid JavaScript floating-point issues
88-
extracted[param.key] = this.roundFloatingPoint(value);
130+
if (serverParams) {
131+
for (const param of SYNCABLE_PARAMETERS) {
132+
if (param.canSync && param.serverKey in serverParams) {
133+
const value = (serverParams as unknown as Record<string, ParameterValue>)[
134+
param.serverKey
135+
];
136+
if (value !== undefined) {
137+
// Apply precision rounding to avoid JavaScript floating-point issues
138+
extracted[param.key] = this.roundFloatingPoint(value);
139+
}
89140
}
90141
}
142+
143+
// Handle samplers array conversion to string
144+
if (serverParams.samplers && Array.isArray(serverParams.samplers)) {
145+
extracted.samplers = serverParams.samplers.join(';');
146+
}
91147
}
92148

93-
// Handle samplers array conversion to string
94-
if (serverParams.samplers && Array.isArray(serverParams.samplers)) {
95-
extracted.samplers = serverParams.samplers.join(';');
149+
if (webuiSettings) {
150+
for (const param of SYNCABLE_PARAMETERS) {
151+
if (param.canSync && param.serverKey in webuiSettings) {
152+
const value = webuiSettings[param.serverKey];
153+
if (value !== undefined) {
154+
extracted[param.key] = this.roundFloatingPoint(value);
155+
}
156+
}
157+
}
96158
}
97159

98160
return extracted;

tools/server/webui/src/lib/stores/server.svelte.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ class ServerStore {
4040
return this.props?.default_generation_settings?.n_ctx ?? null;
4141
}
4242

43+
get webuiSettings(): Record<string, string | number | boolean> | undefined {
44+
return this.props?.webui_settings;
45+
}
46+
4347
get isRouterMode(): boolean {
4448
return this.role === ServerRole.ROUTER;
4549
}

tools/server/webui/src/lib/stores/settings.svelte.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ class SettingsStore {
6666
*/
6767
private getServerDefaults(): Record<string, string | number | boolean> {
6868
const serverParams = serverStore.defaultParams;
69-
return serverParams ? ParameterSyncService.extractServerDefaults(serverParams) : {};
69+
const webuiSettings = serverStore.webuiSettings;
70+
return ParameterSyncService.extractServerDefaults(serverParams, webuiSettings);
7071
}
7172

7273
constructor() {

tools/server/webui/src/lib/types/api.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ export interface ApiLlamaCppServerProps {
176176
bos_token: string;
177177
eos_token: string;
178178
build_info: string;
179+
webui_settings?: Record<string, string | number | boolean>;
179180
}
180181

181182
export interface ApiChatCompletionRequest {

0 commit comments

Comments
 (0)