From 3e4b1ca6afebe0178008aa1c3d056c6b9e675dad Mon Sep 17 00:00:00 2001 From: Tao Chen Date: Wed, 15 May 2024 14:41:34 -0700 Subject: [PATCH 1/4] ModelDiagnostics: Correctly parse extension data --- .../Demos/TelemetryWithAppInsights/Program.cs | 11 +++++- .../Clients/GeminiChatCompletionClient.cs | 4 +- .../Core/HuggingFaceClient.cs | 6 ++- .../Core/HuggingFaceMessageApiClient.cs | 6 ++- .../Connectors.OpenAI/AzureSdk/ClientCore.cs | 8 ++-- .../src/Diagnostics/ModelDiagnostics.cs | 39 +++++++++++++------ 6 files changed, 51 insertions(+), 23 deletions(-) diff --git a/dotnet/samples/Demos/TelemetryWithAppInsights/Program.cs b/dotnet/samples/Demos/TelemetryWithAppInsights/Program.cs index dc1009bb74b3..29006b5ac5bd 100644 --- a/dotnet/samples/Demos/TelemetryWithAppInsights/Program.cs +++ b/dotnet/samples/Demos/TelemetryWithAppInsights/Program.cs @@ -48,6 +48,7 @@ public static async Task Main() .AddSource("Microsoft.SemanticKernel*") .AddSource("Telemetry.Example") .AddAzureMonitorTraceExporter(options => options.ConnectionString = connectionString) + .AddOtlpExporter(options => options.Endpoint = new Uri("http://localhost:4317")) .Build(); using var meterProvider = Sdk.CreateMeterProviderBuilder() @@ -294,8 +295,14 @@ public bool TrySelectAIService( Temperature = 0, ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions }, - GoogleAIGeminiServiceKey => new GeminiPromptExecutionSettings(), - HuggingFaceServiceKey => new HuggingFacePromptExecutionSettings(), + GoogleAIGeminiServiceKey => new GeminiPromptExecutionSettings() + { + Temperature = 0, + }, + HuggingFaceServiceKey => new HuggingFacePromptExecutionSettings() + { + Temperature = 0, + }, _ => null, }; diff --git a/dotnet/src/Connectors/Connectors.Google/Core/Gemini/Clients/GeminiChatCompletionClient.cs b/dotnet/src/Connectors/Connectors.Google/Core/Gemini/Clients/GeminiChatCompletionClient.cs index 79b9089da5cb..d5eb82e1197b 100644 --- a/dotnet/src/Connectors/Connectors.Google/Core/Gemini/Clients/GeminiChatCompletionClient.cs +++ b/dotnet/src/Connectors/Connectors.Google/Core/Gemini/Clients/GeminiChatCompletionClient.cs @@ -166,7 +166,7 @@ public async Task> GenerateChatMessageAsync( GeminiResponse geminiResponse; List chatResponses; using (var activity = ModelDiagnostics.StartCompletionActivity( - this._chatGenerationEndpoint, this._modelId, ModelProvider, chatHistory, executionSettings)) + this._chatGenerationEndpoint, this._modelId, ModelProvider, chatHistory, state.ExecutionSettings)) { try { @@ -227,7 +227,7 @@ public async IAsyncEnumerable StreamGenerateChatMes for (state.Iteration = 1; ; state.Iteration++) { using (var activity = ModelDiagnostics.StartCompletionActivity( - this._chatGenerationEndpoint, this._modelId, ModelProvider, chatHistory, executionSettings)) + this._chatGenerationEndpoint, this._modelId, ModelProvider, chatHistory, state.ExecutionSettings)) { HttpResponseMessage? httpResponseMessage = null; Stream? responseStream = null; diff --git a/dotnet/src/Connectors/Connectors.HuggingFace/Core/HuggingFaceClient.cs b/dotnet/src/Connectors/Connectors.HuggingFace/Core/HuggingFaceClient.cs index a6c095738f1b..91c83dd0df1b 100644 --- a/dotnet/src/Connectors/Connectors.HuggingFace/Core/HuggingFaceClient.cs +++ b/dotnet/src/Connectors/Connectors.HuggingFace/Core/HuggingFaceClient.cs @@ -134,7 +134,8 @@ public async Task> GenerateTextAsync( var endpoint = this.GetTextGenerationEndpoint(modelId); var request = this.CreateTextRequest(prompt, executionSettings); - using var activity = ModelDiagnostics.StartCompletionActivity(endpoint, modelId, this.ModelProvider, prompt, executionSettings); + var huggingFaceExecutionSettings = HuggingFacePromptExecutionSettings.FromExecutionSettings(executionSettings); + using var activity = ModelDiagnostics.StartCompletionActivity(endpoint, modelId, this.ModelProvider, prompt, huggingFaceExecutionSettings); using var httpRequestMessage = this.CreatePost(request, endpoint, this.ApiKey); TextGenerationResponse response; @@ -169,7 +170,8 @@ public async IAsyncEnumerable StreamGenerateTextAsync( var request = this.CreateTextRequest(prompt, executionSettings); request.Stream = true; - using var activity = ModelDiagnostics.StartCompletionActivity(endpoint, modelId, this.ModelProvider, prompt, executionSettings); + var huggingFaceExecutionSettings = HuggingFacePromptExecutionSettings.FromExecutionSettings(executionSettings); + using var activity = ModelDiagnostics.StartCompletionActivity(endpoint, modelId, this.ModelProvider, prompt, huggingFaceExecutionSettings); HttpResponseMessage? httpResponseMessage = null; Stream? responseStream = null; try diff --git a/dotnet/src/Connectors/Connectors.HuggingFace/Core/HuggingFaceMessageApiClient.cs b/dotnet/src/Connectors/Connectors.HuggingFace/Core/HuggingFaceMessageApiClient.cs index 7ae142fb9cdd..3bc461faf063 100644 --- a/dotnet/src/Connectors/Connectors.HuggingFace/Core/HuggingFaceMessageApiClient.cs +++ b/dotnet/src/Connectors/Connectors.HuggingFace/Core/HuggingFaceMessageApiClient.cs @@ -85,7 +85,8 @@ internal async IAsyncEnumerable StreamCompleteChatM var request = this.CreateChatRequest(chatHistory, executionSettings); request.Stream = true; - using var activity = ModelDiagnostics.StartCompletionActivity(endpoint, modelId, this._clientCore.ModelProvider, chatHistory, executionSettings); + var huggingFaceExecutionSettings = HuggingFacePromptExecutionSettings.FromExecutionSettings(executionSettings); + using var activity = ModelDiagnostics.StartCompletionActivity(endpoint, modelId, this._clientCore.ModelProvider, chatHistory, huggingFaceExecutionSettings); HttpResponseMessage? httpResponseMessage = null; Stream? responseStream = null; try @@ -144,7 +145,8 @@ internal async Task> CompleteChatMessageAsync( var endpoint = this.GetChatGenerationEndpoint(); var request = this.CreateChatRequest(chatHistory, executionSettings); - using var activity = ModelDiagnostics.StartCompletionActivity(endpoint, modelId, this._clientCore.ModelProvider, chatHistory, executionSettings); + var huggingFaceExecutionSettings = HuggingFacePromptExecutionSettings.FromExecutionSettings(executionSettings); + using var activity = ModelDiagnostics.StartCompletionActivity(endpoint, modelId, this._clientCore.ModelProvider, chatHistory, huggingFaceExecutionSettings); using var httpRequestMessage = this._clientCore.CreatePost(request, endpoint, this._clientCore.ApiKey); ChatCompletionResponse response; diff --git a/dotnet/src/Connectors/Connectors.OpenAI/AzureSdk/ClientCore.cs b/dotnet/src/Connectors/Connectors.OpenAI/AzureSdk/ClientCore.cs index fac60f53903e..0dea1cac35d5 100644 --- a/dotnet/src/Connectors/Connectors.OpenAI/AzureSdk/ClientCore.cs +++ b/dotnet/src/Connectors/Connectors.OpenAI/AzureSdk/ClientCore.cs @@ -138,7 +138,7 @@ internal async Task> GetTextResultsAsync( Completions? responseData = null; List responseContent; - using (var activity = ModelDiagnostics.StartCompletionActivity(this.Endpoint, this.DeploymentOrModelName, ModelProvider, prompt, executionSettings)) + using (var activity = ModelDiagnostics.StartCompletionActivity(this.Endpoint, this.DeploymentOrModelName, ModelProvider, prompt, textExecutionSettings)) { try { @@ -183,7 +183,7 @@ internal async IAsyncEnumerable GetStreamingTextContentsAs var options = CreateCompletionsOptions(prompt, textExecutionSettings, this.DeploymentOrModelName); - using var activity = ModelDiagnostics.StartCompletionActivity(this.Endpoint, this.DeploymentOrModelName, ModelProvider, prompt, executionSettings); + using var activity = ModelDiagnostics.StartCompletionActivity(this.Endpoint, this.DeploymentOrModelName, ModelProvider, prompt, textExecutionSettings); StreamingResponse response; try @@ -391,7 +391,7 @@ internal async Task> GetChatMessageContentsAsy // Make the request. ChatCompletions? responseData = null; List responseContent; - using (var activity = ModelDiagnostics.StartCompletionActivity(this.Endpoint, this.DeploymentOrModelName, ModelProvider, chat, executionSettings)) + using (var activity = ModelDiagnostics.StartCompletionActivity(this.Endpoint, this.DeploymentOrModelName, ModelProvider, chat, chatExecutionSettings)) { try { @@ -663,7 +663,7 @@ internal async IAsyncEnumerable GetStreamingC ChatRole? streamedRole = default; CompletionsFinishReason finishReason = default; - using (var activity = ModelDiagnostics.StartCompletionActivity(this.Endpoint, this.DeploymentOrModelName, ModelProvider, chat, executionSettings)) + using (var activity = ModelDiagnostics.StartCompletionActivity(this.Endpoint, this.DeploymentOrModelName, ModelProvider, chat, chatExecutionSettings)) { // Make the request. StreamingResponse response; diff --git a/dotnet/src/InternalUtilities/src/Diagnostics/ModelDiagnostics.cs b/dotnet/src/InternalUtilities/src/Diagnostics/ModelDiagnostics.cs index 5522e0f73330..db1ba2ba2e16 100644 --- a/dotnet/src/InternalUtilities/src/Diagnostics/ModelDiagnostics.cs +++ b/dotnet/src/InternalUtilities/src/Diagnostics/ModelDiagnostics.cs @@ -39,15 +39,25 @@ internal static class ModelDiagnostics /// Start a text completion activity for a given model. /// The activity will be tagged with the a set of attributes specified by the semantic conventions. /// - public static Activity? StartCompletionActivity(Uri? endpoint, string modelName, string modelProvider, string prompt, PromptExecutionSettings? executionSettings) - => StartCompletionActivity(endpoint, modelName, modelProvider, prompt, executionSettings, prompt => prompt); + public static Activity? StartCompletionActivity( + Uri? endpoint, + string modelName, + string modelProvider, + string prompt, + T? executionSettings + ) where T : PromptExecutionSettings => StartCompletionActivity(endpoint, modelName, modelProvider, prompt, executionSettings, prompt => prompt); /// /// Start a chat completion activity for a given model. /// The activity will be tagged with the a set of attributes specified by the semantic conventions. /// - public static Activity? StartCompletionActivity(Uri? endpoint, string modelName, string modelProvider, ChatHistory chatHistory, PromptExecutionSettings? executionSettings) - => StartCompletionActivity(endpoint, modelName, modelProvider, chatHistory, executionSettings, ToOpenAIFormat); + public static Activity? StartCompletionActivity( + Uri? endpoint, + string modelName, + string modelProvider, + ChatHistory chatHistory, + T? executionSettings + ) where T : PromptExecutionSettings => StartCompletionActivity(endpoint, modelName, modelProvider, chatHistory, executionSettings, ToOpenAIFormat); /// /// Set the text completion response for a given activity. @@ -109,16 +119,23 @@ public static bool IsModelDiagnosticsEnabled() } #region Private - private static void AddOptionalTags(Activity? activity, PromptExecutionSettings? executionSettings) + private static void AddOptionalTags(Activity? activity, T? executionSettings) where T : PromptExecutionSettings { - if (activity is null || executionSettings?.ExtensionData is null) + if (activity is null || executionSettings is null) + { + return; + } + + // Serialize and deserialize the execution settings to get the extension data + var deserializedSettings = JsonSerializer.Deserialize(JsonSerializer.Serialize(executionSettings)); + if (deserializedSettings is null || deserializedSettings.ExtensionData is null) { return; } void TryAddTag(string key, string tag) { - if (executionSettings.ExtensionData.TryGetValue(key, out var value)) + if (deserializedSettings.ExtensionData.TryGetValue(key, out var value)) { activity.SetTag(tag, value); } @@ -194,13 +211,13 @@ private static void ToOpenAIFormat(StringBuilder sb, ChatMessageContentItemColle /// Start a completion activity and return the activity. /// The `formatPrompt` delegate won't be invoked if events are disabled. /// - private static Activity? StartCompletionActivity( + private static Activity? StartCompletionActivity( Uri? endpoint, string modelName, string modelProvider, - T prompt, - PromptExecutionSettings? executionSettings, - Func formatPrompt) + T1 prompt, + T2? executionSettings, + Func formatPrompt) where T2 : PromptExecutionSettings { if (!IsModelDiagnosticsEnabled()) { From 48e904c71e09ef951712720053baef6abd43c14a Mon Sep 17 00:00:00 2001 From: Tao Chen Date: Wed, 15 May 2024 14:42:56 -0700 Subject: [PATCH 2/4] Remove Aspire dashboard --- dotnet/samples/Demos/TelemetryWithAppInsights/Program.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/dotnet/samples/Demos/TelemetryWithAppInsights/Program.cs b/dotnet/samples/Demos/TelemetryWithAppInsights/Program.cs index 29006b5ac5bd..93391ac1fb18 100644 --- a/dotnet/samples/Demos/TelemetryWithAppInsights/Program.cs +++ b/dotnet/samples/Demos/TelemetryWithAppInsights/Program.cs @@ -48,7 +48,6 @@ public static async Task Main() .AddSource("Microsoft.SemanticKernel*") .AddSource("Telemetry.Example") .AddAzureMonitorTraceExporter(options => options.ConnectionString = connectionString) - .AddOtlpExporter(options => options.Endpoint = new Uri("http://localhost:4317")) .Build(); using var meterProvider = Sdk.CreateMeterProviderBuilder() From be4ad740155230ff9d7f89eaef795fb0aeb8477c Mon Sep 17 00:00:00 2001 From: Tao Chen Date: Wed, 15 May 2024 15:51:10 -0700 Subject: [PATCH 3/4] Address comments --- .../Core/HuggingFaceClient.cs | 19 +++++++------- .../Core/HuggingFaceMessageApiClient.cs | 20 ++++++++------- .../src/Diagnostics/ModelDiagnostics.cs | 25 +++++++++++-------- 3 files changed, 35 insertions(+), 29 deletions(-) diff --git a/dotnet/src/Connectors/Connectors.HuggingFace/Core/HuggingFaceClient.cs b/dotnet/src/Connectors/Connectors.HuggingFace/Core/HuggingFaceClient.cs index 91c83dd0df1b..bf4ebc8b39a3 100644 --- a/dotnet/src/Connectors/Connectors.HuggingFace/Core/HuggingFaceClient.cs +++ b/dotnet/src/Connectors/Connectors.HuggingFace/Core/HuggingFaceClient.cs @@ -132,9 +132,10 @@ public async Task> GenerateTextAsync( { string modelId = executionSettings?.ModelId ?? this.ModelId; var endpoint = this.GetTextGenerationEndpoint(modelId); - var request = this.CreateTextRequest(prompt, executionSettings); var huggingFaceExecutionSettings = HuggingFacePromptExecutionSettings.FromExecutionSettings(executionSettings); + var request = this.CreateTextRequest(prompt, huggingFaceExecutionSettings); + using var activity = ModelDiagnostics.StartCompletionActivity(endpoint, modelId, this.ModelProvider, prompt, huggingFaceExecutionSettings); using var httpRequestMessage = this.CreatePost(request, endpoint, this.ApiKey); @@ -155,7 +156,7 @@ public async Task> GenerateTextAsync( var textContents = GetTextContentsFromResponse(response, modelId); activity?.SetCompletionResponse(textContents); - this.LogTextGenerationUsage(executionSettings); + this.LogTextGenerationUsage(huggingFaceExecutionSettings); return textContents; } @@ -167,10 +168,11 @@ public async IAsyncEnumerable StreamGenerateTextAsync( { string modelId = executionSettings?.ModelId ?? this.ModelId; var endpoint = this.GetTextGenerationEndpoint(modelId); - var request = this.CreateTextRequest(prompt, executionSettings); - request.Stream = true; var huggingFaceExecutionSettings = HuggingFacePromptExecutionSettings.FromExecutionSettings(executionSettings); + var request = this.CreateTextRequest(prompt, huggingFaceExecutionSettings); + request.Stream = true; + using var activity = ModelDiagnostics.StartCompletionActivity(endpoint, modelId, this.ModelProvider, prompt, huggingFaceExecutionSettings); HttpResponseMessage? httpResponseMessage = null; Stream? responseStream = null; @@ -241,9 +243,8 @@ private static StreamingTextContent GetStreamingTextContentFromStreamResponse(Te private TextGenerationRequest CreateTextRequest( string prompt, - PromptExecutionSettings? promptExecutionSettings) + HuggingFacePromptExecutionSettings huggingFaceExecutionSettings) { - var huggingFaceExecutionSettings = HuggingFacePromptExecutionSettings.FromExecutionSettings(promptExecutionSettings); ValidateMaxNewTokens(huggingFaceExecutionSettings.MaxNewTokens); var request = TextGenerationRequest.FromPromptAndExecutionSettings(prompt, huggingFaceExecutionSettings); return request; @@ -255,13 +256,13 @@ private static List GetTextContentsFromResponse(TextGenerationRespo private static List GetTextContentsFromResponse(ImageToTextGenerationResponse response, string modelId) => response.Select(r => new TextContent(r.GeneratedText, modelId, r, Encoding.UTF8)).ToList(); - private void LogTextGenerationUsage(PromptExecutionSettings? executionSettings) + private void LogTextGenerationUsage(HuggingFacePromptExecutionSettings executionSettings) { if (this.Logger.IsEnabled(LogLevel.Debug)) { - this.Logger?.LogDebug( + this.Logger.LogDebug( "HuggingFace text generation usage: ModelId: {ModelId}", - executionSettings?.ModelId ?? this.ModelId); + executionSettings.ModelId ?? this.ModelId); } } private Uri GetTextGenerationEndpoint(string modelId) diff --git a/dotnet/src/Connectors/Connectors.HuggingFace/Core/HuggingFaceMessageApiClient.cs b/dotnet/src/Connectors/Connectors.HuggingFace/Core/HuggingFaceMessageApiClient.cs index 3bc461faf063..6e24a11bf382 100644 --- a/dotnet/src/Connectors/Connectors.HuggingFace/Core/HuggingFaceMessageApiClient.cs +++ b/dotnet/src/Connectors/Connectors.HuggingFace/Core/HuggingFaceMessageApiClient.cs @@ -82,10 +82,13 @@ internal async IAsyncEnumerable StreamCompleteChatM { string modelId = executionSettings?.ModelId ?? this._clientCore.ModelId; var endpoint = this.GetChatGenerationEndpoint(); - var request = this.CreateChatRequest(chatHistory, executionSettings); - request.Stream = true; var huggingFaceExecutionSettings = HuggingFacePromptExecutionSettings.FromExecutionSettings(executionSettings); + huggingFaceExecutionSettings.ModelId ??= this._clientCore.ModelId; + + var request = this.CreateChatRequest(chatHistory, huggingFaceExecutionSettings); + request.Stream = true; + using var activity = ModelDiagnostics.StartCompletionActivity(endpoint, modelId, this._clientCore.ModelProvider, chatHistory, huggingFaceExecutionSettings); HttpResponseMessage? httpResponseMessage = null; Stream? responseStream = null; @@ -143,9 +146,11 @@ internal async Task> CompleteChatMessageAsync( { string modelId = executionSettings?.ModelId ?? this._clientCore.ModelId; var endpoint = this.GetChatGenerationEndpoint(); - var request = this.CreateChatRequest(chatHistory, executionSettings); var huggingFaceExecutionSettings = HuggingFacePromptExecutionSettings.FromExecutionSettings(executionSettings); + huggingFaceExecutionSettings.ModelId ??= this._clientCore.ModelId; + var request = this.CreateChatRequest(chatHistory, huggingFaceExecutionSettings); + using var activity = ModelDiagnostics.StartCompletionActivity(endpoint, modelId, this._clientCore.ModelProvider, chatHistory, huggingFaceExecutionSettings); using var httpRequestMessage = this._clientCore.CreatePost(request, endpoint, this._clientCore.ApiKey); @@ -166,12 +171,12 @@ internal async Task> CompleteChatMessageAsync( var chatContents = GetChatMessageContentsFromResponse(response, modelId); activity?.SetCompletionResponse(chatContents, response.Usage?.PromptTokens, response.Usage?.CompletionTokens); - this.LogChatCompletionUsage(executionSettings, response); + this.LogChatCompletionUsage(huggingFaceExecutionSettings, response); return chatContents; } - private void LogChatCompletionUsage(PromptExecutionSettings? executionSettings, ChatCompletionResponse chatCompletionResponse) + private void LogChatCompletionUsage(HuggingFacePromptExecutionSettings executionSettings, ChatCompletionResponse chatCompletionResponse) { if (this._clientCore.Logger.IsEnabled(LogLevel.Debug)) { @@ -265,11 +270,8 @@ private async IAsyncEnumerable ProcessChatResponseS private ChatCompletionRequest CreateChatRequest( ChatHistory chatHistory, - PromptExecutionSettings? promptExecutionSettings) + HuggingFacePromptExecutionSettings huggingFaceExecutionSettings) { - var huggingFaceExecutionSettings = HuggingFacePromptExecutionSettings.FromExecutionSettings(promptExecutionSettings); - huggingFaceExecutionSettings.ModelId ??= this._clientCore.ModelId; - HuggingFaceClient.ValidateMaxTokens(huggingFaceExecutionSettings.MaxTokens); var request = ChatCompletionRequest.FromChatHistoryAndExecutionSettings(chatHistory, huggingFaceExecutionSettings); return request; diff --git a/dotnet/src/InternalUtilities/src/Diagnostics/ModelDiagnostics.cs b/dotnet/src/InternalUtilities/src/Diagnostics/ModelDiagnostics.cs index db1ba2ba2e16..ecd3562dcb8e 100644 --- a/dotnet/src/InternalUtilities/src/Diagnostics/ModelDiagnostics.cs +++ b/dotnet/src/InternalUtilities/src/Diagnostics/ModelDiagnostics.cs @@ -39,25 +39,27 @@ internal static class ModelDiagnostics /// Start a text completion activity for a given model. /// The activity will be tagged with the a set of attributes specified by the semantic conventions. /// - public static Activity? StartCompletionActivity( + public static Activity? StartCompletionActivity( Uri? endpoint, string modelName, string modelProvider, string prompt, - T? executionSettings - ) where T : PromptExecutionSettings => StartCompletionActivity(endpoint, modelName, modelProvider, prompt, executionSettings, prompt => prompt); + TPromptExecutionSettings? executionSettings + ) where TPromptExecutionSettings : PromptExecutionSettings + => StartCompletionActivity(endpoint, modelName, modelProvider, prompt, executionSettings, prompt => prompt); /// /// Start a chat completion activity for a given model. /// The activity will be tagged with the a set of attributes specified by the semantic conventions. /// - public static Activity? StartCompletionActivity( + public static Activity? StartCompletionActivity( Uri? endpoint, string modelName, string modelProvider, ChatHistory chatHistory, - T? executionSettings - ) where T : PromptExecutionSettings => StartCompletionActivity(endpoint, modelName, modelProvider, chatHistory, executionSettings, ToOpenAIFormat); + TPromptExecutionSettings? executionSettings + ) where TPromptExecutionSettings : PromptExecutionSettings + => StartCompletionActivity(endpoint, modelName, modelProvider, chatHistory, executionSettings, ToOpenAIFormat); /// /// Set the text completion response for a given activity. @@ -119,7 +121,8 @@ public static bool IsModelDiagnosticsEnabled() } #region Private - private static void AddOptionalTags(Activity? activity, T? executionSettings) where T : PromptExecutionSettings + private static void AddOptionalTags(Activity? activity, TPromptExecutionSettings? executionSettings) + where TPromptExecutionSettings : PromptExecutionSettings { if (activity is null || executionSettings is null) { @@ -211,13 +214,13 @@ private static void ToOpenAIFormat(StringBuilder sb, ChatMessageContentItemColle /// Start a completion activity and return the activity. /// The `formatPrompt` delegate won't be invoked if events are disabled. /// - private static Activity? StartCompletionActivity( + private static Activity? StartCompletionActivity( Uri? endpoint, string modelName, string modelProvider, - T1 prompt, - T2? executionSettings, - Func formatPrompt) where T2 : PromptExecutionSettings + TPrompt prompt, + TPromptExecutionSettings? executionSettings, + Func formatPrompt) where TPromptExecutionSettings : PromptExecutionSettings { if (!IsModelDiagnosticsEnabled()) { From 46869e7644ca754e5c82dc935cbd3eccc9918028 Mon Sep 17 00:00:00 2001 From: Tao Chen Date: Wed, 15 May 2024 22:17:54 -0700 Subject: [PATCH 4/4] Add comment for Gemini --- dotnet/samples/Demos/TelemetryWithAppInsights/Program.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dotnet/samples/Demos/TelemetryWithAppInsights/Program.cs b/dotnet/samples/Demos/TelemetryWithAppInsights/Program.cs index 93391ac1fb18..93efe0540d08 100644 --- a/dotnet/samples/Demos/TelemetryWithAppInsights/Program.cs +++ b/dotnet/samples/Demos/TelemetryWithAppInsights/Program.cs @@ -297,6 +297,9 @@ public bool TrySelectAIService( GoogleAIGeminiServiceKey => new GeminiPromptExecutionSettings() { Temperature = 0, + // Not show casing the AutoInvokeKernelFunctions behavior for Gemini due the following issue: + // https://github.com/microsoft/semantic-kernel/issues/6282 + // ToolCallBehavior = GeminiToolCallBehavior.AutoInvokeKernelFunctions }, HuggingFaceServiceKey => new HuggingFacePromptExecutionSettings() {