src/dotnet/AzureAI.Proxy/OpenAIHandlers/Tokens.cs (32 lines of code) (raw):

using System.Text.Json.Nodes; using System.Text.Json; using TiktokenSharp; namespace AzureAI.Proxy.OpenAIHandlers; public static class Tokens { public static int GetTokensFromString(string str, string modelName) { if (modelName.Contains("gpt-35")) modelName = modelName.Replace("35", "3.5"); var encodingManager = TikToken.EncodingForModel(modelName); var encoding = encodingManager.Encode(str); int nrTokens = encoding.Count(); return nrTokens; } public static LogAnalyticsRecord CalculateChatInputTokens(HttpRequest request, LogAnalyticsRecord record) { //Rewind to first position to read the stream again request.Body.Position = 0; StreamReader reader = new StreamReader(request.Body, true); string bodyText = reader.ReadToEnd(); JsonNode jsonNode = JsonSerializer.Deserialize<JsonNode>(bodyText); var modelName = jsonNode["model"].ToString(); record.Model = modelName; var messages = jsonNode["messages"].AsArray(); foreach (var message in messages) { var content = message["content"].ToString(); //calculate tokens using a tokenizer. record.InputTokens += GetTokensFromString(content, modelName); } return record; } }