VOOZH about

URL: https://techcommunity.microsoft.com/blog/appsonazureblog/calculating-chargebacks-for-business-unitsprojects-utilizing-a-shared-azure-open/3909202

⇱ Calculating Chargebacks for Business Units/Projects Utilizing a Shared Azure OpenAI Instance | Microsoft Community Hub


Blog Post

Apps on Azure Blog
6 MIN READ

Calculating Chargebacks for Business Units/Projects Utilizing a Shared Azure OpenAI Instance

# API Management service-specific details
$apimServiceName = "apim-hello-world"
$resourceGroupName = "myResourceGroup"

# Create logger
$context = New-AzApiManagementContext -ResourceGroupName $resourceGroupName -ServiceName $apimServiceName
New-AzApiManagementLogger -Context $context -LoggerId "OpenAiChargeBackLogger" -Name "ApimEventHub" -ConnectionString "Endpoint=sb://<EventHubsNamespace>.servicebus.windows.net/;SharedAccessKeyName=<KeyName>;SharedAccessKey=<key>" -Description "Event hub logger with connection string"
<outbound>
 <choose>
 <when condition="@(context.Response.StatusCode == 200)">
 <log-to-eventhub logger-id="TokenUsageLogger">@{
 var responseBody = context.Response.Body?.As<JObject>(true);
 return new JObject(
 new JProperty("Timestamp", DateTime.UtcNow.ToString()),
 new JProperty("ApiOperation", responseBody["object"].ToString()),
 new JProperty("AppKey", context.Request.Headers.GetValueOrDefault("Ocp-Apim-Subscription-Key",string.Empty)),
 new JProperty("PromptTokens", responseBody["usage"]["prompt_tokens"].ToString()),
 new JProperty("CompletionTokens", responseBody["usage"]["completion_tokens"].ToString()), 
 new JProperty("TotalTokens", responseBody["usage"]["total_tokens"].ToString())
 ).ToString();
 }</log-to-eventhub>
 </when>
 </choose>
 <base />
 </outbound>
[Function("TokenUsageFunction")]
public async Task Run([EventHubTrigger("%EventHubName%", Connection = "EventHubConnection")] string[] openAiTokenResponse)
{
 
 //Eventhub Messages arrive as an array 
 foreach (var tokenData in openAiTokenResponse)
 {
 try
 {
 _logger.LogInformation($"Azure OpenAI Tokens Data Received: {tokenData}");
 var OpenAiToken = JsonSerializer.Deserialize<OpenAiToken>(tokenData);

 if (OpenAiToken == null)
 {
 _logger.LogError($"Invalid OpenAi Api Token Response Received. Skipping.");
 continue;
 } 

 _telemetryClient.TrackEvent("Azure OpenAI Tokens", OpenAiToken.ToDictionary());
 }
 catch (Exception e)
 {
 _logger.LogError($"Error occured when processing TokenData: {tokenData}", e.Message);
 }
 }

}
customEvents
| where name contains "Azure OpenAI Tokens"
| extend tokenData = parse_json(customDimensions)
| where tokenData.AppKey contains "your-client-key"
| project 
 Timestamp = tokenData.Timestamp,
 Stream = tokenData.Stream,
 ApiOperation = tokenData.ApiOperation, 
 PromptTokens = tokenData.PromptTokens,
 CompletionTokens = tokenData.CompletionTokens,
 TotalTokens = tokenData.TotalTokens
  • .
Updated Feb 15, 2024
Version 11.0