{"id":4899,"date":"2025-05-28T06:18:24","date_gmt":"2025-05-28T13:18:24","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/semantic-kernel\/?p=4899"},"modified":"2025-05-28T06:18:24","modified_gmt":"2025-05-28T13:18:24","slug":"semantic-kernel-and-microsoft-extensions-ai-better-together-part-2","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/agent-framework\/semantic-kernel-and-microsoft-extensions-ai-better-together-part-2\/","title":{"rendered":"Semantic Kernel and Microsoft.Extensions.AI: Better Together, Part 2"},"content":{"rendered":"<p class=\"code-line\" dir=\"auto\" data-line=\"2\"><em>This is Part 2 of our series on integrating Microsoft.Extensions.AI with Semantic Kernel. In\u00a0<a href=\"https:\/\/devblogs.microsoft.com\/semantic-kernel\/semantic-kernel-and-microsoft-extensions-ai-better-together-part-1\/\" data-href=\"https:\/\/devblogs.microsoft.com\/semantic-kernel\/semantic-kernel-and-microsoft-extensions-ai-better-together-part-1\/\">Part 1<\/a>, we explored the relationship between these technologies and how they complement each other. Now, let&#8217;s dive into practical examples showing how to use Microsoft.Extensions.AI abstractions with Semantic Kernel in non-agent scenarios.<\/em><\/p>\n<h2 id=\"getting-started-with-microsoftextensionsai-and-semantic-kernel\" class=\"code-line\" dir=\"auto\" data-line=\"4\">Getting Started with Microsoft.Extensions.AI and Semantic Kernel<\/h2>\n<p class=\"code-line\" dir=\"auto\" data-line=\"6\">Before we dive into examples, let&#8217;s understand what we&#8217;ll be working with. Microsoft.Extensions.AI provides foundational abstractions like\u00a0<code>IChatClient<\/code>\u00a0and\u00a0<code>IEmbeddingGenerator&lt;string, Embedding&lt;float&gt;&gt;<\/code>, while Semantic Kernel builds upon these to provide higher-level functionality like plugins, prompt templates, and workflow automation.<\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"8\">In this post, we&#8217;ll focus on practical scenarios where you can leverage both technologies together for common AI tasks.<\/p>\n<h2 id=\"1-basic-chat-completion-with-ichatclient\" class=\"code-line\" dir=\"auto\" data-line=\"10\">1. Basic Chat Completion with IChatClient<\/h2>\n<p class=\"code-line\" dir=\"auto\" data-line=\"12\">Let&#8217;s start with the most fundamental scenario: chat completion. Semantic Kernel now natively supports Microsoft.Extensions.AI&#8217;s\u00a0<code>IChatClient<\/code>\u00a0interface.<\/p>\n<h3 id=\"using-kernel-builder\" class=\"code-line\" dir=\"auto\" data-line=\"14\">Using Kernel Builder<\/h3>\n<pre><code class=\"code-line language-csharp\" dir=\"auto\" data-line=\"16\"><span class=\"hljs-keyword\">using<\/span> Microsoft.Extensions.AI;\r\n<span class=\"hljs-keyword\">using<\/span> Microsoft.SemanticKernel;\r\n\r\n<span class=\"hljs-comment\">\/\/ Create a kernel with OpenAI chat client<\/span>\r\n<span class=\"hljs-keyword\">var<\/span> kernel = Kernel.CreateBuilder()\r\n    .AddOpenAIChatClient(<span class=\"hljs-string\">\"gpt-4o\"<\/span>, <span class=\"hljs-string\">\"your-api-key\"<\/span>)\r\n    .Build();\r\n\r\n<span class=\"hljs-comment\">\/\/ Simple chat completion<\/span>\r\n<span class=\"hljs-keyword\">var<\/span> response = <span class=\"hljs-keyword\">await<\/span> kernel.InvokePromptAsync(<span class=\"hljs-string\">\"What is the capital of France?\"<\/span>);\r\nConsole.WriteLine(response);\r\n<\/code><\/pre>\n<h3 id=\"using-a-chat-client-directly-with-azure-openai\" class=\"code-line\" dir=\"auto\" data-line=\"30\">Using a Chat Client directly with Azure OpenAI<\/h3>\n<pre><code class=\"code-line language-csharp\" dir=\"auto\" data-line=\"32\"><span class=\"hljs-keyword\">var<\/span> kernel = Kernel.CreateBuilder()\r\n    .AddAzureOpenAIChatClient(\r\n        deploymentName: <span class=\"hljs-string\">\"gpt-4o\"<\/span>,\r\n        endpoint: <span class=\"hljs-string\">\"https:\/\/your-resource.openai.azure.com\/\"<\/span>,\r\n        apiKey: <span class=\"hljs-string\">\"your-api-key\"<\/span>)\r\n    .Build();\r\n\r\n<span class=\"hljs-keyword\">var<\/span> client = kernel.GetRequiredService&lt;IChatClient&gt;();\r\n<span class=\"hljs-keyword\">var<\/span> response = <span class=\"hljs-keyword\">await<\/span> client.GetResponseAsync([<span class=\"hljs-keyword\">new<\/span>(ChatRole.User, <span class=\"hljs-string\">\"Hello, AI!\"<\/span>)]);\r\nConsole.WriteLine(response.Text);\r\n<\/code><\/pre>\n<h3 id=\"using-dependency-injection\" class=\"code-line\" dir=\"auto\" data-line=\"45\">Using Dependency Injection<\/h3>\n<pre><code class=\"code-line language-csharp\" dir=\"auto\" data-line=\"47\"><span class=\"hljs-keyword\">using<\/span> Microsoft.Extensions.DependencyInjection;\r\n<span class=\"hljs-keyword\">using<\/span> Microsoft.Extensions.AI;\r\n<span class=\"hljs-keyword\">using<\/span> Microsoft.SemanticKernel;\r\n\r\n<span class=\"hljs-keyword\">var<\/span> services = <span class=\"hljs-keyword\">new<\/span> ServiceCollection();\r\n\r\n<span class=\"hljs-comment\">\/\/ Register the chat client<\/span>\r\nservices.AddOpenAIChatClient(<span class=\"hljs-string\">\"gpt-4o\"<\/span>, <span class=\"hljs-string\">\"your-api-key\"<\/span>);\r\n\r\n<span class=\"hljs-comment\">\/\/ Register Semantic Kernel<\/span>\r\nservices.AddKernel();\r\n\r\n<span class=\"hljs-keyword\">var<\/span> serviceProvider = services.BuildServiceProvider();\r\n<span class=\"hljs-keyword\">var<\/span> kernel = serviceProvider.GetRequiredService&lt;Kernel&gt;();\r\n\r\n<span class=\"hljs-keyword\">var<\/span> response = <span class=\"hljs-keyword\">await<\/span> kernel.InvokePromptAsync(<span class=\"hljs-string\">\"Tell me about artificial intelligence.\"<\/span>);\r\nConsole.WriteLine(response);\r\n<\/code><\/pre>\n<h3 id=\"converting-between-ichatcompletionservice-and-ichatclient\" class=\"code-line\" dir=\"auto\" data-line=\"67\">Converting Between IChatCompletionService and IChatClient<\/h3>\n<p class=\"code-line\" dir=\"auto\" data-line=\"69\">Sometimes you might need to work with both interfaces. Semantic Kernel provides seamless conversion:<\/p>\n<pre><code class=\"code-line language-csharp\" dir=\"auto\" data-line=\"71\"><span class=\"hljs-keyword\">using<\/span> Microsoft.Extensions.AI;\r\n<span class=\"hljs-keyword\">using<\/span> Microsoft.SemanticKernel;\r\n<span class=\"hljs-keyword\">using<\/span> Microsoft.SemanticKernel.ChatCompletion;\r\n\r\n<span class=\"hljs-comment\">\/\/ Get the chat completion service<\/span>\r\n<span class=\"hljs-keyword\">var<\/span> chatService = kernel.GetRequiredService&lt;IChatCompletionService&gt;();\r\n\r\n<span class=\"hljs-comment\">\/\/ Convert to IChatClient when needed<\/span>\r\nIChatClient chatClient = chatService.AsChatClient();\r\n\r\n<span class=\"hljs-comment\">\/\/ Or convert back<\/span>\r\nIChatCompletionService backToService = chatClient.AsChatCompletionService();\r\n<\/code><\/pre>\n<h2 id=\"2-embedding-generation-with-iembeddinggenerator\" class=\"code-line\" dir=\"auto\" data-line=\"86\">2. Embedding Generation with IEmbeddingGenerator<\/h2>\n<p class=\"code-line\" dir=\"auto\" data-line=\"88\">Semantic Kernel has moved from its own\u00a0<code>ITextEmbeddingGenerationService<\/code>\u00a0to Microsoft.Extensions.AI&#8217;s\u00a0<code>IEmbeddingGenerator&lt;string, Embedding&lt;float&gt;&gt;<\/code>. Here&#8217;s how to use it:<\/p>\n<h3 id=\"basic-embedding-generation\" class=\"code-line\" dir=\"auto\" data-line=\"90\">Basic Embedding Generation<\/h3>\n<pre><code class=\"code-line language-csharp\" dir=\"auto\" data-line=\"92\"><span class=\"hljs-keyword\">using<\/span> Microsoft.Extensions.AI;\r\n<span class=\"hljs-keyword\">using<\/span> Microsoft.SemanticKernel;\r\n\r\n<span class=\"hljs-meta\">#<span class=\"hljs-keyword\">pragma<\/span> <span class=\"hljs-keyword\">warning<\/span> disable SKEXP0010 \/\/ Type is for evaluation<\/span>\r\n\r\n<span class=\"hljs-keyword\">var<\/span> kernel = Kernel.CreateBuilder()\r\n    .AddOpenAIEmbeddingGenerator(<span class=\"hljs-string\">\"text-embedding-ada-002\"<\/span>, <span class=\"hljs-string\">\"your-api-key\"<\/span>)\r\n    .Build();\r\n\r\n<span class=\"hljs-keyword\">var<\/span> embeddingGenerator = kernel.GetRequiredService&lt;IEmbeddingGenerator&lt;<span class=\"hljs-built_in\">string<\/span>, Embedding&lt;<span class=\"hljs-built_in\">float<\/span>&gt;&gt;&gt;();\r\n\r\n<span class=\"hljs-comment\">\/\/ Generate embeddings<\/span>\r\n<span class=\"hljs-keyword\">var<\/span> embeddings = <span class=\"hljs-keyword\">await<\/span> embeddingGenerator.GenerateAsync([\r\n    <span class=\"hljs-string\">\"Semantic Kernel is a lightweight, open-source development kit.\"<\/span>,\r\n    <span class=\"hljs-string\">\"Microsoft.Extensions.AI provides foundational AI abstractions.\"<\/span>\r\n]);\r\n\r\n<span class=\"hljs-keyword\">foreach<\/span> (<span class=\"hljs-keyword\">var<\/span> embedding <span class=\"hljs-keyword\">in<\/span> embeddings)\r\n{\r\n    Console.WriteLine(<span class=\"hljs-string\">$\"Generated embedding with <span class=\"hljs-subst\">{embedding.Vector.Length}<\/span> dimensions\"<\/span>);\r\n}\r\n<\/code><\/pre>\n<h3 id=\"working-with-azure-openai-embeddings\" class=\"code-line\" dir=\"auto\" data-line=\"114\">Working with Azure OpenAI Embeddings<\/h3>\n<pre><code class=\"code-line language-csharp\" dir=\"auto\" data-line=\"118\"><span class=\"hljs-keyword\">using<\/span> Microsoft.Extensions.AI;\r\n<span class=\"hljs-keyword\">using<\/span> Microsoft.SemanticKernel;\r\n\r\n<span class=\"hljs-meta\">#<span class=\"hljs-keyword\">pragma<\/span> <span class=\"hljs-keyword\">warning<\/span> disable SKEXP0010<\/span>\r\n\r\n<span class=\"hljs-keyword\">var<\/span> kernel = Kernel.CreateBuilder()\r\n    .AddAzureOpenAIEmbeddingGenerator(\r\n        deploymentName: <span class=\"hljs-string\">\"text-embedding-ada-002\"<\/span>,\r\n        endpoint: <span class=\"hljs-string\">\"https:\/\/your-resource.openai.azure.com\/\"<\/span>,\r\n        apiKey: <span class=\"hljs-string\">\"your-api-key\"<\/span>)\r\n    .Build();\r\n\r\n<span class=\"hljs-keyword\">var<\/span> embeddingGenerator = kernel.GetRequiredService&lt;IEmbeddingGenerator&lt;<span class=\"hljs-built_in\">string<\/span>, Embedding&lt;<span class=\"hljs-built_in\">float<\/span>&gt;&gt;&gt;();\r\n\r\n<span class=\"hljs-comment\">\/\/ Generate embeddings with custom dimensions (if supported by model)<\/span>\r\n<span class=\"hljs-keyword\">var<\/span> embeddings = <span class=\"hljs-keyword\">await<\/span> embeddingGenerator.GenerateAsync(\r\n    [<span class=\"hljs-string\">\"Custom text for embedding\"<\/span>],\r\n    <span class=\"hljs-keyword\">new<\/span> EmbeddingGenerationOptions { Dimensions = <span class=\"hljs-number\">1536<\/span> });\r\n\r\nConsole.WriteLine(<span class=\"hljs-string\">$\"Generated <span class=\"hljs-subst\">{embeddings.Count}<\/span> embeddings\"<\/span>);\r\n<\/code><\/pre>\n<h2 id=\"3-function-calling-integration\" class=\"code-line\" dir=\"auto\" data-line=\"134\">3. Function Calling Integration<\/h2>\n<p class=\"code-line\" dir=\"auto\" data-line=\"143\">One of the most powerful features is how Semantic Kernel&#8217;s function calling integrates with Microsoft.Extensions.AI. Since\u00a0<code>KernelFunction<\/code>\u00a0is now an\u00a0<code>AIFunction<\/code>, the integration is seamless.<\/p>\n<h3 id=\"creating-and-using-kernel-functions\" class=\"code-line\" dir=\"auto\" data-line=\"145\">Creating and Using Kernel Functions<\/h3>\n<pre><code class=\"code-line language-csharp\" dir=\"auto\" data-line=\"147\"><span class=\"hljs-keyword\">using<\/span> Microsoft.Extensions.AI;\r\n<span class=\"hljs-keyword\">using<\/span> Microsoft.SemanticKernel;\r\n<span class=\"hljs-keyword\">using<\/span> System.ComponentModel;\r\n\r\n<span class=\"hljs-keyword\">var<\/span> kernel = Kernel.CreateBuilder()\r\n    .AddOpenAIChatClient(<span class=\"hljs-string\">\"gpt-4o\"<\/span>, <span class=\"hljs-string\">\"your-api-key\"<\/span>)\r\n    .Build();\r\n\r\n<span class=\"hljs-comment\">\/\/ Import the function as a plugin<\/span>\r\nkernel.ImportPluginFromType&lt;WeatherPlugin&gt;();\r\n\r\n<span class=\"hljs-comment\">\/\/ Use function calling<\/span>\r\n<span class=\"hljs-keyword\">var<\/span> settings = <span class=\"hljs-keyword\">new<\/span> PromptExecutionSettings\r\n{\r\n    FunctionChoiceBehavior = FunctionChoiceBehavior.Auto()\r\n};\r\n\r\n<span class=\"hljs-keyword\">var<\/span> response = <span class=\"hljs-keyword\">await<\/span> kernel.InvokePromptAsync(\r\n    <span class=\"hljs-string\">\"What's the weather like in Seattle and what time is it?\"<\/span>,\r\n    <span class=\"hljs-keyword\">new<\/span>(settings));\r\n\r\nConsole.WriteLine(response);\r\n\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">WeatherPlugin<\/span>\r\n{\r\n    [<span class=\"hljs-meta\">KernelFunction, Description(<span class=\"hljs-string\">\"Get the current weather for a city\"<\/span>)<\/span>]\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-built_in\">string<\/span> <span class=\"hljs-title\">GetWeather<\/span>(<span class=\"hljs-params\">[Description(<span class=\"hljs-string\">\"The city name\"<\/span><\/span>)] <span class=\"hljs-built_in\">string<\/span> city)<\/span>\r\n    {\r\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-string\">$\"The weather in <span class=\"hljs-subst\">{city}<\/span> is sunny and 72\u00b0F\"<\/span>;\r\n    }\r\n\r\n    [<span class=\"hljs-meta\">KernelFunction, Description(<span class=\"hljs-string\">\"Get the current time\"<\/span>)<\/span>]\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-built_in\">string<\/span> <span class=\"hljs-title\">GetCurrentTime<\/span>()<\/span>\r\n    {\r\n        <span class=\"hljs-keyword\">return<\/span> DateTime.Now.ToString(<span class=\"hljs-string\">\"yyyy-MM-dd HH:mm:ss\"<\/span>);\r\n    }\r\n}\r\n<\/code><\/pre>\n<h3 id=\"working-with-kernelfunction-directly\" class=\"code-line\" dir=\"auto\" data-line=\"187\">Working with KernelFunction Directly<\/h3>\n<pre><code class=\"code-line language-csharp\" dir=\"auto\" data-line=\"189\"><span class=\"hljs-keyword\">var<\/span> kernel = Kernel.CreateBuilder()\r\n    .AddOpenAIChatClient(<span class=\"hljs-string\">\"gpt-4o\"<\/span>, <span class=\"hljs-string\">\"your-api-key\"<\/span>)\r\n    .Build();\r\n\r\n<span class=\"hljs-comment\">\/\/ Create a function from a method<\/span>\r\n<span class=\"hljs-keyword\">var<\/span> weatherFunction = KernelFunctionFactory.CreateFromMethod(\r\n    () =&gt; <span class=\"hljs-string\">\"Sunny and 75\u00b0F\"<\/span>,\r\n    <span class=\"hljs-string\">\"GetWeather\"<\/span>,\r\n    <span class=\"hljs-string\">\"Gets the current weather\"<\/span>);\r\n\r\n<span class=\"hljs-comment\">\/\/ KernelFunction is already an AIFunction, so you can use it directly<\/span>\r\n<span class=\"hljs-keyword\">var<\/span> chatOptions = <span class=\"hljs-keyword\">new<\/span> ChatOptions\r\n{\r\n    Tools = [weatherFunction], <span class=\"hljs-comment\">\/\/ KernelFunction works directly as AITool<\/span>\r\n    ToolMode = ChatToolMode.Auto\r\n};\r\n\r\n<span class=\"hljs-keyword\">var<\/span> chatClient = kernel.GetRequiredService&lt;IChatClient&gt;();\r\n<span class=\"hljs-keyword\">var<\/span> messages = <span class=\"hljs-keyword\">new<\/span> List&lt;ChatMessage&gt;\r\n{\r\n    <span class=\"hljs-keyword\">new<\/span>(ChatRole.User, <span class=\"hljs-string\">\"What's the weather like?\"<\/span>)\r\n};\r\n\r\n<span class=\"hljs-keyword\">var<\/span> response = <span class=\"hljs-keyword\">await<\/span> chatClient.GetResponseAsync(messages, chatOptions);\r\nConsole.WriteLine(response.Text);\r\n<\/code><\/pre>\n<h2 id=\"4-content-type-conversions\" class=\"code-line\" dir=\"auto\" data-line=\"205\">4. Content Type Conversions<\/h2>\n<h3 id=\"using-invokeasynct-with-microsoftextensionsai-types\" class=\"code-line\" dir=\"auto\" data-line=\"219\">Using\u00a0<code>InvokeAsync&lt;T&gt;<\/code>\u00a0with Microsoft.Extensions.AI Types<\/h3>\n<pre><code class=\"code-line language-csharp\" dir=\"auto\" data-line=\"221\"><span class=\"hljs-keyword\">var<\/span> kernel = Kernel.CreateBuilder()\r\n    .AddOpenAIChatClient(<span class=\"hljs-string\">\"gpt-4o\"<\/span>, <span class=\"hljs-string\">\"your-api-key\"<\/span>)\r\n    .Build();\r\n<span class=\"hljs-comment\">\/\/ Get Microsoft.Extensions.AI ChatResponse directly<\/span>\r\n<span class=\"hljs-keyword\">var<\/span> chatResponse = <span class=\"hljs-keyword\">await<\/span> kernel.InvokeAsync&lt;ChatResponse&gt;(\r\n    kernel.CreateFunctionFromPrompt(<span class=\"hljs-string\">\"Tell me a joke\"<\/span>));\r\n\r\nConsole.WriteLine(<span class=\"hljs-string\">$\"Model: <span class=\"hljs-subst\">{chatResponse.ModelId}<\/span>\"<\/span>);\r\nConsole.WriteLine(<span class=\"hljs-string\">$\"Content: <span class=\"hljs-subst\">{chatResponse.Text}<\/span>\"<\/span>);\r\n\r\n<span class=\"hljs-comment\">\/\/ Get List&lt;ChatMessage&gt; for conversation history<\/span>\r\n<span class=\"hljs-keyword\">var<\/span> message = <span class=\"hljs-keyword\">await<\/span> kernel.InvokeAsync&lt;ChatMessage&gt;(\r\n    kernel.CreateFunctionFromPrompt(<span class=\"hljs-string\">\"Start a conversation about AI\"<\/span>));\r\n\r\nConsole.WriteLine(<span class=\"hljs-string\">$\"Message Role: <span class=\"hljs-subst\">{message.Role}<\/span>\"<\/span>);\r\nConsole.WriteLine(<span class=\"hljs-string\">$\"Message Content: <span class=\"hljs-subst\">{message.Text}<\/span>\"<\/span>);\r\n\r\n<span class=\"hljs-comment\">\/\/ Get Microsoft.Extensions.AI TextContent directly<\/span>\r\n<span class=\"hljs-keyword\">var<\/span> textContent = <span class=\"hljs-keyword\">await<\/span> kernel.InvokeAsync&lt;Microsoft.Extensions.AI.TextContent&gt;(\r\n    kernel.CreateFunctionFromPrompt(<span class=\"hljs-string\">\"Start a conversation about AI\"<\/span>));\r\n\r\nConsole.WriteLine(<span class=\"hljs-string\">$\"Text Content: <span class=\"hljs-subst\">{textContent.Text}<\/span>\"<\/span>);\r\n<\/code><\/pre>\n<h2 id=\"5-service-selection-and-dependency-injection\" class=\"code-line\" dir=\"auto\" data-line=\"238\">5. Service Selection and Dependency Injection<\/h2>\n<p class=\"code-line\" dir=\"auto\" data-line=\"240\">Semantic Kernel&#8217;s service selection works seamlessly with Microsoft.Extensions.AI services.<\/p>\n<h3 id=\"multiple-chat-providers\" class=\"code-line\" dir=\"auto\" data-line=\"250\">Multiple Chat Providers<\/h3>\n<pre><code class=\"code-line language-csharp code-active-line\" dir=\"auto\" data-line=\"252\"><span class=\"hljs-keyword\">var<\/span> services = <span class=\"hljs-keyword\">new<\/span> ServiceCollection();\r\n\r\n<span class=\"hljs-comment\">\/\/ Register multiple chat clients<\/span>\r\nservices.AddOpenAIChatClient(<span class=\"hljs-string\">\"gpt-4\"<\/span>, <span class=\"hljs-string\">\"openai-key\"<\/span>, serviceId: <span class=\"hljs-string\">\"OpenAI\"<\/span>);\r\nservices.AddAzureOpenAIChatClient(\r\n    <span class=\"hljs-string\">\"gpt-4\"<\/span>,\r\n    <span class=\"hljs-string\">\"https:\/\/your-resource.openai.azure.com\/\"<\/span>,\r\n    <span class=\"hljs-string\">\"azure-key\"<\/span>,\r\n    serviceId: <span class=\"hljs-string\">\"AzureOpenAI\"<\/span>);\r\n\r\nservices.AddKernel();\r\n\r\n<span class=\"hljs-keyword\">var<\/span> serviceProvider = services.BuildServiceProvider();\r\n<span class=\"hljs-keyword\">var<\/span> kernel = serviceProvider.GetRequiredService&lt;Kernel&gt;();\r\n\r\n<span class=\"hljs-comment\">\/\/ Use specific service<\/span>\r\n<span class=\"hljs-keyword\">var<\/span> settings = <span class=\"hljs-keyword\">new<\/span> PromptExecutionSettings { ServiceId = <span class=\"hljs-string\">\"AzureOpenAI\"<\/span> };\r\n<span class=\"hljs-keyword\">var<\/span> response = <span class=\"hljs-keyword\">await<\/span> kernel.InvokePromptAsync&lt;ChatResponse&gt;(\r\n    <span class=\"hljs-string\">\"Explain machine learning\"<\/span>,\r\n    <span class=\"hljs-keyword\">new<\/span>(settings));\r\n\r\nConsole.WriteLine(<span class=\"hljs-string\">\"Model: \"<\/span> + response.ModelId);\r\nConsole.WriteLine(<span class=\"hljs-string\">\"Content: \"<\/span> + response.Text);\r\n<\/code><\/pre>\n<h2 id=\"conclusion\" class=\"code-line\" dir=\"auto\" data-line=\"578\">Conclusion<\/h2>\n<p class=\"code-line\" dir=\"auto\" data-line=\"282\">The integration between Microsoft.Extensions.AI and Semantic Kernel provides a powerful foundation for building AI applications. By leveraging both technologies, you get:<\/p>\n<ul class=\"code-line\" dir=\"auto\" data-line=\"582\">\n<li class=\"code-line\" dir=\"auto\" data-line=\"282\"><strong>Flexibility<\/strong>: Use Microsoft.Extensions.AI abstractions for simple scenarios<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"283\"><strong>Productivity<\/strong>: Add Semantic Kernel features like plugins and templates when needed<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"284\"><strong>Interoperability<\/strong>: Seamless conversion between content types and service interfaces<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"285\"><strong>Scalability<\/strong>: Easy service registration and selection for complex applications<\/li>\n<\/ul>\n<p class=\"code-line\" dir=\"auto\" data-line=\"587\">The examples in this post demonstrate practical patterns you can use in your own applications. Whether you&#8217;re building a simple chatbot, a document Q&amp;A system, or a complex workflow, the combination of Microsoft.Extensions.AI and Semantic Kernel gives you the tools you need.<\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"289\">Try out these examples in your own projects and let us know how they work for you! In the next part, we&#8217;ll dive into agent scenarios and show how these patterns scale to even more sophisticated AI applications.<\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"291\"><strong>Package<\/strong>:<\/p>\n<ul class=\"code-line\" dir=\"auto\" data-line=\"293\">\n<li class=\"code-line\" dir=\"auto\" data-line=\"293\">\n<p class=\"code-line\" dir=\"auto\" data-line=\"293\"><a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.Extensions.AI.Abstractions\/latest\" data-href=\"https:\/\/www.nuget.org\/packages\/Microsoft.Extensions.AI.Abstractions\/latest\">NuGet Gallery | Microsoft.Extensions.AI.Abstractions<\/a><\/p>\n<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"295\">\n<p class=\"code-line\" dir=\"auto\" data-line=\"295\"><a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.Extensions.AI\/latest\" data-href=\"https:\/\/www.nuget.org\/packages\/Microsoft.Extensions.AI\/latest\">NuGet Gallery | Microsoft.Extensions.AI<\/a><\/p>\n<\/li>\n<\/ul>\n<p class=\"code-line\" dir=\"auto\" data-line=\"297\"><strong>References<\/strong>:<\/p>\n<ul class=\"code-line\" dir=\"auto\" data-line=\"299\">\n<li class=\"code-line\" dir=\"auto\" data-line=\"299\">\n<p class=\"code-line\" dir=\"auto\" data-line=\"299\">Semantic Kernel\u00a0<a href=\"https:\/\/learn.microsoft.com\/en-us\/semantic-kernel\/frameworks\/agent\/?pivots=programming-language-csharp\" data-href=\"https:\/\/learn.microsoft.com\/en-us\/semantic-kernel\/frameworks\/agent\/?pivots=programming-language-csharp\">Agent Framework | Microsoft Learn<\/a><\/p>\n<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"301\">\n<p class=\"code-line\" dir=\"auto\" data-line=\"301\">Semantic Kernel\u00a0<a href=\"https:\/\/learn.microsoft.com\/en-us\/semantic-kernel\/frameworks\/process\/process-framework\" data-href=\"https:\/\/learn.microsoft.com\/en-us\/semantic-kernel\/frameworks\/process\/process-framework\">Process Framework | Microsoft Learn<\/a><\/p>\n<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"303\">\n<p class=\"code-line\" dir=\"auto\" data-line=\"303\">Semantic Kernel\u00a0<a href=\"https:\/\/github.com\/microsoft\/semantic-kernel\/tree\/main\/dotnet\/samples\" data-href=\"https:\/\/github.com\/microsoft\/semantic-kernel\/tree\/main\/dotnet\/samples\">Samples<\/a><\/p>\n<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"304\">\n<p class=\"code-line\" dir=\"auto\" data-line=\"304\">Vector Data Extensions \u2013\u00a0<a href=\"https:\/\/devblogs.microsoft.com\/semantic-kernel\/vector-data-extensions-are-now-generally-available-ga\" data-href=\"https:\/\/devblogs.microsoft.com\/semantic-kernel\/vector-data-extensions-are-now-generally-available-ga\">Blog Post<\/a><\/p>\n<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"306\">\n<p class=\"code-line\" dir=\"auto\" data-line=\"306\">Microsoft.Extensions.AI\u00a0<a href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/ai\/microsoft-extensions-ai\" data-href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/ai\/microsoft-extensions-ai\">Microsoft.Extensions.AI libraries \u2013 .NET | Microsoft Learn<\/a><\/p>\n<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"308\">\n<p class=\"code-line\" dir=\"auto\" data-line=\"308\">EShop Support with Microsoft.Extensions.AI \u2013\u00a0<a href=\"https:\/\/github.com\/dotnet\/eShopSupport\/tree\/main\" data-href=\"https:\/\/github.com\/dotnet\/eShopSupport\/tree\/main\">eShop Support<\/a><\/p>\n<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"310\">\n<p class=\"code-line\" dir=\"auto\" data-line=\"310\">.NET AI Samples \u2013\u00a0<a href=\"https:\/\/github.com\/dotnet\/ai-samples\" data-href=\"https:\/\/github.com\/dotnet\/ai-samples\">https:\/\/github.com\/dotnet\/ai-samples<\/a><\/p>\n<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>This is Part 2 of our series on integrating Microsoft.Extensions.AI with Semantic Kernel. In\u00a0Part 1, we explored the relationship between these technologies and how they complement each other. Now, let&#8217;s dive into practical examples showing how to use Microsoft.Extensions.AI abstractions with Semantic Kernel in non-agent scenarios. Getting Started with Microsoft.Extensions.AI and Semantic Kernel Before we [&hellip;]<\/p>\n","protected":false},"author":63983,"featured_media":4900,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[78,27,47,141,2,1,16],"tags":[79,112,88,48,31,6,133,9],"class_list":["post-4899","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net","category-agents","category-announcement","category-extensions-ai","category-samples","category-semantic-kernel","category-tools","tag-net","tag-net-ai-extensions","tag-agents","tag-ai","tag-c","tag-embeddings","tag-mcp","tag-semantic-kernel"],"acf":[],"blog_post_summary":"<p>This is Part 2 of our series on integrating Microsoft.Extensions.AI with Semantic Kernel. In\u00a0Part 1, we explored the relationship between these technologies and how they complement each other. Now, let&#8217;s dive into practical examples showing how to use Microsoft.Extensions.AI abstractions with Semantic Kernel in non-agent scenarios. Getting Started with Microsoft.Extensions.AI and Semantic Kernel Before we [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/agent-framework\/wp-json\/wp\/v2\/posts\/4899","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/agent-framework\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/agent-framework\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/agent-framework\/wp-json\/wp\/v2\/users\/63983"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/agent-framework\/wp-json\/wp\/v2\/comments?post=4899"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/agent-framework\/wp-json\/wp\/v2\/posts\/4899\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/agent-framework\/wp-json\/wp\/v2\/media\/4900"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/agent-framework\/wp-json\/wp\/v2\/media?parent=4899"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/agent-framework\/wp-json\/wp\/v2\/categories?post=4899"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/agent-framework\/wp-json\/wp\/v2\/tags?post=4899"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}