Calculate Tokens
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
//}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user