diff --git a/src/Desktop/RodelAgent.UI/ViewModels/Components/ChatSessionViewModel/ChatSessionViewModel.Messages.cs b/src/Desktop/RodelAgent.UI/ViewModels/Components/ChatSessionViewModel/ChatSessionViewModel.Messages.cs index 791b545e..34595d65 100644 --- a/src/Desktop/RodelAgent.UI/ViewModels/Components/ChatSessionViewModel/ChatSessionViewModel.Messages.cs +++ b/src/Desktop/RodelAgent.UI/ViewModels/Components/ChatSessionViewModel/ChatSessionViewModel.Messages.cs @@ -219,7 +219,7 @@ private async Task SendMessageInternalAsync(bool addUserMsg = true) private Task EditMessageAsync(ChatMessage msg) { - CalcTotalTokenCount(); + CalcTotalTokenCountCommand.Execute(default); return SaveSessionToDatabaseAsync(); } @@ -228,7 +228,6 @@ private async Task DeleteMessageAsync(ChatMessage msg) var source = Messages.FirstOrDefault(p => p.Data.Equals(msg)); Messages.Remove(source); Data.Messages.Remove(msg); - CalcTotalTokenCount(); await SaveSessionToDatabaseAsync(); } @@ -239,7 +238,8 @@ private void HandleSendMessageException(Exception ex) CancelMessage(); } - private void CalcBaseTokenCount() + [RelayCommand] + private async Task CalcBaseTokenCountAsync() { if (Data.Messages.Count == 0 && string.IsNullOrEmpty(Data.SystemInstruction)) { @@ -247,26 +247,46 @@ private void CalcBaseTokenCount() return; } - var encoder = ModelToEncoder.For("gpt-4o"); - var messages = string.Join("\n\n", Data.Messages.Select(p => p.GetFirstTextContent())); - SystemTokenCount = !string.IsNullOrEmpty(Data.SystemInstruction) ? encoder.CountTokens(Data.SystemInstruction) : 0; - _baseTokenCount = encoder.CountTokens(messages) + SystemTokenCount; + await Task.Run(() => + { + var encoder = ModelToEncoder.For("gpt-4o"); + var messages = string.Join("\n\n", Data.Messages.Select(p => p.GetFirstTextContent())); + _dispatcherQueue.TryEnqueue(() => + { + SystemTokenCount = !string.IsNullOrEmpty(Data.SystemInstruction) ? encoder.CountTokens(Data.SystemInstruction) : 0; + _baseTokenCount = encoder.CountTokens(messages) + SystemTokenCount; + }); + }); } - private void CalcUserInputTokenCount() + [RelayCommand] + private async Task CalcUserInputTokenCountAsync() { UserInputWordCount = UserInput?.Length ?? 0; - if (!string.IsNullOrEmpty(UserInput)) + await Task.Run(() => { - var encoder = ModelToEncoder.For("gpt-4o"); - UserInputTokenCount = encoder.CountTokens(UserInput); - } - else - { - UserInputTokenCount = 0; - } + if (!string.IsNullOrEmpty(UserInput)) + { + var encoder = ModelToEncoder.For("gpt-4o"); - TotalTokenUsage = _baseTokenCount + UserInputTokenCount; - RemainderTokenCount = TotalTokenCount == 0 ? -1 : TotalTokenCount - TotalTokenUsage; + _dispatcherQueue.TryEnqueue(() => + { + UserInputTokenCount = encoder.CountTokens(UserInput); + }); + } + else + { + _dispatcherQueue.TryEnqueue(() => + { + UserInputTokenCount = 0; + }); + } + + _dispatcherQueue.TryEnqueue(() => + { + TotalTokenUsage = _baseTokenCount + UserInputTokenCount; + RemainderTokenCount = TotalTokenCount == 0 ? -1 : TotalTokenCount - TotalTokenUsage; + }); + }); } } diff --git a/src/Desktop/RodelAgent.UI/ViewModels/Components/ChatSessionViewModel/ChatSessionViewModel.cs b/src/Desktop/RodelAgent.UI/ViewModels/Components/ChatSessionViewModel/ChatSessionViewModel.cs index 8766cff4..0d606d1a 100644 --- a/src/Desktop/RodelAgent.UI/ViewModels/Components/ChatSessionViewModel/ChatSessionViewModel.cs +++ b/src/Desktop/RodelAgent.UI/ViewModels/Components/ChatSessionViewModel/ChatSessionViewModel.cs @@ -76,9 +76,9 @@ private void Initialize(ChatSession data) /// 在进入视图开始显示时执行. /// [RelayCommand] - private void EnterView() + private async Task EnterViewAsync() { - CalcTotalTokenCount(); + await CalcTotalTokenCountAsync(); } [RelayCommand] @@ -164,7 +164,7 @@ private void CheckRegenerateButtonShown() => IsRegenerateButtonShown = !IsChatEmpty && !IsResponding && Messages.Last().IsAssistant; [RelayCommand] - private void CalcTotalTokenCount() + private async Task CalcTotalTokenCountAsync() { var pageVM = GlobalDependencies.ServiceProvider.GetService(); if (pageVM.CurrentSession != this) @@ -172,8 +172,8 @@ private void CalcTotalTokenCount() return; } - CalcBaseTokenCount(); - CalcUserInputTokenCount(); + await CalcBaseTokenCountAsync(); + await CalcUserInputTokenCountAsync(); } private void InitializeModels() @@ -243,7 +243,7 @@ private void OnMessageCountChanged(object sender, NotifyCollectionChangedEventAr CheckChatEmpty(); CheckRegenerateButtonShown(); CheckLastMessageTime(); - CalcTotalTokenCount(); + CalcTotalTokenCountCommand.Execute(default); } partial void OnIsEnterSendChanged(bool value) @@ -253,5 +253,5 @@ partial void OnModelChanged(string value) => CheckCurrentModelStatus(); partial void OnUserInputChanged(string value) - => CalcUserInputTokenCount(); + => CalcUserInputTokenCountCommand.Execute(default); }