From 20f9c0bcc466389443df661c1f3af5dc87fd035d Mon Sep 17 00:00:00 2001 From: Chili Palmer Date: Tue, 17 Mar 2026 20:20:54 +0100 Subject: [PATCH] feat: settings for default model --- MLXServer/MLXServerApp.swift | 4 ++-- MLXServer/Utilities/Preferences.swift | 9 +++++++++ MLXServer/Views/SettingsView.swift | 18 +++++++++++++++++- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/MLXServer/MLXServerApp.swift b/MLXServer/MLXServerApp.swift index 993430c..dd0bad3 100644 --- a/MLXServer/MLXServerApp.swift +++ b/MLXServer/MLXServerApp.swift @@ -14,8 +14,8 @@ struct MLXServerApp: App { ContentView() .environment(modelManager) .task { - // Auto-load last used model (or default) - let modelId = Preferences.lastModelId ?? ModelConfig.default.id + // Auto-load: configured default → last used → built-in default + let modelId = Preferences.defaultModelId ?? Preferences.lastModelId ?? ModelConfig.default.id if let config = ModelConfig.availableModels.first(where: { $0.id == modelId }) { await modelManager.loadModel(config) } diff --git a/MLXServer/Utilities/Preferences.swift b/MLXServer/Utilities/Preferences.swift index 34cf519..2b4962e 100644 --- a/MLXServer/Utilities/Preferences.swift +++ b/MLXServer/Utilities/Preferences.swift @@ -13,6 +13,15 @@ enum Preferences { set { defaults.set(newValue, forKey: lastModelKey) } } + // MARK: - Default startup model + + private static let defaultModelKey = "defaultModelId" + + static var defaultModelId: String? { + get { defaults.string(forKey: defaultModelKey) } + set { defaults.set(newValue, forKey: defaultModelKey) } + } + // MARK: - System prompt private static let systemPromptKey = "systemPrompt" diff --git a/MLXServer/Views/SettingsView.swift b/MLXServer/Views/SettingsView.swift index 05b4b39..d5e5344 100644 --- a/MLXServer/Views/SettingsView.swift +++ b/MLXServer/Views/SettingsView.swift @@ -5,9 +5,25 @@ struct SettingsView: View { @State private var apiPort: String = String(Preferences.apiPort) @State private var apiAutoStart: Bool = Preferences.apiAutoStart @State private var idleUnloadMinutes: String = String(Preferences.idleUnloadMinutes) + @State private var defaultModelId: String = Preferences.defaultModelId ?? ModelConfig.default.id var body: some View { Form { + Section("Startup") { + Picker("Default model", selection: $defaultModelId) { + ForEach(ModelConfig.availableModels) { model in + Text(model.displayName).tag(model.id) + } + } + .onChange(of: defaultModelId) { + Preferences.defaultModelId = defaultModelId + } + + Text("The model to load automatically when the app starts.") + .font(.caption) + .foregroundStyle(.secondary) + } + Section("System Prompt") { TextEditor(text: $systemPrompt) .font(.body.monospaced()) @@ -59,6 +75,6 @@ struct SettingsView: View { } } .formStyle(.grouped) - .frame(width: 450, height: 380) + .frame(width: 450, height: 460) } }