@page "/settings" @attribute [Authorize] @inject ISettingsService SettingsService @inject IThemeService ThemeService @inject IOllamaService OllamaService @inject NavigationManager Navigation @inject IJSRuntime JSRuntime @inject IProjectService ProjectService @inject ILocalizationService Loc @Loc["page.title.settings"] - Author Buddy

@Loc["settings.section.user"]

@if (currentProjectName != null) { @Loc["settings.context.project"]: @currentProjectName } else { @Loc["settings.context.user"] }

@Loc["settings.section.models"]

@Loc["settings.section.ollama_server"]

@Loc["settings.ollama.hint.url"]

@Loc["settings.section.appearance"]

@Loc["settings.section.language"]

@Loc["settings.section.editor_prompt"]

@Loc["settings.section.factcheck_template"]

@Loc["settings.section.spellcheck_prompt"]

@Loc["settings.section.advocatus_diaboli"]

@Loc["settings.section.hook_finder"]

@Loc["settings.section.eli5"]

@if (!string.IsNullOrEmpty(statusMessage)) { @statusMessage }
@code { private string ragModel = "llama3.2"; private string styleModel = "llama3.2"; private string spellingModel = "phi3:mini"; private string selectedTheme = "light"; private string ollamaUrl = "http://localhost:11434"; private string lektorPrompt = string.Empty; private string factCheckTemplate = string.Empty; private string spellingPrompt = string.Empty; private string advocatusDiaboliPrompt = string.Empty; private string hookFinderPrompt = string.Empty; private string eli5Prompt = string.Empty; private string selectedLanguage = "de"; private string newProjectName = string.Empty; private string newUserName = string.Empty; private string statusMessage = string.Empty; private List availableModels = new(); private List users = new(); private int selectedUserId; private string? currentProjectName; protected override async Task OnInitializedAsync() { users = await SettingsService.GetUsersAsync(); var current = await SettingsService.GetCurrentUserAsync(); selectedUserId = current.Id; var pid = SettingsService.CurrentProjectId; if (pid != null) { var project = await ProjectService.GetProjectAsync(pid.Value); currentProjectName = project?.Name; } await LoadUserSettings(); try { var models = await OllamaService.GetLocalModelsAsync(); availableModels = models.ToList(); } catch { availableModels = new(); } } private async Task LoadUserSettings() { ragModel = await SettingsService.GetRagModelAsync() ?? "llama3.2"; styleModel = await SettingsService.GetStyleModelAsync() ?? "llama3.2"; spellingModel = await SettingsService.GetSpellingModelAsync() ?? "phi3:mini"; selectedTheme = await SettingsService.GetThemeAsync() ?? "light"; ollamaUrl = await SettingsService.GetOllamaUrlAsync() ?? "http://localhost:11434"; lektorPrompt = await SettingsService.GetLektorSystemPromptAsync() ?? string.Empty; factCheckTemplate = await SettingsService.GetFactCheckTemplateAsync() ?? string.Empty; spellingPrompt = await SettingsService.GetSpellingPromptAsync() ?? string.Empty; advocatusDiaboliPrompt = await SettingsService.GetAdvocatusDiaboliPromptAsync() ?? string.Empty; hookFinderPrompt = await SettingsService.GetHookFinderPromptAsync() ?? string.Empty; eli5Prompt = await SettingsService.GetEli5PromptAsync() ?? string.Empty; selectedLanguage = await SettingsService.GetLanguageAsync() ?? "de"; } private async Task SwitchUser(ChangeEventArgs e) { var userId = int.Parse(e.Value?.ToString() ?? "0"); selectedUserId = userId; SettingsService.SetCurrentUser(userId); await SettingsService.InitializeAsync(); await LoadUserSettings(); } private async Task AddUser() { if (string.IsNullOrWhiteSpace(newUserName)) return; var user = await SettingsService.CreateUserAsync(newUserName); users.Add(user); newUserName = string.Empty; statusMessage = string.Format(Loc["settings.status.user_created"], user.Name); } private async Task SaveSettings() { await SettingsService.SaveOllamaUrlAsync(ollamaUrl); OllamaService.Reconfigure(ollamaUrl); if (!string.IsNullOrWhiteSpace(ragModel)) { var ok = await OllamaService.TestEmbeddingAsync(ragModel); if (!ok) { statusMessage = selectedLanguage == "en" ? $"Model '{ragModel}' does not support embeddings. RAG model not saved." : $"Modell '{ragModel}' unterstützt keine Embeddings. RAG-Modell nicht gespeichert."; return; } } await SettingsService.SaveRagModelAsync(ragModel); await SettingsService.SaveStyleModelAsync(styleModel); await SettingsService.SaveSpellingModelAsync(spellingModel); await SettingsService.SaveThemeAsync(selectedTheme); await SettingsService.SaveLektorSystemPromptAsync(lektorPrompt); await SettingsService.SaveFactCheckTemplateAsync(factCheckTemplate); await SettingsService.SaveSpellingPromptAsync(spellingPrompt); await SettingsService.SaveAdvocatusDiaboliPromptAsync(advocatusDiaboliPrompt); await SettingsService.SaveHookFinderPromptAsync(hookFinderPrompt); await SettingsService.SaveEli5PromptAsync(eli5Prompt); await SettingsService.SaveLanguageAsync(selectedLanguage); if (selectedLanguage != Loc.CurrentLanguage) await Loc.SetLanguageAsync(selectedLanguage); statusMessage = Loc["settings.status.saved"]; await ThemeService.ApplyTheme(selectedTheme); } }