@page "/assistant" @attribute [Authorize] @inject IOllamaService OllamaService @inject ISettingsService SettingsService @inject NavigationManager Navigation @inject ILocalizationService Loc @rendermode InteractiveServer @Loc["page.title.assistant"]
@if (!string.IsNullOrEmpty(outputText)) { } @statusText @if (isRunning) { }

@Loc["assistant.label.input_text"]

@Loc["assistant.label.result"]

@if (!string.IsNullOrEmpty(outputText)) {
@outputText
} else if (!string.IsNullOrEmpty(errorMessage)) {
@errorMessage
} else { @Loc["assistant.hint.empty_result"] }
@code { private string selectedMode = "lektorat"; private string inputText = string.Empty; private string outputText = string.Empty; private string errorMessage = string.Empty; private string statusText = string.Empty; private bool isRunning; private double progress; protected override async Task OnInitializedAsync() { statusText = Loc["common.status.ready"]; var pending = SettingsService.PendingAssistantInput; if (!string.IsNullOrEmpty(pending)) { inputText = pending; SettingsService.PendingAssistantInput = null; } } private async Task RunAssistant() { if (string.IsNullOrWhiteSpace(inputText)) return; isRunning = true; progress = 50; outputText = string.Empty; errorMessage = string.Empty; statusText = Loc["assistant.status.processing"]; try { var systemPrompt = selectedMode switch { "lektorat" => await SettingsService.GetLektorSystemPromptAsync() ?? string.Empty, "advocatus" => await SettingsService.GetAdvocatusDiaboliPromptAsync() ?? string.Empty, "hookfinder" => await SettingsService.GetHookFinderPromptAsync() ?? string.Empty, "eli5" => await SettingsService.GetEli5PromptAsync() ?? string.Empty, _ => string.Empty }; if (string.IsNullOrEmpty(systemPrompt)) { errorMessage = Loc["assistant.error.no_prompt"]; return; } var model = await SettingsService.GetStyleModelAsync() ?? "llama3.2"; outputText = await OllamaService.Chat(model, inputText, systemPrompt); statusText = Loc["assistant.status.done"]; } catch (Exception ex) { errorMessage = $"{Loc["common.error"]} {ex.Message}"; statusText = Loc["common.status.error"]; } finally { isRunning = false; progress = 0; } } private void SendToEditor() { SettingsService.PendingAssistantOutput = outputText; Navigation.NavigateTo("/editor"); } }