Skip to content

Commit

Permalink
异步计算标记 (#64)
Browse files Browse the repository at this point in the history
  • Loading branch information
Richasy authored Jul 18, 2024
1 parent 166589b commit f9c9a36
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 25 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,7 @@ private async Task SendMessageInternalAsync(bool addUserMsg = true)

private Task EditMessageAsync(ChatMessage msg)
{
CalcTotalTokenCount();
CalcTotalTokenCountCommand.Execute(default);
return SaveSessionToDatabaseAsync();
}

Expand All @@ -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();
}

Expand All @@ -239,34 +238,55 @@ private void HandleSendMessageException(Exception ex)
CancelMessage();
}

private void CalcBaseTokenCount()
[RelayCommand]
private async Task CalcBaseTokenCountAsync()
{
if (Data.Messages.Count == 0 && string.IsNullOrEmpty(Data.SystemInstruction))
{
_baseTokenCount = 0;
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;
});
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -76,9 +76,9 @@ private void Initialize(ChatSession data)
/// 在进入视图开始显示时执行.
/// </summary>
[RelayCommand]
private void EnterView()
private async Task EnterViewAsync()
{
CalcTotalTokenCount();
await CalcTotalTokenCountAsync();
}

[RelayCommand]
Expand Down Expand Up @@ -164,16 +164,16 @@ private void CheckRegenerateButtonShown()
=> IsRegenerateButtonShown = !IsChatEmpty && !IsResponding && Messages.Last().IsAssistant;

[RelayCommand]
private void CalcTotalTokenCount()
private async Task CalcTotalTokenCountAsync()
{
var pageVM = GlobalDependencies.ServiceProvider.GetService<ChatServicePageViewModel>();
if (pageVM.CurrentSession != this)
{
return;
}

CalcBaseTokenCount();
CalcUserInputTokenCount();
await CalcBaseTokenCountAsync();
await CalcUserInputTokenCountAsync();
}

private void InitializeModels()
Expand Down Expand Up @@ -243,7 +243,7 @@ private void OnMessageCountChanged(object sender, NotifyCollectionChangedEventAr
CheckChatEmpty();
CheckRegenerateButtonShown();
CheckLastMessageTime();
CalcTotalTokenCount();
CalcTotalTokenCountCommand.Execute(default);
}

partial void OnIsEnterSendChanged(bool value)
Expand All @@ -253,5 +253,5 @@ partial void OnModelChanged(string value)
=> CheckCurrentModelStatus();

partial void OnUserInputChanged(string value)
=> CalcUserInputTokenCount();
=> CalcUserInputTokenCountCommand.Execute(default);
}

0 comments on commit f9c9a36

Please sign in to comment.