From 06a690685f2460e405cc7b4fd6176ea668cfe04d Mon Sep 17 00:00:00 2001
From: Roger Barreto <19890735+rogerbarreto@users.noreply.github.com>
Date: Wed, 25 Jun 2025 20:50:29 +0100
Subject: [PATCH] .Net: Add Reasoning Model Integration tests (#100)
* Add reasoning integration tests
* Adding Reasoning Model config
---
.github/workflows/dotnet-build-and-test.yml | 1 +
dotnet/agent-framework-dotnet.slnx | 234 +++++++++---------
.../IntegrationTests/OpenAIConfiguration.cs | 2 +
...pletionChatClientAgentRunStreamingTests.cs | 8 +-
...AIChatCompletionChatClientAgentRunTests.cs | 8 +-
.../OpenAIChatCompletionFixture.cs | 8 +-
.../OpenAIChatCompletionRunStreamingTests.cs | 8 +-
.../OpenAIChatCompletionRunTests.cs | 8 +-
8 files changed, 158 insertions(+), 119 deletions(-)
diff --git a/.github/workflows/dotnet-build-and-test.yml b/.github/workflows/dotnet-build-and-test.yml
index 435c623466..44743e6818 100644
--- a/.github/workflows/dotnet-build-and-test.yml
+++ b/.github/workflows/dotnet-build-and-test.yml
@@ -135,6 +135,7 @@ jobs:
# OpenAI Models
OpenAI__ApiKey: ${{ secrets.OPENAI__APIKEY }}
OpenAI__ChatModelId: ${{ vars.OPENAI__CHATMODELID }}
+ OpenAI__ChatReasoningModelId: ${{ vars.OPENAI__CHATREASONINGMODELID }}
OpenAIEmbeddings__ApiKey: ${{ secrets.OPENAIEMBEDDINGS__APIKEY }}
OpenAIEmbeddings__ModelId: ${{ vars.OPENAIEMBEDDINGS__MODELID }}
OpenAITextToAudio__ApiKey: ${{ secrets.OPENAITEXTTOAUDIO__APIKEY }}
diff --git a/dotnet/agent-framework-dotnet.slnx b/dotnet/agent-framework-dotnet.slnx
index a79f2a4306..630b939de0 100644
--- a/dotnet/agent-framework-dotnet.slnx
+++ b/dotnet/agent-framework-dotnet.slnx
@@ -1,114 +1,120 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dotnet/src/Shared/IntegrationTests/OpenAIConfiguration.cs b/dotnet/src/Shared/IntegrationTests/OpenAIConfiguration.cs
index fc8357109b..34bc08330e 100644
--- a/dotnet/src/Shared/IntegrationTests/OpenAIConfiguration.cs
+++ b/dotnet/src/Shared/IntegrationTests/OpenAIConfiguration.cs
@@ -11,5 +11,7 @@ internal sealed class OpenAIConfiguration
public string ChatModelId { get; set; }
+ public string ChatReasoningModelId { get; set; }
+
public string ApiKey { get; set; }
}
diff --git a/dotnet/tests/OpenAIChatCompletion.IntegrationTests/OpenAIChatCompletionChatClientAgentRunStreamingTests.cs b/dotnet/tests/OpenAIChatCompletion.IntegrationTests/OpenAIChatCompletionChatClientAgentRunStreamingTests.cs
index bcb2824a5a..4e3d573b9f 100644
--- a/dotnet/tests/OpenAIChatCompletion.IntegrationTests/OpenAIChatCompletionChatClientAgentRunStreamingTests.cs
+++ b/dotnet/tests/OpenAIChatCompletion.IntegrationTests/OpenAIChatCompletionChatClientAgentRunStreamingTests.cs
@@ -4,6 +4,12 @@ using AgentConformance.IntegrationTests;
namespace OpenAIChatCompletion.IntegrationTests;
-public class OpenAIChatCompletionChatClientAgentRunStreamingTests() : ChatClientAgentRunStreamingTests(() => new())
+public class OpenAIChatCompletionChatClientAgentRunStreamingTests()
+ : ChatClientAgentRunStreamingTests(() => new(useReasoningChatModel: false))
+{
+}
+
+public class OpenAIChatCompletionChatClientAgentReasoningRunStreamingTests()
+ : ChatClientAgentRunStreamingTests(() => new(useReasoningChatModel: true))
{
}
diff --git a/dotnet/tests/OpenAIChatCompletion.IntegrationTests/OpenAIChatCompletionChatClientAgentRunTests.cs b/dotnet/tests/OpenAIChatCompletion.IntegrationTests/OpenAIChatCompletionChatClientAgentRunTests.cs
index 5602204af8..c8716f83e1 100644
--- a/dotnet/tests/OpenAIChatCompletion.IntegrationTests/OpenAIChatCompletionChatClientAgentRunTests.cs
+++ b/dotnet/tests/OpenAIChatCompletion.IntegrationTests/OpenAIChatCompletionChatClientAgentRunTests.cs
@@ -4,6 +4,12 @@ using AgentConformance.IntegrationTests;
namespace OpenAIChatCompletion.IntegrationTests;
-public class OpenAIChatCompletionChatClientAgentRunTests() : ChatClientAgentRunTests(() => new())
+public class OpenAIChatCompletionChatClientAgentRunTests()
+ : ChatClientAgentRunTests(() => new(useReasoningChatModel: false))
+{
+}
+
+public class OpenAIChatCompletionChatClientAgentReasoningRunTests()
+ : ChatClientAgentRunTests(() => new(useReasoningChatModel: true))
{
}
diff --git a/dotnet/tests/OpenAIChatCompletion.IntegrationTests/OpenAIChatCompletionFixture.cs b/dotnet/tests/OpenAIChatCompletion.IntegrationTests/OpenAIChatCompletionFixture.cs
index c88e774b38..0b68e2ecf7 100644
--- a/dotnet/tests/OpenAIChatCompletion.IntegrationTests/OpenAIChatCompletionFixture.cs
+++ b/dotnet/tests/OpenAIChatCompletion.IntegrationTests/OpenAIChatCompletionFixture.cs
@@ -16,9 +16,15 @@ namespace OpenAIChatCompletion.IntegrationTests;
public class OpenAIChatCompletionFixture : IChatClientAgentFixture
{
private static readonly OpenAIConfiguration s_config = TestConfiguration.LoadSection();
+ private readonly bool _useReasoningModel;
#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring as nullable.
private ChatClientAgent _agent;
+
+ public OpenAIChatCompletionFixture(bool useReasoningChatModel)
+ {
+ this._useReasoningModel = useReasoningChatModel;
+ }
#pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring as nullable.
public Agent Agent => this._agent;
@@ -41,7 +47,7 @@ public class OpenAIChatCompletionFixture : IChatClientAgentFixture
IList? aiTools = null)
{
var chatClient = new OpenAIClient(s_config.ApiKey)
- .GetChatClient(s_config.ChatModelId)
+ .GetChatClient(this._useReasoningModel ? s_config.ChatReasoningModelId : s_config.ChatModelId)
.AsIChatClient();
return Task.FromResult(new ChatClientAgent(chatClient, new()
diff --git a/dotnet/tests/OpenAIChatCompletion.IntegrationTests/OpenAIChatCompletionRunStreamingTests.cs b/dotnet/tests/OpenAIChatCompletion.IntegrationTests/OpenAIChatCompletionRunStreamingTests.cs
index dac192ba5d..3fe381b58c 100644
--- a/dotnet/tests/OpenAIChatCompletion.IntegrationTests/OpenAIChatCompletionRunStreamingTests.cs
+++ b/dotnet/tests/OpenAIChatCompletion.IntegrationTests/OpenAIChatCompletionRunStreamingTests.cs
@@ -4,6 +4,12 @@ using AgentConformance.IntegrationTests;
namespace OpenAIChatCompletion.IntegrationTests;
-public class OpenAIChatCompletionRunStreamingTests() : RunStreamingTests(() => new())
+public class OpenAIChatCompletionRunStreamingTests()
+ : RunStreamingTests(() => new(useReasoningChatModel: false))
+{
+}
+
+public class OpenAIChatCompletionReasoningRunStreamingTests()
+ : RunStreamingTests(() => new(useReasoningChatModel: true))
{
}
diff --git a/dotnet/tests/OpenAIChatCompletion.IntegrationTests/OpenAIChatCompletionRunTests.cs b/dotnet/tests/OpenAIChatCompletion.IntegrationTests/OpenAIChatCompletionRunTests.cs
index 3de2d9b90d..7eff89dfe4 100644
--- a/dotnet/tests/OpenAIChatCompletion.IntegrationTests/OpenAIChatCompletionRunTests.cs
+++ b/dotnet/tests/OpenAIChatCompletion.IntegrationTests/OpenAIChatCompletionRunTests.cs
@@ -4,6 +4,12 @@ using AgentConformance.IntegrationTests;
namespace OpenAIChatCompletion.IntegrationTests;
-public class OpenAIChatCompletionRunTests() : RunTests(() => new())
+public class OpenAIChatCompletionRunTests()
+ : RunTests(() => new(useReasoningChatModel: false))
+{
+}
+
+public class OpenAIChatCompletionReasoningRunTests()
+ : RunTests(() => new(useReasoningChatModel: true))
{
}