BotSharp/src/Infrastructure/BotSharp.Core/Conversations/Services/TokenStatistics.cs

62 lines
2.2 KiB
C#
Raw Normal View History

2023-09-24 21:32:58 +00:00
using System.Drawing;
namespace BotSharp.Core.Conversations.Services;
public class TokenStatistics : ITokenStatistics
{
private int _promptTokenCount = 0;
2023-09-26 03:04:04 +00:00
private float _promptCost = 0f;
2023-09-24 21:32:58 +00:00
private int _completionTokenCount = 0;
2023-09-26 03:04:04 +00:00
private float _completionCost = 0f;
2023-09-24 21:32:58 +00:00
private readonly IServiceProvider _services;
private readonly ILogger _logger;
public int Total => _promptTokenCount + _completionTokenCount;
2023-09-26 03:04:04 +00:00
public string _model;
2023-09-24 21:32:58 +00:00
2023-09-26 03:04:04 +00:00
public float Cost => _promptCost + _completionCost;
2023-09-24 21:32:58 +00:00
public float AccumulatedCost
{
get
{
var stat = _services.GetRequiredService<IConversationStateService>();
2023-09-26 03:04:04 +00:00
return float.Parse(stat.GetState("llm_total_cost", "0"));
2023-09-24 21:32:58 +00:00
}
}
public TokenStatistics(IServiceProvider services, ILogger<TokenStatistics> logger)
{
_services = services;
_logger = logger;
}
2023-09-26 03:04:04 +00:00
public void AddToken(TokenStatsModel stats)
2023-09-24 21:32:58 +00:00
{
2023-09-26 03:04:04 +00:00
_model = stats.Model;
_promptTokenCount += stats.PromptCount;
_completionTokenCount += stats.CompletionCount;
_promptCost += stats.PromptCount / 1000f * stats.PromptCost;
_completionCost += stats.CompletionCount / 1000f * stats.CompletionCost;
2023-09-24 21:32:58 +00:00
// Accumulated Token
var stat = _services.GetRequiredService<IConversationStateService>();
var count1 = int.Parse(stat.GetState("prompt_total", "0"));
2023-09-26 03:04:04 +00:00
stat.SetState("prompt_total", stats.PromptCount + count1);
2023-09-24 21:32:58 +00:00
var count2 = int.Parse(stat.GetState("completion_total", "0"));
2023-09-26 03:04:04 +00:00
stat.SetState("completion_total", stats.CompletionCount + count2);
// Total cost
var count3 = float.Parse(stat.GetState("llm_total_cost", "0"));
stat.SetState("llm_total_cost", stats.PromptCount / 1000f * stats.PromptCost + stats.CompletionCount / 1000f * stats.CompletionCost + count3);
2023-09-24 21:32:58 +00:00
}
public void PrintStatistics()
{
2023-09-26 16:18:42 +00:00
var stats = $"Token Usage: {_promptTokenCount} prompt + {_completionTokenCount} completion = {Total} total tokens. One-Way cost: ${Cost:C4}, accumulated cost: ${AccumulatedCost:C4}. Model: {_model}";
2023-09-24 21:32:58 +00:00
#if DEBUG
2023-09-26 03:04:04 +00:00
Console.WriteLine(stats, Color.DarkGray);
2023-09-24 21:32:58 +00:00
#else
2023-09-26 03:04:04 +00:00
_logger.LogInformation(stats);
2023-09-24 21:32:58 +00:00
#endif
}
}