Calculate Tokens

This commit is contained in:
2025-07-28 11:52:38 +02:00
parent cc0de5e515
commit 140b4736a6
3 changed files with 61 additions and 34 deletions

View File

@@ -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();

View File

@@ -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<AiConversationMessage> 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<AiConversationMessage> messages, string modelName)
{
var count = 0;
foreach (var message in messages)
{
count += 4;
count += message.Message.Length / 2;
}
return count;
}
}
}

View File

@@ -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<AiConversationMessage> messages, string configModelName)
{
return true;
//Tokenizer tokenizer = TiktokenTokenizer.CreateForModel(configModelName);
//int tokens = countChatTokens(messages, tokenizer);
}
//private int countChatTokens(IList<AiConversationMessage> 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;
//}
}
}