54 lines
1.3 KiB
C#
54 lines
1.3 KiB
C#
using BS.Shared.Exceptions;
|
|
using BS.Shared.Interface.Feature.AICore;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
|
|
namespace BS.Shared.Core
|
|
{
|
|
public static class AiUtils
|
|
{
|
|
public static void CheckTokenSize(IEnumerable<IAiConversationMessage> messages, string modelName, int max_context_size)
|
|
{
|
|
CheckTokenSize(messages.Select(x => x.Message), modelName, max_context_size);
|
|
}
|
|
|
|
public static void CheckTokenSize(IEnumerable<string> messages, string modelName, int max_context_size)
|
|
{
|
|
var max_tokens_perc = 90.0d;
|
|
|
|
var buffer_tokens_fix = 500;
|
|
|
|
if (max_context_size < 0)
|
|
return;
|
|
|
|
var max_tokens = max_context_size;
|
|
|
|
var prev_tokens = CalculateTokensByModel(messages, modelName);
|
|
|
|
var calc_tokens = prev_tokens + buffer_tokens_fix;
|
|
|
|
var percentage = (double)calc_tokens * 100 / max_tokens;
|
|
|
|
if (percentage > max_tokens_perc)
|
|
{
|
|
var msg = $"Windowsize exceeded: ({prev_tokens}+{buffer_tokens_fix})/{max_tokens} ({percentage}%>{max_tokens_perc}%)";
|
|
throw new BeWoNotImplementedException(msg);
|
|
}
|
|
}
|
|
|
|
private static int CalculateTokensByModel(IEnumerable<string> messages, string modelName)
|
|
{
|
|
var count = 0;
|
|
|
|
foreach (var message in messages)
|
|
{
|
|
count += 4;
|
|
count += message.Length / 2;
|
|
}
|
|
|
|
return count;
|
|
}
|
|
|
|
}
|
|
}
|