- {SETTING_SECTIONS.map((section, idx) => (
+ {SETTING_SECTIONS_GENERATED.map((section, idx) => (
- {SETTING_SECTIONS[sectionIdx].fields.map((field, idx) => {
+ {SETTING_SECTIONS_GENERATED[sectionIdx].fields.map((field, idx) => {
const key = `${sectionIdx}-${idx}`;
if (field.type === SettingInputType.SHORT_INPUT) {
return (
diff --git a/tools/server/webui/src/utils/storage.ts b/tools/server/webui/src/utils/storage.ts
index 505693e9272ac..7c90e66743972 100644
--- a/tools/server/webui/src/utils/storage.ts
+++ b/tools/server/webui/src/utils/storage.ts
@@ -2,7 +2,7 @@
// format: { [convId]: { id: string, lastModified: number, messages: [...] } }
import { CONFIG_DEFAULT } from '../Config';
-import { Conversation, Message, TimingReport } from './types';
+import { Conversation, Message, TimingReport, SettingsPreset } from './types';
import Dexie, { Table } from 'dexie';
const event = new EventTarget();
@@ -213,6 +213,44 @@ const StorageUtils = {
localStorage.setItem('theme', theme);
}
},
+
+ // manage presets
+ getPresets(): SettingsPreset[] {
+ const presetsJson = localStorage.getItem('presets');
+ if (!presetsJson) return [];
+ try {
+ return JSON.parse(presetsJson);
+ } catch (e) {
+ console.error('Failed to parse presets', e);
+ return [];
+ }
+ },
+ savePreset(name: string, config: typeof CONFIG_DEFAULT): SettingsPreset {
+ const presets = StorageUtils.getPresets();
+ const now = Date.now();
+ const preset: SettingsPreset = {
+ id: `preset-${now}`,
+ name,
+ createdAt: now,
+ config: { ...config }, // copy the config
+ };
+ presets.push(preset);
+ localStorage.setItem('presets', JSON.stringify(presets));
+ return preset;
+ },
+ updatePreset(id: string, config: typeof CONFIG_DEFAULT): void {
+ const presets = StorageUtils.getPresets();
+ const index = presets.findIndex((p) => p.id === id);
+ if (index !== -1) {
+ presets[index].config = { ...config };
+ localStorage.setItem('presets', JSON.stringify(presets));
+ }
+ },
+ deletePreset(id: string): void {
+ const presets = StorageUtils.getPresets();
+ const filtered = presets.filter((p) => p.id !== id);
+ localStorage.setItem('presets', JSON.stringify(filtered));
+ },
};
export default StorageUtils;
diff --git a/tools/server/webui/src/utils/types.ts b/tools/server/webui/src/utils/types.ts
index ea7d641dc748b..83c9649119634 100644
--- a/tools/server/webui/src/utils/types.ts
+++ b/tools/server/webui/src/utils/types.ts
@@ -136,3 +136,10 @@ export interface LlamaCppServerProps {
};
// TODO: support params
}
+
+export interface SettingsPreset {
+ id: string; // format: `preset-{timestamp}`
+ name: string;
+ createdAt: number; // timestamp from Date.now()
+ config: Record; // partial CONFIG_DEFAULT
+}