@page "/chat" @attribute [Authorize(Roles = "Administrator,Chat")] @inject IChatService ChatService @inject IOllamaService OllamaService @inject OllamaSettings Settings @inject ISettingsService SettingsService @inject IAuthService AuthService @inject NavigationManager Navigation @rendermode InteractiveServer Chat

Chat

@if (_showSettings) {
präzise (0) kreativ (2)
}
@if (_messages.Count == 0) {
Noch keine Nachrichten. Stelle eine Frage.
} @foreach (var msg in _messages) {
U
@msg.UserMessage
A
@MarkdownToHtml(msg.AssistantResponse)
} @if (_isBusy) {
A
}
@if (!string.IsNullOrEmpty(_error)) {
@_error
}
@code { private List _messages = new(); private string _input = string.Empty; private string _error = string.Empty; private bool _isBusy; private int _userId; private bool _showSettings; private string _systemPrompt = string.Empty; private double _temperature = 0.7; protected override async Task OnInitializedAsync() { var user = await AuthService.GetCurrentUserAsync(); if (user == null || (!user.HasRole(UserRole.Administrator) && !user.HasRole(UserRole.Chat))) { Navigation.NavigateTo("/"); return; } _userId = user.Id; _messages = await ChatService.GetHistoryAsync(_userId); _systemPrompt = await SettingsService.GetChatPromptAsync() ?? Settings.GetChatDefaultPrompt(Settings.Language); _temperature = await SettingsService.GetChatTempAsync(); } private void ToggleSettings() { _showSettings = !_showSettings; } private async Task SaveSettings() { await SettingsService.SaveChatPromptAsync(_systemPrompt); await SettingsService.SaveChatTempAsync(_temperature); } private async Task ResetToDefault() { _systemPrompt = Settings.GetChatDefaultPrompt(Settings.Language); _temperature = Settings.ChatTemp; await SaveSettings(); } private async Task HandleKeyDown(KeyboardEventArgs e) { if (e.Key == "Enter" && !e.ShiftKey) { await Send(); } } private async Task Send() { if (string.IsNullOrWhiteSpace(_input) || _isBusy) return; var text = _input.Trim(); _input = string.Empty; _error = string.Empty; _isBusy = true; try { var response = await OllamaService.Chat(Settings.StyleModel, text, _systemPrompt, _temperature); var msg = new ChatEntity { UserId = _userId, UserMessage = text, AssistantResponse = response, Model = Settings.StyleModel, Timestamp = DateTime.UtcNow }; await ChatService.AddMessageAsync(msg); _messages.Add(msg); } catch (Exception ex) { _error = $"Fehler: {ex.Message}"; } finally { _isBusy = false; } } private async Task ClearHistory() { await ChatService.ClearHistoryAsync(_userId); _messages.Clear(); } private MarkupString MarkdownToHtml(string text) { if (string.IsNullOrEmpty(text)) return new MarkupString(string.Empty); var html = System.Web.HttpUtility.HtmlEncode(text); html = System.Text.RegularExpressions.Regex.Replace(html, @"\*\*(.+?)\*\*", "$1"); html = System.Text.RegularExpressions.Regex.Replace(html, @"\*(.+?)\*", "$1"); html = html.Replace("\n", "
"); return new MarkupString(html); } }