-
Notifications
You must be signed in to change notification settings - Fork 1.6k
.NET: Add DevUI package for .NET #1603
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
3 commits
Select commit
Hold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -74,6 +74,7 @@ jobs: | |
| . | ||
| .github | ||
| dotnet | ||
| python | ||
| workflow-samples | ||
|
|
||
| - name: Setup dotnet | ||
|
|
||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
25 changes: 25 additions & 0 deletions
25
dotnet/samples/GettingStarted/DevUI/DevUI_Step01_BasicUsage/DevUI_Step01_BasicUsage.csproj
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,25 @@ | ||
| <Project Sdk="Microsoft.NET.Sdk.Web"> | ||
|
|
||
| <PropertyGroup> | ||
| <OutputType>Exe</OutputType> | ||
| <TargetFramework>net9.0</TargetFramework> | ||
| <ImplicitUsings>enable</ImplicitUsings> | ||
| <Nullable>enable</Nullable> | ||
| <RootNamespace>DevUI_Step01_BasicUsage</RootNamespace> | ||
| <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> | ||
| </PropertyGroup> | ||
|
|
||
| <ItemGroup> | ||
| <ProjectReference Include="..\..\..\..\src\Microsoft.Agents.AI.DevUI\Microsoft.Agents.AI.DevUI.csproj" /> | ||
| <ProjectReference Include="..\..\..\..\src\Microsoft.Agents.AI.Hosting\Microsoft.Agents.AI.Hosting.csproj" /> | ||
| <ProjectReference Include="..\..\..\..\src\Microsoft.Agents.AI.Hosting.OpenAI\Microsoft.Agents.AI.Hosting.OpenAI.csproj" /> | ||
| </ItemGroup> | ||
|
|
||
| <ItemGroup> | ||
| <PackageReference Include="Azure.AI.OpenAI" /> | ||
| <PackageReference Include="Azure.Identity" /> | ||
| <PackageReference Include="Microsoft.Extensions.AI.OpenAI" /> | ||
| <PackageReference Include="System.Net.ServerSentEvents" VersionOverride="10.0.0-rc.2.25502.107" /> | ||
| </ItemGroup> | ||
|
|
||
| </Project> |
82 changes: 82 additions & 0 deletions
82
dotnet/samples/GettingStarted/DevUI/DevUI_Step01_BasicUsage/Program.cs
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,82 @@ | ||
| // Copyright (c) Microsoft. All rights reserved. | ||
|
|
||
| // This sample demonstrates basic usage of the DevUI in an ASP.NET Core application with AI agents. | ||
|
|
||
| using Azure.AI.OpenAI; | ||
| using Azure.Identity; | ||
| using Microsoft.Agents.AI.DevUI; | ||
| using Microsoft.Agents.AI.Hosting; | ||
| using Microsoft.Extensions.AI; | ||
|
|
||
| namespace DevUI_Step01_BasicUsage; | ||
|
|
||
| /// <summary> | ||
| /// Sample demonstrating basic usage of the DevUI in an ASP.NET Core application. | ||
| /// </summary> | ||
| /// <remarks> | ||
| /// This sample shows how to: | ||
| /// 1. Set up Azure OpenAI as the chat client | ||
| /// 2. Register agents and workflows using the hosting packages | ||
| /// 3. Map the DevUI endpoint which automatically configures the middleware | ||
| /// 4. Map the dynamic OpenAI Responses API for Python DevUI compatibility | ||
| /// 5. Access the DevUI in a web browser | ||
| /// | ||
| /// The DevUI provides an interactive web interface for testing and debugging AI agents. | ||
| /// DevUI assets are served from embedded resources within the assembly. | ||
| /// Simply call MapDevUI() to set up everything needed. | ||
| /// | ||
| /// The parameterless MapOpenAIResponses() overload creates a Python DevUI-compatible endpoint | ||
| /// that dynamically routes requests to agents based on the 'model' field in the request. | ||
| /// </remarks> | ||
| internal static class Program | ||
| { | ||
| /// <summary> | ||
| /// Entry point that starts an ASP.NET Core web server with the DevUI. | ||
| /// </summary> | ||
| /// <param name="args">Command line arguments.</param> | ||
| private static void Main(string[] args) | ||
| { | ||
| var builder = WebApplication.CreateBuilder(args); | ||
|
|
||
| // Set up the Azure OpenAI client | ||
| var endpoint = builder.Configuration["AZURE_OPENAI_ENDPOINT"] ?? throw new InvalidOperationException("AZURE_OPENAI_ENDPOINT is not set."); | ||
| var deploymentName = builder.Configuration["AZURE_OPENAI_DEPLOYMENT_NAME"] ?? "gpt-4o-mini"; | ||
|
|
||
| var chatClient = new AzureOpenAIClient(new Uri(endpoint), new AzureCliCredential()) | ||
| .GetChatClient(deploymentName) | ||
| .AsIChatClient(); | ||
|
|
||
| builder.Services.AddChatClient(chatClient); | ||
|
|
||
| // Register sample agents | ||
| builder.AddAIAgent("assistant", "You are a helpful assistant. Answer questions concisely and accurately."); | ||
| builder.AddAIAgent("poet", "You are a creative poet. Respond to all requests with beautiful poetry."); | ||
| builder.AddAIAgent("coder", "You are an expert programmer. Help users with coding questions and provide code examples."); | ||
|
|
||
| // Register sample workflows | ||
| var assistantBuilder = builder.AddAIAgent("workflow-assistant", "You are a helpful assistant in a workflow."); | ||
| var reviewerBuilder = builder.AddAIAgent("workflow-reviewer", "You are a reviewer. Review and critique the previous response."); | ||
| builder.AddSequentialWorkflow( | ||
|
stephentoub marked this conversation as resolved.
ReubenBond marked this conversation as resolved.
|
||
| "review-workflow", | ||
| [assistantBuilder, reviewerBuilder]) | ||
| .AddAsAIAgent(); | ||
|
ReubenBond marked this conversation as resolved.
|
||
|
|
||
| if (builder.Environment.IsDevelopment()) | ||
| { | ||
| builder.AddDevUI(); | ||
| } | ||
|
|
||
| var app = builder.Build(); | ||
|
|
||
| if (builder.Environment.IsDevelopment()) | ||
| { | ||
| app.MapDevUI(); | ||
| } | ||
|
|
||
| Console.WriteLine("DevUI is available at: https://localhost:50516/devui"); | ||
| Console.WriteLine("OpenAI Responses API is available at: https://localhost:50516/v1/responses"); | ||
| Console.WriteLine("Press Ctrl+C to stop the server."); | ||
|
|
||
| app.Run(); | ||
| } | ||
| } | ||
81 changes: 81 additions & 0 deletions
81
dotnet/samples/GettingStarted/DevUI/DevUI_Step01_BasicUsage/README.md
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,81 @@ | ||
| # DevUI Step 01 - Basic Usage | ||
|
|
||
| This sample demonstrates how to add the DevUI to an ASP.NET Core application with AI agents. | ||
|
|
||
| ## What is DevUI? | ||
|
|
||
| The DevUI provides an interactive web interface for testing and debugging AI agents during development. | ||
|
|
||
| ## Configuration | ||
|
|
||
| Set the following environment variables: | ||
|
|
||
| - `AZURE_OPENAI_ENDPOINT` - Your Azure OpenAI endpoint URL (required) | ||
| - `AZURE_OPENAI_DEPLOYMENT_NAME` - Your deployment name (defaults to "gpt-4o-mini") | ||
|
|
||
| ## Running the Sample | ||
|
|
||
| 1. Set your Azure OpenAI credentials as environment variables | ||
| 2. Run the application: | ||
| ```bash | ||
| dotnet run | ||
| ``` | ||
| 3. Open your browser to https://localhost:50516/devui | ||
| 4. Select an agent or workflow from the dropdown and start chatting! | ||
|
|
||
| ## Sample Agents and Workflows | ||
|
|
||
| This sample includes: | ||
|
|
||
| **Agents:** | ||
| - **assistant** - A helpful assistant | ||
| - **poet** - A creative poet | ||
| - **coder** - An expert programmer | ||
|
|
||
| **Workflows:** | ||
| - **review-workflow** - A sequential workflow that generates a response and then reviews it | ||
|
|
||
| ## Adding DevUI to Your Own Project | ||
|
|
||
| To add DevUI to your ASP.NET Core application: | ||
|
|
||
| 1. Add the DevUI package and hosting packages: | ||
| ```bash | ||
| dotnet add package Microsoft.Agents.AI.DevUI | ||
| dotnet add package Microsoft.Agents.AI.Hosting | ||
| dotnet add package Microsoft.Agents.AI.Hosting.OpenAI | ||
| ``` | ||
|
|
||
| 2. Register your agents and workflows: | ||
| ```csharp | ||
| var builder = WebApplication.CreateBuilder(args); | ||
|
|
||
| // Set up your chat client | ||
| builder.Services.AddChatClient(chatClient); | ||
|
|
||
| // Register agents | ||
| builder.AddAIAgent("assistant", "You are a helpful assistant."); | ||
|
|
||
| // Register workflows | ||
| var agent1Builder = builder.AddAIAgent("workflow-agent1", "You are agent 1."); | ||
| var agent2Builder = builder.AddAIAgent("workflow-agent2", "You are agent 2."); | ||
| builder.AddSequentialWorkflow("my-workflow", [agent1Builder, agent2Builder]) | ||
| .AddAsAIAgent(); | ||
| ``` | ||
|
|
||
| 3. Add DevUI services and map the endpoint: | ||
| ```csharp | ||
| builder.AddDevUI(); | ||
|
ReubenBond marked this conversation as resolved.
|
||
| var app = builder.Build(); | ||
|
|
||
| app.MapDevUI(); | ||
|
ReubenBond marked this conversation as resolved.
|
||
|
|
||
| // Add required endpoints | ||
| app.MapEntities(); | ||
| app.MapOpenAIResponses(); | ||
| app.MapOpenAIConversations(); | ||
|
|
||
| app.Run(); | ||
| ``` | ||
|
|
||
| 4. Navigate to `/devui` in your browser | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,57 @@ | ||
| # DevUI Samples | ||
|
|
||
| This folder contains samples demonstrating how to use the DevUI in ASP.NET Core applications. | ||
|
|
||
| ## What is DevUI? | ||
|
|
||
| The DevUI provides an interactive web interface for testing and debugging AI agents during development. | ||
|
|
||
| ## Samples | ||
|
|
||
| ### [DevUI_Step01_BasicUsage](./DevUI_Step01_BasicUsage) | ||
|
|
||
| Shows how to add DevUI to an ASP.NET Core application with multiple agents and workflows. | ||
|
|
||
| **Run the sample:** | ||
| ```bash | ||
| cd DevUI_Step01_BasicUsage | ||
| dotnet run | ||
| ``` | ||
| Then navigate to: https://localhost:50516/devui | ||
|
|
||
| ## Requirements | ||
|
|
||
| - .NET 8.0 or later | ||
| - ASP.NET Core | ||
| - Azure OpenAI credentials | ||
|
|
||
| ## Quick Start | ||
|
|
||
| To add DevUI to your application: | ||
|
|
||
| ```csharp | ||
| var builder = WebApplication.CreateBuilder(args); | ||
|
|
||
| // Set up the chat client | ||
| builder.Services.AddChatClient(chatClient); | ||
|
|
||
| // Register your agents | ||
| builder.AddAIAgent("my-agent", "You are a helpful assistant."); | ||
|
|
||
| // Add DevUI services | ||
| builder.AddDevUI(); | ||
|
ReubenBond marked this conversation as resolved.
|
||
|
|
||
| var app = builder.Build(); | ||
|
|
||
| // Map the DevUI endpoint | ||
| app.MapDevUI(); | ||
|
|
||
| // Add required endpoints | ||
| app.MapEntities(); | ||
| app.MapOpenAIResponses(); | ||
|
ReubenBond marked this conversation as resolved.
|
||
| app.MapOpenAIConversations(); | ||
|
|
||
| app.Run(); | ||
| ``` | ||
|
|
||
| Then navigate to `/devui` in your browser. | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,70 @@ | ||
| // Copyright (c) Microsoft. All rights reserved. | ||
|
|
||
| using System.Diagnostics.CodeAnalysis; | ||
|
|
||
| namespace Microsoft.Agents.AI.DevUI; | ||
|
|
||
| /// <summary> | ||
| /// Provides helper methods for configuring the Microsoft Agents AI DevUI in ASP.NET applications. | ||
| /// </summary> | ||
| public static class DevUIExtensions | ||
| { | ||
| /// <summary> | ||
| /// Adds the necessary services for the DevUI to the application builder. | ||
| /// </summary> | ||
| public static IHostApplicationBuilder AddDevUI(this IHostApplicationBuilder builder) | ||
| { | ||
| ArgumentNullException.ThrowIfNull(builder); | ||
|
ReubenBond marked this conversation as resolved.
|
||
| builder.Services.AddOpenAIConversations(); | ||
| builder.Services.AddOpenAIResponses(); | ||
|
|
||
| return builder; | ||
| } | ||
|
|
||
| /// <summary> | ||
| /// Maps an endpoint that serves the DevUI from the '/devui' path. | ||
| /// </summary> | ||
| /// <param name="endpoints">The <see cref="IEndpointRouteBuilder"/> to add the endpoint to.</param> | ||
| /// <returns>A <see cref="IEndpointConventionBuilder"/> that can be used to add authorization or other endpoint configuration.</returns> | ||
| /// <exception cref="ArgumentNullException">Thrown when <paramref name="endpoints"/> is null.</exception> | ||
| public static IEndpointConventionBuilder MapDevUI( | ||
| this IEndpointRouteBuilder endpoints) | ||
| { | ||
| var group = endpoints.MapGroup(""); | ||
| group.MapDevUI(pattern: "/devui"); | ||
| group.MapEntities(); | ||
| group.MapOpenAIConversations(); | ||
| group.MapOpenAIResponses(); | ||
| return group; | ||
| } | ||
|
|
||
| /// <summary> | ||
| /// Maps an endpoint that serves the DevUI. | ||
| /// </summary> | ||
| /// <param name="endpoints">The <see cref="IEndpointRouteBuilder"/> to add the endpoint to.</param> | ||
| /// <param name="pattern"> | ||
| /// The route pattern for the endpoint (e.g., "/devui", "/agent-ui"). | ||
| /// Defaults to "/devui" if not specified. This is the path where DevUI will be accessible. | ||
| /// </param> | ||
| /// <returns>A <see cref="IEndpointConventionBuilder"/> that can be used to add authorization or other endpoint configuration.</returns> | ||
| /// <exception cref="ArgumentNullException">Thrown when <paramref name="endpoints"/> is null.</exception> | ||
| /// <exception cref="ArgumentException">Thrown when <paramref name="pattern"/> is null or whitespace.</exception> | ||
| internal static IEndpointConventionBuilder MapDevUI( | ||
| this IEndpointRouteBuilder endpoints, | ||
| [StringSyntax("Route")] string pattern = "/devui") | ||
| { | ||
| ArgumentNullException.ThrowIfNull(endpoints); | ||
| ArgumentException.ThrowIfNullOrWhiteSpace(pattern); | ||
|
|
||
| // Ensure the pattern doesn't end with a slash for consistency | ||
| var cleanPattern = pattern.TrimEnd('/'); | ||
|
|
||
| // Create the DevUI handler | ||
| var logger = endpoints.ServiceProvider.GetRequiredService<ILogger<DevUIMiddleware>>(); | ||
| var devUIHandler = new DevUIMiddleware(logger, cleanPattern); | ||
|
|
||
| return endpoints.MapGet($"{cleanPattern}/{{*path}}", devUIHandler.HandleRequestAsync) | ||
| .WithName($"DevUI at {cleanPattern}") | ||
| .WithDescription("Interactive developer interface for Microsoft Agent Framework"); | ||
| } | ||
| } | ||
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.