Build an AI chat app with .NET
In this quickstart, you learn how to create a conversational .NET console chat app using an OpenAI or Azure OpenAI model. The app uses the Microsoft.Extensions.AI
library so you can write code using AI abstractions rather than a specific SDK. AI abstractions enable you to change the underlying AI model with minimal code changes.
Note
The Microsoft.Extensions.AI
library is currently in Preview.
Prerequisites
- .NET 8.0 SDK - Install the .NET 8.0 SDK.
- An API key from OpenAI so you can run this sample.
- On Windows, PowerShell
v7+
is required. To validate your version, runpwsh
in a terminal. It should return the current version. If it returns an error, execute the following command:dotnet tool update --global PowerShell
.
Prerequisites
- .NET 8 SDK - Install the .NET 8 SDK.
- An Azure subscription - Create one for free.
- Access to Azure OpenAI service.
- Azure Developer CLI (Optional) - Install or update the Azure Developer CLI.
Note
You can also use Semantic Kernel to accomplish the tasks in this article. Semantic Kernel is a lightweight, open-source SDK that lets you build AI agents and integrate the latest AI models into your .NET apps.
Clone the sample repository
You can create your own app using the steps in the sections ahead, or you can clone the GitHub repository that contains the completed sample apps for all of the quickstarts. If you plan to use Azure OpenAI, the sample repo is also structured as an Azure Developer CLI template that can provision an Azure OpenAI resource for you.
git clone https://github.com/dotnet/ai-samples.git
Create the app
Complete the following steps to create a .NET console app to connect to an AI model.
In an empty directory on your computer, use the
dotnet new
command to create a new console app:dotnet new console -o ChatAppAI
Change directory into the app folder:
cd ChatAppAI
Install the required packages:
dotnet add package Azure.Identity dotnet add package Azure.AI.OpenAI dotnet add package Microsoft.Extensions.AI.OpenAI dotnet add package Microsoft.Extensions.Configuration dotnet add package Microsoft.Extensions.Configuration.UserSecrets
dotnet add package OpenAI dotnet add package Microsoft.Extensions.AI.OpenAI dotnet add package Microsoft.Extensions.Configuration dotnet add package Microsoft.Extensions.Configuration.UserSecrets
Open the app in Visual Studio Code (or your editor of choice).
code .
Create the AI service
The sample GitHub repository is structured as an Azure Developer CLI (azd
) template, which azd
can use to provision the Azure OpenAI service and model for you.
From a terminal or command prompt, navigate to the
src\quickstarts\azure-openai
directory of the sample repo.Run the
azd up
command to provision the Azure OpenAI resources. It might take several minutes to create the Azure OpenAI service and deploy the model.azd up
azd
also configures the required user secrets for the sample app, such as the Azure OpenAI endpoint and model name.
Configure the app
Navigate to the root of your .NET project from a terminal or command prompt.
Run the following commands to configure your OpenAI API key as a secret for the sample app:
dotnet user-secrets init dotnet user-secrets set OpenAIKey <your-openai-key> dotnet user-secrets set ModelName <your-openai-model-name>
Add the app code
The app uses the Microsoft.Extensions.AI
package to send and receive requests to the AI model and is designed to provide users with information about hiking trails.
In the Program.cs file, add the following code to connect and authenticate to the AI model.
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.AI; using Azure.AI.OpenAI; using Azure.Identity; var config = new ConfigurationBuilder().AddUserSecrets<Program>().Build(); string endpoint = config["AZURE_OPENAI_ENDPOINT"]; string deployment = config["AZURE_OPENAI_GPT_NAME"]; IChatClient chatClient = new AzureOpenAIClient(new Uri(endpoint), new DefaultAzureCredential()) .AsChatClient(deployment);
Note
DefaultAzureCredential searches for authentication credentials from your local tooling. If you aren't using the
azd
template to provision the Azure OpenAI resource, you'll need to assign theAzure AI Developer
role to the account you used to sign in to Visual Studio or the Azure CLI. For more information, see Authenticate to Azure AI services with .NET.using Microsoft.Extensions.Configuration; using Microsoft.Extensions.AI; using OpenAI; var config = new ConfigurationBuilder().AddUserSecrets<Program>().Build(); string model = config["ModelName"]; string key = config["OpenAIKey"]; // Create the IChatClient IChatClient chatClient = new OpenAIClient(key).AsChatClient(model);
Create a system prompt to provide the AI model with initial role context and instructions about hiking recommendations:
// Start the conversation with context for the AI model List<ChatMessage> chatHistory = new() { new ChatMessage(ChatRole.System, """ You are a friendly hiking enthusiast who helps people discover fun hikes in their area. You introduce yourself when first saying hello. When helping people out, you always ask them for this information to inform the hiking recommendation you provide: 1. The location where they would like to hike 2. What hiking intensity they are looking for You will then provide three suggestions for nearby hikes that vary in length after you get that information. You will also share an interesting fact about the local nature on the hikes when making a recommendation. At the end of your response, ask if there is anything else you can help with. """) };
Create a conversational loop that accepts an input prompt from the user, sends the prompt to the model, and prints the response completion:
while (true) { // Get user prompt and add to chat history Console.WriteLine("Your prompt:"); var userPrompt = Console.ReadLine(); chatHistory.Add(new ChatMessage(ChatRole.User, userPrompt)); // Stream the AI response and add to chat history Console.WriteLine("AI Response:"); var response = ""; await foreach (var item in chatClient.CompleteStreamingAsync(chatHistory)) { Console.Write(item.Text); response += item.Text; } chatHistory.Add(new ChatMessage(ChatRole.Assistant, response)); Console.WriteLine(); }
Use the
dotnet run
command to run the app:dotnet run
The app prints out the completion response from the AI model. Send additional follow up prompts and ask other questions to experiment with the AI chat functionality.
Clean up resources
When you no longer need the sample application or resources, remove the corresponding deployment and all resources.
azd down