Skip to content

Commit fe2e749

Browse files
committed
Upgrade to .NET 9.0 and update Azure SDK packages
DETAILS - Upgraded project from .NET 8.0 to .NET 9.0 across multiple files, including `Directory.Packages.props`, `SharedWebComponents.csproj`, `MinimalApi.csproj`, `ClientApp.csproj`, and various test projects. - Updated several Azure-related packages to newer versions, such as `Azure.AI.OpenAI`, `Azure.Extensions.AspNetCore.Configuration.Secrets`, and `Azure.Identity`. - Modified the Dockerfile to use .NET 9.0 base images for both runtime and build stages. - Replaced `OpenAIClient` with `AzureOpenAIClient` for improved functionality with Azure OpenAI services. - Updated methods for generating embeddings and chat completions to align with new client methods. - Adjusted test files to ensure compatibility with the updated framework and client. - Added XML configuration for SDK resolver settings to manage SDK versions and paths.
1 parent fd451e3 commit fe2e749

18 files changed

+91
-115
lines changed

app/Directory.Packages.props

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
</PropertyGroup>
66
<ItemGroup>
77
<PackageVersion Include="Azure.AI.FormRecognizer" Version="4.1.0" />
8-
<PackageVersion Include="Azure.AI.OpenAI" Version="1.0.0-beta.17" />
9-
<PackageVersion Include="Azure.Extensions.AspNetCore.Configuration.Secrets" Version="1.3.2" />
10-
<PackageVersion Include="Azure.Identity" Version="1.12.0" />
8+
<PackageVersion Include="Azure.AI.OpenAI" Version="2.2.0-beta.1" />
9+
<PackageVersion Include="Azure.Extensions.AspNetCore.Configuration.Secrets" Version="1.4.0" />
10+
<PackageVersion Include="Azure.Identity" Version="1.13.2" />
1111
<PackageVersion Include="Azure.Search.Documents" Version="11.6.0" />
12-
<PackageVersion Include="Azure.Storage.Blobs" Version="12.21.2" />
12+
<PackageVersion Include="Azure.Storage.Blobs" Version="12.23.0" />
1313
<PackageVersion Include="Azure.Storage.Files.Shares" Version="12.19.1" />
1414
<PackageVersion Include="Azure.Storage.Queues" Version="12.19.1" />
1515
<PackageVersion Include="Blazor.LocalStorage.WebAssembly" Version="8.0.0" />
@@ -20,32 +20,31 @@
2020
<PackageVersion Include="CommunityToolkit.Maui" Version="7.0.1" />
2121
<PackageVersion Include="coverlet.collector" Version="6.0.2" />
2222
<PackageVersion Include="Markdig" Version="0.37.0" />
23-
<PackageVersion Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.22.0" />
24-
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="8.0.8" />
25-
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="8.0.8" />
26-
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly" Version="8.0.8" />
27-
<PackageVersion Include="Microsoft.AspNetCore.Components.Web" Version="8.0.8" />
23+
<PackageVersion Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.23.0" />
24+
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="9.0.2" />
25+
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="9.0.2" />
26+
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly" Version="9.0.2" />
27+
<PackageVersion Include="Microsoft.AspNetCore.Components.Web" Version="9.0.2" />
2828
<PackageVersion Include="Microsoft.AspNetCore.Components.WebView.Maui" Version="$(MauiVersion)" />
2929
<PackageVersion Include="Microsoft.Azure.Functions.Worker.Extensions.Storage" Version="6.6.0" />
3030
<PackageVersion Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.17.4" />
3131
<PackageVersion Include="Microsoft.Azure.Functions.Worker" Version="1.23.0" />
3232
<PackageVersion Include="Microsoft.Extensions.Azure" Version="1.7.5" />
33-
<PackageVersion Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="8.0.8" />
33+
<PackageVersion Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="9.0.2" />
3434
<PackageVersion Include="Microsoft.Extensions.Configuration.UserSecrets" Version="8.0.0" />
3535
<PackageVersion Include="Microsoft.Extensions.FileSystemGlobbing" Version="8.0.0" />
36-
<PackageVersion Include="Microsoft.Extensions.Http" Version="8.0.0" />
36+
<PackageVersion Include="Microsoft.Extensions.Http" Version="9.0.2" />
3737
<PackageVersion Include="Microsoft.Extensions.Logging.Debug" Version="8.0.0" />
38-
<PackageVersion Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="8.0.0" />
38+
<PackageVersion Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="9.0.2" />
3939
<PackageVersion Include="Microsoft.Maui.Controls" Version="$(MauiVersion)" />
4040
<PackageVersion Include="Microsoft.Maui.Controls.Compatibility" Version="$(MauiVersion)" />
41-
<PackageVersion Include="Microsoft.ML" Version="3.0.1" />
41+
<PackageVersion Include="Microsoft.ML" Version="4.0.1" />
4242
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.11.0" />
43-
<PackageVersion Include="Microsoft.SemanticKernel" Version="1.17.2" />
44-
<PackageVersion Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.21.0" />
43+
<PackageVersion Include="Microsoft.SemanticKernel" Version="1.38.0" />
4544
<PackageVersion Include="MudBlazor" Version="6.11.1" />
4645
<PackageVersion Include="PdfSharpCore" Version="1.3.65" />
4746
<PackageVersion Include="Pinecone.NET" Version="2.1.1" />
48-
<PackageVersion Include="Swashbuckle.AspNetCore" Version="6.7.3" />
47+
<PackageVersion Include="Swashbuckle.AspNetCore" Version="7.2.0" />
4948
<PackageVersion Include="System.CommandLine" Version="2.0.0-beta4.22272.1" />
5049
<PackageVersion Include="System.Linq.Async" Version="6.0.1" />
5150
<PackageVersion Include="xunit.runner.visualstudio" Version="2.8.2" />

app/Dockerfile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.
22

3-
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
3+
FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base
44
WORKDIR /app
55
EXPOSE 8080
66
EXPOSE 443
77

8-
FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0 AS build
8+
FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:9.0 AS build
99
WORKDIR /src
1010
COPY ["Directory.Build.props", "."]
1111
COPY ["Directory.Packages.props", "."]
Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
11
<Project Sdk="Microsoft.NET.Sdk.Razor">
2-
32
<PropertyGroup>
4-
<TargetFramework>net8.0</TargetFramework>
3+
<TargetFramework>net9.0</TargetFramework>
54
<Nullable>enable</Nullable>
65
<ImplicitUsings>enable</ImplicitUsings>
76
</PropertyGroup>
8-
97
<ItemGroup>
108
<SupportedPlatform Include="browser" />
119
</ItemGroup>
12-
1310
<ItemGroup>
1411
<PackageReference Include="Blazor.LocalStorage.WebAssembly" />
1512
<PackageReference Include="Blazor.SessionStorage.WebAssembly" />
@@ -21,13 +18,10 @@
2118
<PackageReference Include="MudBlazor" />
2219
<PackageReference Include="System.Linq.Async" />
2320
</ItemGroup>
24-
2521
<ItemGroup>
2622
<Folder Include="wwwroot\" />
2723
</ItemGroup>
28-
2924
<ItemGroup>
3025
<ProjectReference Include="..\shared\Shared\Shared.csproj" />
3126
</ItemGroup>
32-
33-
</Project>
27+
</Project>
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3+
<PropertyGroup>
4+
<DOTNET_EXPERIMENTAL_HOST_PATH>C:\Program Files\dotnet\dotnet.exe</DOTNET_EXPERIMENTAL_HOST_PATH>
5+
<SdkResolverMSBuildTaskHostRuntimeVersion>9.0.2</SdkResolverMSBuildTaskHostRuntimeVersion>
6+
</PropertyGroup>
7+
</Project>

app/backend/Extensions/ServiceCollectionExtensions.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
// Copyright (c) Microsoft. All rights reserved.
22

3+
using OpenAI;
4+
35
namespace MinimalApi.Extensions;
46

57
internal static class ServiceCollectionExtensions
@@ -61,7 +63,7 @@ internal static IServiceCollection AddAzureServices(this IServiceCollection serv
6163
var azureOpenAiServiceEndpoint = config["AzureOpenAiServiceEndpoint"];
6264
ArgumentNullException.ThrowIfNullOrEmpty(azureOpenAiServiceEndpoint);
6365

64-
var openAIClient = new OpenAIClient(new Uri(azureOpenAiServiceEndpoint), s_azureCredential);
66+
var openAIClient = new AzureOpenAIClient(new Uri(azureOpenAiServiceEndpoint), s_azureCredential);
6567

6668
return openAIClient;
6769
}

app/backend/Extensions/WebApplicationExtensions.cs

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
// Copyright (c) Microsoft. All rights reserved.
22

3+
using OpenAI;
4+
35
namespace MinimalApi.Extensions;
46

57
internal static class WebApplicationExtensions
@@ -43,29 +45,26 @@ private static async IAsyncEnumerable<ChatChunkResponse> OnPostChatPromptAsync(
4345
[EnumeratorCancellation] CancellationToken cancellationToken)
4446
{
4547
var deploymentId = config["AZURE_OPENAI_CHATGPT_DEPLOYMENT"];
46-
var response = await client.GetChatCompletionsStreamingAsync(
47-
new ChatCompletionsOptions
48-
{
49-
DeploymentName = deploymentId,
50-
Messages =
51-
{
52-
new ChatRequestSystemMessage("""
48+
var chatClient = client.GetChatClient(deploymentId);
49+
var messages = new List<OpenAI.Chat.ChatMessage>
50+
{
51+
new OpenAI.Chat.SystemChatMessage("""
5352
You're an AI assistant for developers, helping them write code more efficiently.
5453
You're name is **Blazor 📎 Clippy** and you're an expert Blazor developer.
5554
You're also an expert in ASP.NET Core, C#, TypeScript, and even JavaScript.
5655
You will always reply with a Markdown formatted response.
5756
"""),
58-
new ChatRequestUserMessage("What's your name?"),
59-
new ChatRequestAssistantMessage("Hi, my name is **Blazor 📎 Clippy**! Nice to meet you."),
60-
new ChatRequestUserMessage(prompt.Prompt)
61-
}
62-
}, cancellationToken);
57+
new OpenAI.Chat.SystemChatMessage(@"What's your name?"),
58+
new OpenAI.Chat.AssistantChatMessage(@"Hi, my name is **Blazor 📎 Clippy**! Nice to meet you."),
59+
new OpenAI.Chat.UserChatMessage(prompt.Prompt)
60+
};
61+
var response = chatClient.CompleteChatStreamingAsync(messages: messages, cancellationToken: cancellationToken);
6362

6463
await foreach (var choice in response.WithCancellation(cancellationToken))
6564
{
66-
if (choice.ContentUpdate is { Length: > 0 })
65+
if (choice.ContentUpdate is { Count: > 0 })
6766
{
68-
yield return new ChatChunkResponse(choice.ContentUpdate.Length, choice.ContentUpdate);
67+
yield return new ChatChunkResponse(choice.ContentUpdate.Count, choice.ContentUpdate.ToString()!);
6968
}
7069
}
7170
}
@@ -146,14 +145,21 @@ private static async Task<IResult> OnPostImagePromptAsync(
146145
IConfiguration config,
147146
CancellationToken cancellationToken)
148147
{
149-
var result = await client.GetImageGenerationsAsync(new ImageGenerationOptions
150-
{
151-
Prompt = prompt.Prompt,
152-
},
153-
cancellationToken);
148+
//ToDo: update image generation model name
149+
var imageGenerationModelName = config["AZURE_OPENAI_IMAGE_DEPLOYMENT"] ?? "dall-e-3";
150+
Console.WriteLine(@$"===============================
151+
Image generation model name: {imageGenerationModelName}
152+
=============================================");
153+
var imageClient = client.GetImageClient(imageGenerationModelName);
154+
155+
var result = await imageClient.GenerateImageAsync(prompt.Prompt);
154156

155-
var imageUrls = result.Value.Data.Select(i => i.Url).ToList();
156-
var response = new ImageResponse(result.Value.Created, imageUrls);
157+
var imageUrls = new List<Uri>
158+
{
159+
result.Value.ImageUri
160+
};
161+
//var response = new ImageResponse(result.Value..Created, imageUrls);
162+
var response = new ImageResponse(DateTime.Now, imageUrls);
157163

158164
return TypedResults.Ok(response);
159165
}

app/backend/MinimalApi.csproj

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
<Project Sdk="Microsoft.NET.Sdk.Web">
2-
32
<PropertyGroup>
4-
<TargetFramework>net8.0</TargetFramework>
3+
<TargetFramework>net9.0</TargetFramework>
54
<Nullable>enable</Nullable>
65
<ImplicitUsings>enable</ImplicitUsings>
76
<LangVersion>preview</LangVersion>
@@ -11,7 +10,6 @@
1110
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
1211
<PublishRelease>true</PublishRelease>
1312
</PropertyGroup>
14-
1513
<ItemGroup>
1614
<PackageReference Include="Azure.AI.FormRecognizer" />
1715
<PackageReference Include="Azure.AI.OpenAI" />
@@ -24,14 +22,11 @@
2422
<PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" />
2523
<PackageReference Include="Microsoft.ML" />
2624
<PackageReference Include="Microsoft.SemanticKernel" />
27-
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" />
2825
<PackageReference Include="PdfSharpCore" />
2926
<PackageReference Include="Swashbuckle.AspNetCore" />
3027
</ItemGroup>
31-
3228
<ItemGroup>
3329
<ProjectReference Include="..\frontend\ClientApp.csproj" />
3430
<ProjectReference Include="..\shared\Shared\Shared.csproj" />
3531
</ItemGroup>
36-
37-
</Project>
32+
</Project>

app/backend/Services/ReadRetrieveReadChatService.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using Microsoft.SemanticKernel.ChatCompletion;
55
using Microsoft.SemanticKernel.Connectors.OpenAI;
66
using Microsoft.SemanticKernel.Embeddings;
7+
using OpenAI;
78

89
namespace MinimalApi.Services;
910
#pragma warning disable SKEXP0011 // Mark members as static
@@ -84,7 +85,7 @@ public async Task<ChatAppResponse> ReplyAsync(
8485
string? query = null;
8586
if (overrides?.RetrievalMode != RetrievalMode.Vector)
8687
{
87-
var getQueryChat = new ChatHistory(@"You are a helpful AI assistant, generate search query for followup question.
88+
var getQueryChat = new ChatHistory(@"You are a helpful AI assistant, generate search query for follow up question.
8889
Make your respond simple and precise. Return the query only, do not return any other text.
8990
e.g.
9091
Northwind Health Plus AND standard plan.

app/frontend/ClientApp.csproj

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">
2-
32
<PropertyGroup>
4-
<TargetFramework>net8.0</TargetFramework>
3+
<TargetFramework>net9.0</TargetFramework>
54
<Nullable>enable</Nullable>
65
<ImplicitUsings>enable</ImplicitUsings>
76
<LangVersion>preview</LangVersion>
87
<ServiceWorkerAssetsManifest>service-worker-assets.js</ServiceWorkerAssetsManifest>
98
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
109
<UserSecretsId>48daa172-8fe4-4b81-94b2-0d5a3a5ad30e</UserSecretsId>
1110
</PropertyGroup>
12-
1311
<ItemGroup>
1412
<PackageReference Include="Blazor.LocalStorage.WebAssembly" />
1513
<PackageReference Include="Blazor.SessionStorage.WebAssembly" />
@@ -19,14 +17,11 @@
1917
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" />
2018
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" />
2119
</ItemGroup>
22-
2320
<ItemGroup>
2421
<ProjectReference Include="..\SharedWebComponents\SharedWebComponents.csproj" />
2522
<ProjectReference Include="..\shared\Shared\Shared.csproj" />
2623
</ItemGroup>
27-
2824
<ItemGroup>
2925
<ServiceWorker Include="wwwroot\service-worker.js" PublishedContent="wwwroot\service-worker.published.js" />
3026
</ItemGroup>
31-
32-
</Project>
27+
</Project>

app/functions/EmbedFunctions/Program.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Copyright (c) Microsoft. All rights reserved.
22

33
using Azure.AI.OpenAI;
4+
using OpenAI;
45

56
var host = new HostBuilder()
67
.ConfigureServices(services =>
@@ -70,7 +71,7 @@ uri is not null
7071
{
7172
var openaiEndPoint = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT") ?? throw new ArgumentNullException("AZURE_OPENAI_ENDPOINT is null");
7273
embeddingModelName = Environment.GetEnvironmentVariable("AZURE_OPENAI_EMBEDDING_DEPLOYMENT") ?? throw new ArgumentNullException("AZURE_OPENAI_EMBEDDING_DEPLOYMENT is null");
73-
openAIClient = new OpenAIClient(new Uri(openaiEndPoint), new DefaultAzureCredential());
74+
openAIClient = new AzureOpenAIClient(new Uri(openaiEndPoint), new DefaultAzureCredential());
7475
}
7576
else
7677
{

0 commit comments

Comments
 (0)