@page "/ai" @using Newtonsoft.Json @using TechHelper.Client @using TechHelper.Client.AI @using TechHelper.Client.Exam @inject IAIService AiService @inject ISnackbar Snackbar AI 对话 清空对话 对话历史 / 设置 新对话 @* 假设这里可以显示对话历史,点击切换 @foreach (var history in ChatHistorySummaries) { @history.Title } *@ @foreach (var model in Enum.GetValues()) { @model.ToString() } @Temperature.ToString("F2") @foreach (var message in ChatMessages) { @message.Content } @if (IsLoading) { AI: 思考中... }
@* 滚动锚点 *@
@code { private bool _drawerOpen = false; private bool IsSettingsOpen = false; private bool IsExamCheckOpen = false; private List ChatMessages = new List(); private string UserInput { get; set; } = ""; private bool IsLoading { get; set; } = false; private ElementReference messagesEndRef; // 用于自动滚动到底部的引用 // AI 模型设置 private string SelectedModel { get; set; } = AIModelsEnum.GLMZ1Flash.GetDescription(); private decimal Temperature { get; set; } = 0.75m; // MudSlider 使用 decimal private int MaxTokens { get; set; } = 1000; // 试题检查相关 private string ExamJsonInput { get; set; } = ""; private string ExamCheckResult { get; set; } = ""; protected override void OnInitialized() { ChatMessages.Add(new SystemMessage("你是一个乐于助人的AI助手。")); Snackbar.Add("欢迎使用AI对话!", Severity.Info); } private void ToggleDrawer() { _drawerOpen = !_drawerOpen; } private void ClearChat() { ChatMessages.Clear(); ChatMessages.Add(new SystemMessage("你是一个乐于助人的AI助手。")); Snackbar.Add("对话已清空。", Severity.Success); } private async Task HandleKeyDown(KeyboardEventArgs e) { if (e.Key == "Enter" && !e.ShiftKey) { await SendMessage(); } } private async Task SendMessage() { if (string.IsNullOrWhiteSpace(UserInput)) return; IsLoading = true; ChatMessages.Add(new UserMessage(UserInput)); var currentInput = UserInput; // 保存当前输入,因为会清空 try { // 构建请求消息列表,不包括SystemMessage(通常System Message只在API调用时作为参数传递,不显示在聊天记录中) var requestMessages = new List(); requestMessages.Add(new SystemMessage("你是一个乐于助人的AI助手,请简洁明了地回答问题。")); // 每次请求都包含系统提示 requestMessages.AddRange(ChatMessages.Where(m => m.Role != "system")); // 添加除系统消息外的所有历史对话 var request = new ChatCompletionRequest { Model = SelectedModel, Messages = requestMessages, Temperature = (float)Temperature, // MudSlider返回decimal,需要转换为float MaxTokens = MaxTokens }; var response = await AiService.CallGLM(UserInput, AIConfiguration.ExamAnsConfig); if (!string.IsNullOrEmpty(response)) { // var exam = ExamParser.ParseExamJson(response); ChatMessages.Add(new AssistantMessage(response)); } } catch (HttpRequestException httpEx) { ChatMessages.Add(new AssistantMessage($"API 请求失败: {httpEx.Message}. 请检查API Key和网络连接。")); Snackbar.Add($"API 请求失败: {httpEx.Message}", Severity.Error); Console.WriteLine($"HTTP Request Error: {httpEx.Message}"); } catch (Exception ex) { ChatMessages.Add(new AssistantMessage($"发生错误: {ex.Message}")); Snackbar.Add($"发生错误: {ex.Message}", Severity.Error); Console.WriteLine($"Error: {ex.Message}"); } finally { IsLoading = false; UserInput = ""; // 清空输入框 StateHasChanged(); } } }