From 3eda97aac6ea7fd372670a94d8db06bbfe67f748 Mon Sep 17 00:00:00 2001 From: Chris Gillum Date: Tue, 11 Nov 2025 17:30:55 -0800 Subject: [PATCH] .NET: [Feature Branch] Introduce Azure OpenAI config for .NET pipeline (#2106) Also fixes an issue where we were trying to start docker containers for integration tests on Windows, which doesn't work. Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .github/workflows/dotnet-build-and-test.yml | 9 ++++++++- .../TestHelper.cs | 15 ++++++--------- .../SamplesValidation.cs | 12 ++++-------- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/.github/workflows/dotnet-build-and-test.yml b/.github/workflows/dotnet-build-and-test.yml index 3cb7dfab74..5c3997523b 100644 --- a/.github/workflows/dotnet-build-and-test.yml +++ b/.github/workflows/dotnet-build-and-test.yml @@ -150,10 +150,14 @@ jobs: tenant-id: ${{ secrets.AZURE_TENANT_ID }} subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + # This setup action is required for both Durable Task and Azure Functions integration tests. + # We only run it on Ubuntu since the Durable Task and Azure Functions features are not available + # on .NET Framework (net472) which is what we use the Windows runner for. - name: Set up Durable Task and Azure Functions Integration Test Emulators - if: github.event_name != 'pull_request' && matrix.integration-tests + if: github.event_name != 'pull_request' && matrix.integration-tests && matrix.os == 'ubuntu-latest' uses: ./.github/actions/azure-functions-integration-setup id: azure-functions-setup + - name: Run Integration Tests shell: bash if: github.event_name != 'pull_request' && matrix.integration-tests @@ -175,6 +179,9 @@ jobs: OpenAI__ApiKey: ${{ secrets.OPENAI__APIKEY }} OpenAI__ChatModelId: ${{ vars.OPENAI__CHATMODELID }} OpenAI__ChatReasoningModelId: ${{ vars.OPENAI__CHATREASONINGMODELID }} + # Azure OpenAI Models + AZURE_OPENAI_CHAT_DEPLOYMENT_NAME: ${{ vars.AZUREOPENAI__CHATDEPLOYMENTNAME }} + AZURE_OPENAI_ENDPOINT: ${{ vars.AZUREOPENAI__ENDPOINT }} # Azure AI Foundry AzureAI__Endpoint: ${{ secrets.AZUREAI__ENDPOINT }} AzureAI__DeploymentName: ${{ vars.AZUREAI__DEPLOYMENTNAME }} diff --git a/dotnet/tests/Microsoft.Agents.AI.DurableTask.IntegrationTests/TestHelper.cs b/dotnet/tests/Microsoft.Agents.AI.DurableTask.IntegrationTests/TestHelper.cs index 75af1e82ac..15526621d1 100644 --- a/dotnet/tests/Microsoft.Agents.AI.DurableTask.IntegrationTests/TestHelper.cs +++ b/dotnet/tests/Microsoft.Agents.AI.DurableTask.IntegrationTests/TestHelper.cs @@ -116,16 +116,13 @@ internal sealed class TestHelper : IDisposable internal static ChatClient GetAzureOpenAIChatClient(IConfiguration configuration) { - string azureOpenAiEndpoint = - configuration["AZUREAI:ENDPOINT"] ?? // Defined in dotnet-build-and-test.yml (as AZUREAI__ENDPOINT) - configuration["AZURE_OPENAI_ENDPOINT"] ?? // Legacy - throw new InvalidOperationException("The required AZUREAI__ENDPOINT or AZURE_OPENAI_ENDPOINT env variable is not set."); - string azureOpenAiDeploymentName = - configuration["AZUREAI:DEPLOYMENTNAME"] ?? // Defined in dotnet-build-and-test.yml (as AZUREAI__DEPLOYMENTNAME) - configuration["AZURE_OPENAI_DEPLOYMENT"] ?? // Legacy - throw new InvalidOperationException("The required AZUREAI__DEPLOYMENTNAME or AZURE_OPENAI_DEPLOYMENT env variable is not set."); + string azureOpenAiEndpoint = configuration["AZURE_OPENAI_ENDPOINT"] ?? + throw new InvalidOperationException("The required AZURE_OPENAI_ENDPOINT env variable is not set."); + string azureOpenAiDeploymentName = configuration["AZURE_OPENAI_CHAT_DEPLOYMENT_NAME"] ?? + throw new InvalidOperationException("The required AZURE_OPENAI_CHAT_DEPLOYMENT_NAME env variable is not set."); - // Check if AZURE_OPENAI_KEY is provided for token-based authentication + // Check if AZURE_OPENAI_KEY is provided for key-based authentication. + // NOTE: This is not used for automated tests, but can be useful for local development. string? azureOpenAiKey = configuration["AZURE_OPENAI_KEY"]; AzureOpenAIClient client = !string.IsNullOrEmpty(azureOpenAiKey) diff --git a/dotnet/tests/Microsoft.Agents.AI.Hosting.AzureFunctions.IntegrationTests/SamplesValidation.cs b/dotnet/tests/Microsoft.Agents.AI.Hosting.AzureFunctions.IntegrationTests/SamplesValidation.cs index cf5c6ea720..e5c4dc8be0 100644 --- a/dotnet/tests/Microsoft.Agents.AI.Hosting.AzureFunctions.IntegrationTests/SamplesValidation.cs +++ b/dotnet/tests/Microsoft.Agents.AI.Hosting.AzureFunctions.IntegrationTests/SamplesValidation.cs @@ -635,14 +635,10 @@ public sealed class SamplesValidation(ITestOutputHelper outputHelper) : IAsyncLi RedirectStandardError = true, }; - string openAiEndpoint = - s_configuration["AZUREAI:ENDPOINT"] ?? // Defined in dotnet-build-and-test.yml (as AZUREAI__ENDPOINT) - s_configuration["AZURE_OPENAI_ENDPOINT"] ?? // Legacy - throw new InvalidOperationException("The required AZUREAI__ENDPOINT or AZURE_OPENAI_ENDPOINT env variable is not set."); - string openAiDeployment = - s_configuration["AZUREAI:DEPLOYMENTNAME"] ?? // Defined in dotnet-build-and-test.yml (as AZUREAI__DEPLOYMENTNAME) - s_configuration["AZURE_OPENAI_DEPLOYMENT"] ?? // Legacy - throw new InvalidOperationException("The required AZUREAI__DEPLOYMENTNAME or AZURE_OPENAI_DEPLOYMENT env variable is not set."); + string openAiEndpoint = s_configuration["AZURE_OPENAI_ENDPOINT"] ?? + throw new InvalidOperationException("The required AZURE_OPENAI_ENDPOINT env variable is not set."); + string openAiDeployment = s_configuration["AZURE_OPENAI_CHAT_DEPLOYMENT_NAME"] ?? + throw new InvalidOperationException("The required AZURE_OPENAI_CHAT_DEPLOYMENT_NAME env variable is not set."); // Set required environment variables for the function app (see local.settings.json for required settings) startInfo.EnvironmentVariables["AZURE_OPENAI_ENDPOINT"] = openAiEndpoint;