diff --git a/Service/Plugins/AiFunctionService.cs b/Service/Plugins/AiFunctionService.cs index 3f69cbb48..3d55c670c 100644 --- a/Service/Plugins/AiFunctionService.cs +++ b/Service/Plugins/AiFunctionService.cs @@ -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 diff --git a/Service/Plugins/AiService2.cs b/Service/Plugins/AiService2.cs index 88277ae40..a148071dc 100644 --- a/Service/Plugins/AiService2.cs +++ b/Service/Plugins/AiService2.cs @@ -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); } diff --git a/Shared/Core/AiUtils.cs b/Shared/Core/AiUtils.cs index eb08f2564..ad03f0dd9 100644 --- a/Shared/Core/AiUtils.cs +++ b/Shared/Core/AiUtils.cs @@ -41,38 +41,25 @@ namespace BS.Shared.Core } } - public static bool CheckSystemMessageContextSize(IEnumerable messages, string modelName, int max_context_size) + public static bool CheckSystemMessageContextSize(IEnumerable 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 messages, string modelName, int max_context_size) + public static bool CheckUserFirstMessageContextSize(IEnumerable 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 messages, string modelName, int max_context_size) + public static bool CheckUserAllMessageContextSize(IEnumerable 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 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 messages, string modelName)