@page "/assistant"
@attribute [Authorize]
@inject IOllamaService OllamaService
@inject ISettingsService SettingsService
@inject NavigationManager Navigation
@inject ILocalizationService Loc
@rendermode InteractiveServer
@Loc["page.title.assistant"]
@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");
}
}