diff --git a/AICore/Context/SummaryParser/CsvContextSummaryParser.cs b/AICore/Context/SummaryParser/CsvContextSummaryParser.cs index 7535c8627..874332c57 100644 --- a/AICore/Context/SummaryParser/CsvContextSummaryParser.cs +++ b/AICore/Context/SummaryParser/CsvContextSummaryParser.cs @@ -41,7 +41,7 @@ namespace AICore.Context.SummaryParser sb.AppendLine($"Hilfeplan:{summary.SupportConcept}"); sb.AppendLine($"Kostenträger:{summary.CostBearer}"); sb.AppendLine("Klient:"); - sb.AppendLine(ToCsvString(summary.Customer, _Delimiter)); + sb.Append(ToCsvString(summary.Customer, _Delimiter)); sb.AppendLine("Zeiterfassungseinträge:"); sb.AppendLine(ToCsvString(summary.DataContext, _Delimiter)); return sb.ToString(); diff --git a/AICore/Prompt/Core/AiUtils.cs b/AICore/Prompt/Core/AiUtils.cs index f4dd262f8..7d371bd84 100644 --- a/AICore/Prompt/Core/AiUtils.cs +++ b/AICore/Prompt/Core/AiUtils.cs @@ -1,8 +1,59 @@ -namespace AICore.Prompt.Core +using BeWo.Data.Entities; +using BS.Shared.Exceptions; +using System; +using System.Collections.Generic; + +namespace AICore.Prompt.Core { public static class AiUtils { + public static string CheckTokenSize(IList messages, string modelName) + { + var buffer = 500; + var max_tokens = GetMaxTokensByModel(modelName); + var prev_tokens = CalculateTokensByModel(messages, modelName); + + var calc_tokens = prev_tokens + buffer; + + var percentage = calc_tokens * 100 / max_tokens; + + if (calc_tokens > max_tokens) + return $"Windowsize exceeded: ({prev_tokens}+{buffer})/{max_tokens} ({percentage}%)"; + + return null; + } + + private static int GetMaxTokensByModel(string modelName) + { + switch (modelName) + { + case "llama3.2:latest": return 128000; + case "gemma3:12b": return 128000; + case "gemma3:4b": return 128000; + case "gemma3_12b-max-context:latest": return 128000; + case "gemma3_4b-max-context:latest": return 128000; + case "mistral:latest": return 32000; + case "phi4:latest": return 16000; + default: + break; + } + + throw BeWoNotImplementedException.CreateFromInvalidObject(modelName); + } + + private static int CalculateTokensByModel(IList messages, string modelName) + { + var count = 0; + + foreach (var message in messages) + { + count += 4; + count += message.Message.Length / 2; + } + + return count; + } } } diff --git a/Service/Plugins/AiService2.cs b/Service/Plugins/AiService2.cs index 55a08a109..522343de0 100644 --- a/Service/Plugins/AiService2.cs +++ b/Service/Plugins/AiService2.cs @@ -6,6 +6,7 @@ using System.Linq; using System.Net; using System.ServiceModel; using System.Text; +using AICore.Prompt.Core; using AICore.Prompt.Factories; using BeWo.Data.Access; using BeWo.Data.Entities; @@ -20,6 +21,7 @@ using BS.Shared.Core; using BS.Shared.DataContracts; using BS.Shared.DataContracts.Compact; using BS.Shared.DataContracts.Feature.AI; +using BS.Shared.Exceptions; using BS.Shared.Extensions; using Newtonsoft.Json; @@ -316,12 +318,6 @@ namespace BeWo.Service.Plugins messages = conv.Messages.Select(m => new { role = m.Role.ToString().ToLower(), content = m.Message }) }; - // Check Token Size - if (!checkTokenSize(conv.Messages, configModelName)) - { - throw new Exception(); - } - // Updated conv.Updated = DateTime.Now; @@ -334,6 +330,12 @@ namespace BeWo.Service.Plugins conv.Messages.Add(user_msg); + // Check Token Size + if (AiUtils.CheckTokenSize(conv.Messages, configModelName) is string error) + { + throw new BeWoNotImplementedException(error); + } + // Update DB Entity // DAOFactory.GenericDAO.Update(conv); @@ -370,31 +372,5 @@ namespace BeWo.Service.Plugins return new AiConversationMessageDC[] { user_msg_dc, assi_msg_dc }; } - - private bool checkTokenSize(IList messages, string configModelName) - { - - return true; - //Tokenizer tokenizer = TiktokenTokenizer.CreateForModel(configModelName); - - //int tokens = countChatTokens(messages, tokenizer); - } - - //private int countChatTokens(IList messages, Tokenizer tokenizer) - //{ - // int tokensPerMessage = 4; // OpenAI Overhead - // int tokensPerReply = 2; - - // int total = 0; - - // foreach (var msg in messages) - // { - // total += tokensPerMessage; - // total += tokenizer.CountTokens(msg.Role.ToString()); - // total += tokenizer.CountTokens(msg.Message); - // } - - // return total + tokensPerReply; - //} } } \ No newline at end of file