Token Berechnung Update

This commit is contained in:
2026-02-20 11:59:10 +01:00
parent 85e53eb66e
commit 5bc4a90117
3 changed files with 34 additions and 28 deletions

View File

@@ -21,6 +21,7 @@ using BS.Shared.Interface;
using System.Text.Json;
using BS.Shared.Core;
using BeWo.Data.Security;
using BS.Shared.Exceptions;
namespace BeWo.Service.Plugins
{
@@ -85,7 +86,10 @@ namespace BeWo.Service.Plugins
if(model.Value > -1)
{
AiUtils.CheckTokenSize(messages, model.ModelName, model.Value);
if(!AiUtils.CheckUserAllMessageContextSize(messages, model.ModelName, model.Value, out var error))
{
throw new BeWoNotImplementedException(error);
}
}
var payload = new

View File

@@ -231,7 +231,7 @@ namespace BeWo.Service.Plugins
var conversation = createAiConversation(aiContextType, context, modell_oid.Value, AiDataContextType.csv2);
return AiUtils.CheckSystemMessageContextSize(conversation.Messages.Select(x => x.Message), modell.ModelName, modell.Value);
return AiUtils.CheckSystemMessageContextSize(conversation.Messages.Select(x => x.Message), modell.ModelName, modell.Value, out var error);
}
// ======================[ private ]======================
@@ -349,6 +349,14 @@ namespace BeWo.Service.Plugins
// Check Token Size
if (-1 < configModel.Value)
{
if(conv.Messages.Count <= 2)
{
if(!AiUtils.CheckUserFirstMessageContextSize(conv.Messages.Select(x => x.Message), configModelName, configModel.Value, out var error))
{
throw new BeWoNotImplementedException(error);
}
}
AiUtils.CheckTokenSize(conv.Messages, configModelName, configModel.Value);
}

View File

@@ -41,38 +41,25 @@ namespace BS.Shared.Core
}
}
public static bool CheckSystemMessageContextSize(IEnumerable<string> messages, string modelName, int max_context_size)
public static bool CheckSystemMessageContextSize(IEnumerable<string> messages, string modelName, int max_context_size, out string error)
{
if (max_context_size < 0)
throw new ArgumentOutOfRangeException(nameof(max_context_size));
if (max_context_size == 0)
return false;
var tokens_count = CalculateTokensByModel(messages, modelName);
var percentage = (double)tokens_count * 100 / max_context_size;
return percentage <= MAX_TOKENS_SYSTEM_PERCENTAGE;
return CheckContextSize(messages, modelName, max_context_size, MAX_TOKENS_SYSTEM_PERCENTAGE, out error);
}
public static bool CheckUserFirstMessageContextSize(IEnumerable<string> messages, string modelName, int max_context_size)
public static bool CheckUserFirstMessageContextSize(IEnumerable<string> messages, string modelName, int max_context_size, out string error)
{
if (max_context_size < 0)
throw new ArgumentOutOfRangeException(nameof(max_context_size));
if (max_context_size == 0)
return false;
var tokens_count = CalculateTokensByModel(messages, modelName);
var percentage = (double)tokens_count * 100 / max_context_size;
return percentage <= MAX_TOKENS_SYSTEM_PERCENTAGE + MAX_TOKENS_USER_PERCENTAGE;
return CheckContextSize(messages, modelName, max_context_size, MAX_TOKENS_SYSTEM_PERCENTAGE + MAX_TOKENS_USER_PERCENTAGE, out error);
}
public static bool CheckUserAllMessageContextSize(IEnumerable<string> messages, string modelName, int max_context_size)
public static bool CheckUserAllMessageContextSize(IEnumerable<string> messages, string modelName, int max_context_size, out string error)
{
return CheckContextSize(messages, modelName, max_context_size, MAX_TOKENS_CONVERSATION_PERCENTAGE, out error);
}
private static bool CheckContextSize(IEnumerable<string> messages, string modelName, int max_context_size, double maximum, out string error)
{
error = null;
if (max_context_size < 0)
throw new ArgumentOutOfRangeException(nameof(max_context_size));
@@ -83,7 +70,14 @@ namespace BS.Shared.Core
var percentage = (double)tokens_count * 100 / max_context_size;
return percentage <= MAX_TOKENS_CONVERSATION_PERCENTAGE;
var success = percentage <= maximum;
if (!success)
{
error = $"Windowsize exceeded: {tokens_count}/{max_context_size} ({percentage}%>{maximum}%)";
}
return success;
}
private static int CalculateTokensByModel(IEnumerable<string> messages, string modelName)