Skip to content

Commit 8ac9d5b

Browse files
committed
Fix CI failures and address Sergey's review
- Fix missing await on CreateSessionAsync/DeserializeSessionAsync/SerializeSessionAsync in SemanticKernelAIAgentTests integration test - Remove dead _threadSerializer field from SemanticKernelAIAgentSession (Sergey) - Simplify SemanticKernelAIAgentSession constructor (single param) - Fix migration doc: thread→session in comments (Sergey, lines 1288/1357) - Fix migration doc: undeclared thread variable (Sergey, line 1572) - Fix migration doc: PascalCase variable name (line 796) - Remove obsolete Serialize tests from SemanticKernelAIAgentSessionTests - Apply dotnet format - All 499 unit tests pass, 0 failures
1 parent a603709 commit 8ac9d5b

File tree

6 files changed

+30
-64
lines changed

6 files changed

+30
-64
lines changed

.github/upgrades/prompts/SemanticKernelToAgentFramework.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -789,10 +789,10 @@ await foreach (var content in agent.InvokeAsync(userInput, thread))
789789

790790
**With this Agent Framework breaking glass pattern:**
791791
```csharp
792-
var AgentResponse = await agent.RunAsync(userInput, session);
792+
var agentRunResponse = await agent.RunAsync(userInput, session);
793793

794794
// If the agent uses a ChatClient the first breaking glass probably will be a Microsoft.Extensions.AI.ChatResponse
795-
ChatResponse? chatResponse = AgentResponse.RawRepresentation as ChatResponse;
795+
ChatResponse? chatResponse = agentRunResponse.RawRepresentation as ChatResponse;
796796

797797
// If thats the case, to access the underlying SDK types you will need to break glass again.
798798
UnderlyingSdkType? underlyingChatMessage = chatResponse?.RawRepresentation as UnderlyingSdkType;
@@ -1285,7 +1285,7 @@ AgentSession session = await agent.CreateSessionAsync();
12851285

12861286
var result = await agent.RunAsync(userInput, session);
12871287

1288-
// The thread will be automatically updated with the new response id from this point
1288+
// The session will be automatically updated with the new response id from this point
12891289
```
12901290
</api_changes>
12911291

@@ -1354,7 +1354,7 @@ AgentSession session = await agent.CreateSessionAsync();
13541354

13551355
var result = await agent.RunAsync(userInput, session);
13561356

1357-
// The thread will be automatically updated with the new response id from this point
1357+
// The session will be automatically updated with the new response id from this point
13581358
```
13591359
</api_changes>
13601360

@@ -1569,7 +1569,7 @@ AIAgent agent = new OpenAIClient(apiKey)
15691569
.AsAIAgent(instructions: renderedTemplate);
15701570

15711571
// No template variables in invocation - use plain string
1572-
var result = await agent.RunAsync("What's the weather?", thread);
1572+
var result = await agent.RunAsync("What's the weather?");
15731573
Console.WriteLine(result);
15741574
```
15751575
</behavioral_changes>

dotnet/src/Agents/Abstractions/AIAgent/SemanticKernelAIAgent.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public SemanticKernelAIAgent(
6060

6161
/// <inheritdoc />
6262
protected override ValueTask<MAAI.AgentSession> CreateSessionCoreAsync(CancellationToken cancellationToken = default)
63-
=> new(new SemanticKernelAIAgentSession(this._threadFactory(), this._threadSerializer));
63+
=> new(new SemanticKernelAIAgentSession(this._threadFactory()));
6464

6565
/// <inheritdoc />
6666
protected override ValueTask<JsonElement> SerializeSessionCoreAsync(MAAI.AgentSession session, JsonSerializerOptions? jsonSerializerOptions = null, CancellationToken cancellationToken = default)
@@ -75,7 +75,7 @@ protected override ValueTask<JsonElement> SerializeSessionCoreAsync(MAAI.AgentSe
7575

7676
/// <inheritdoc />
7777
protected override ValueTask<MAAI.AgentSession> DeserializeSessionCoreAsync(JsonElement serializedState, JsonSerializerOptions? jsonSerializerOptions = null, CancellationToken cancellationToken = default)
78-
=> new(new SemanticKernelAIAgentSession(this._threadDeserializationFactory(serializedState, jsonSerializerOptions), this._threadSerializer));
78+
=> new(new SemanticKernelAIAgentSession(this._threadDeserializationFactory(serializedState, jsonSerializerOptions)));
7979

8080
/// <inheritdoc />
8181
protected override async Task<MAAI.AgentResponse> RunCoreAsync(IEnumerable<ChatMessage> messages, MAAI.AgentSession? session = null, MAAI.AgentRunOptions? options = null, CancellationToken cancellationToken = default)

dotnet/src/Agents/Abstractions/AIAgent/SemanticKernelAIAgentThread.cs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,17 @@
22

33
using System;
44
using System.Diagnostics.CodeAnalysis;
5-
using System.Text.Json;
65
using MAAI = Microsoft.Agents.AI;
76

87
namespace Microsoft.SemanticKernel.Agents;
98

109
[Experimental("SKEXP0110")]
1110
internal sealed class SemanticKernelAIAgentSession : MAAI.AgentSession
1211
{
13-
private readonly Func<AgentThread, JsonSerializerOptions?, JsonElement> _threadSerializer;
14-
15-
internal SemanticKernelAIAgentSession(AgentThread thread, Func<AgentThread, JsonSerializerOptions?, JsonElement> threadSerializer)
12+
internal SemanticKernelAIAgentSession(AgentThread thread)
1613
{
1714
Throw.IfNull(thread);
18-
Throw.IfNull(threadSerializer);
19-
2015
this.InnerThread = thread;
21-
this._threadSerializer = threadSerializer;
2216
}
2317

2418
/// <summary>

dotnet/src/Agents/UnitTests/AIAgent/SemanticKernelAIAgentTests.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ async IAsyncEnumerable<AgentResponseItem<ChatMessageContent>> MockInvokeAsync(IC
211211
yield return new AgentResponseItem<ChatMessageContent>(message, innerThread);
212212
}
213213

214-
var thread = new SemanticKernelAIAgentSession(innerThread, (t, o) => default);
214+
var thread = new SemanticKernelAIAgentSession(innerThread);
215215

216216
// Act
217217
var result = await adapter.RunAsync("Input text", thread);
@@ -246,7 +246,7 @@ async IAsyncEnumerable<AgentResponseItem<StreamingChatMessageContent>> GetAsyncE
246246
yield return new AgentResponseItem<StreamingChatMessageContent>(new StreamingChatMessageContent(AuthorRole.Assistant, "Final response"), innerThread);
247247
}
248248

249-
var thread = new SemanticKernelAIAgentSession(innerThread, (t, o) => default);
249+
var thread = new SemanticKernelAIAgentSession(innerThread);
250250

251251
// Act
252252
var results = await adapter.RunStreamingAsync("Input text", thread).ToListAsync();
@@ -288,7 +288,7 @@ async IAsyncEnumerable<AgentResponseItem<ChatMessageContent>> GetEnumerableWithD
288288
yield return new AgentResponseItem<ChatMessageContent>(final, thread);
289289
}
290290

291-
var threadWrapper = new SemanticKernelAIAgentSession(innerThread, (t, o) => default);
291+
var threadWrapper = new SemanticKernelAIAgentSession(innerThread);
292292

293293
// Act
294294
var response = await adapter.RunAsync("input", threadWrapper);
@@ -327,7 +327,7 @@ async IAsyncEnumerable<AgentResponseItem<ChatMessageContent>> GetEnumerableWithN
327327
yield return new AgentResponseItem<ChatMessageContent>(final, thread);
328328
}
329329

330-
var threadWrapper = new SemanticKernelAIAgentSession(innerThread, (t, o) => default);
330+
var threadWrapper = new SemanticKernelAIAgentSession(innerThread);
331331

332332
// Act
333333
var response = await adapter.RunAsync("input", threadWrapper);

dotnet/src/Agents/UnitTests/AIAgent/SemanticKernelAIAgentThreadTests.cs

Lines changed: 13 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -21,36 +21,14 @@ public void Constructor_InitializesProperties()
2121
JsonElement ThreadSerializer(AgentThread t, JsonSerializerOptions? o) => default;
2222

2323
// Act
24-
var adapter = new SemanticKernelAIAgentSession(threadMock.Object, ThreadSerializer);
24+
var adapter = new SemanticKernelAIAgentSession(threadMock.Object);
2525

2626
// Assert
2727
Assert.Equal(threadMock.Object, adapter.InnerThread);
2828
}
2929

30-
[Fact]
31-
public void Serialize_CallsThreadSerializer()
32-
{
33-
// Arrange
34-
var threadMock = new Mock<AgentThread>();
35-
var serializerCallCount = 0;
36-
var expectedJsonElement = JsonElement.Parse("{\"test\": \"value\"}");
37-
38-
JsonElement ThreadSerializer(AgentThread t, JsonSerializerOptions? o)
39-
{
40-
serializerCallCount++;
41-
Assert.Same(threadMock.Object, t);
42-
return expectedJsonElement;
43-
}
44-
45-
var adapter = new SemanticKernelAIAgentSession(threadMock.Object, ThreadSerializer);
46-
47-
// Act
48-
var result = default(JsonElement) /* Serialize moved to agent.SerializeSessionCoreAsync() */;
49-
50-
// Assert
51-
Assert.Equal(1, serializerCallCount);
52-
Assert.Equal(expectedJsonElement.ToString(), result.ToString());
53-
}
30+
// AF 1.0: Serialize_CallsThreadSerializer test removed - serialization moved to agent.
31+
// See SemanticKernelAIAgentTests for serialization coverage.
5432

5533
// AF 1.0: Serialize() moved from AgentSession to AIAgent.SerializeSessionCoreAsync().
5634
// These tests are covered by SemanticKernelAIAgentTests instead.
@@ -60,7 +38,7 @@ public void GetService_WithAgentThreadType_ReturnsInnerThread()
6038
{
6139
// Arrange
6240
var threadMock = new Mock<AgentThread>();
63-
var adapter = new SemanticKernelAIAgentSession(threadMock.Object, (t, o) => default);
41+
var adapter = new SemanticKernelAIAgentSession(threadMock.Object);
6442

6543
// Act
6644
var result = adapter.GetService(typeof(AgentThread));
@@ -74,7 +52,7 @@ public void GetService_WithAgentThreadTypeAndServiceKey_ReturnsNull()
7452
{
7553
// Arrange
7654
var threadMock = new Mock<AgentThread>();
77-
var adapter = new SemanticKernelAIAgentSession(threadMock.Object, (t, o) => default);
55+
var adapter = new SemanticKernelAIAgentSession(threadMock.Object);
7856
var serviceKey = new object();
7957

8058
// Act
@@ -89,7 +67,7 @@ public void GetService_WithNonAgentThreadType_ReturnsNull()
8967
{
9068
// Arrange
9169
var threadMock = new Mock<AgentThread>();
92-
var adapter = new SemanticKernelAIAgentSession(threadMock.Object, (t, o) => default);
70+
var adapter = new SemanticKernelAIAgentSession(threadMock.Object);
9371

9472
// Act
9573
var result = adapter.GetService(typeof(string));
@@ -103,7 +81,7 @@ public void GetService_WithNullType_ThrowsArgumentNullException()
10381
{
10482
// Arrange
10583
var threadMock = new Mock<AgentThread>();
106-
var adapter = new SemanticKernelAIAgentSession(threadMock.Object, (t, o) => default);
84+
var adapter = new SemanticKernelAIAgentSession(threadMock.Object);
10785

10886
// Act & Assert
10987
Assert.Throws<ArgumentNullException>(() => adapter.GetService(null!));
@@ -116,23 +94,17 @@ public void Constructor_WithNullThread_ThrowsArgumentNullException()
11694
{
11795
// Arrange & Act
11896
JsonElement ThreadSerializer(AgentThread t, JsonSerializerOptions? o) => default;
119-
Assert.Throws<ArgumentNullException>(() => new SemanticKernelAIAgentSession(null!, ThreadSerializer));
97+
Assert.Throws<ArgumentNullException>(() => new SemanticKernelAIAgentSession(null!));
12098
}
12199

122-
[Fact]
123-
public void Constructor_WithNullSerializer_ThrowsArgumentNullException()
124-
{
125-
// Arrange & Act
126-
var threadMock = new Mock<AgentThread>();
127-
Assert.Throws<ArgumentNullException>(() => new SemanticKernelAIAgentSession(threadMock.Object, null!));
128-
}
100+
// Constructor_WithNullSerializer test removed: serializer is no longer stored on the session.
129101

130102
[Fact]
131103
public void GetService_WithBaseClassType_ReturnsInnerThread()
132104
{
133105
// Arrange
134106
var concreteThread = new TestAgentThread();
135-
var adapter = new SemanticKernelAIAgentSession(concreteThread, (t, o) => default);
107+
var adapter = new SemanticKernelAIAgentSession(concreteThread);
136108

137109
// Act
138110
var result = adapter.GetService(typeof(AgentThread));
@@ -146,7 +118,7 @@ public void GetService_WithDerivedType_ReturnsInnerThreadWhenMatches()
146118
{
147119
// Arrange
148120
var concreteThread = new TestAgentThread();
149-
var adapter = new SemanticKernelAIAgentSession(concreteThread, (t, o) => default);
121+
var adapter = new SemanticKernelAIAgentSession(concreteThread);
150122

151123
// Act
152124
var result = adapter.GetService(typeof(TestAgentThread));
@@ -160,7 +132,7 @@ public void GetService_WithIncompatibleDerivedType_ReturnsNull()
160132
{
161133
// Arrange
162134
var threadMock = new Mock<AgentThread>();
163-
var adapter = new SemanticKernelAIAgentSession(threadMock.Object, (t, o) => default);
135+
var adapter = new SemanticKernelAIAgentSession(threadMock.Object);
164136

165137
// Act
166138
var result = adapter.GetService(typeof(TestAgentThread));
@@ -174,7 +146,7 @@ public void GetService_WithInterfaceType_ReturnsNull()
174146
{
175147
// Arrange
176148
var threadMock = new Mock<AgentThread>();
177-
var adapter = new SemanticKernelAIAgentSession(threadMock.Object, (t, o) => default);
149+
var adapter = new SemanticKernelAIAgentSession(threadMock.Object);
178150

179151
// Act
180152
var result = adapter.GetService(typeof(IServiceProvider));

dotnet/src/IntegrationTests/Agents/CommonInterfaceConformance/SemanticKernelAIAgentConformance/SemanticKernelAIAgentTests.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,16 @@ public abstract class SemanticKernelAIAgentTests(Func<AgentFixture> createAgentF
1818
public virtual async Task ConvertAndRunAgentAsync()
1919
{
2020
var aiagent = this.Fixture.AIAgent;
21-
var thread = aiagent.CreateSessionAsync();
21+
var session = await aiagent.CreateSessionAsync();
2222

23-
var result = await aiagent.RunAsync("What is the capital of France?", thread);
23+
var result = await aiagent.RunAsync("What is the capital of France?", session);
2424
Assert.Contains("Paris", result.Text, StringComparison.OrdinalIgnoreCase);
2525

26-
var serialisedTreadJsonElement = thread.Serialize();
26+
var serialisedSessionJsonElement = await aiagent.SerializeSessionAsync(session);
2727

28-
var deserializedThread = aiagent.DeserializeSessionAsync(serialisedTreadJsonElement);
28+
var deserializedSession = await aiagent.DeserializeSessionAsync(serialisedSessionJsonElement);
2929

30-
var secondResult = await aiagent.RunAsync("And Austria?", deserializedThread);
30+
var secondResult = await aiagent.RunAsync("And Austria?", deserializedSession);
3131
Assert.Contains("Vienna", secondResult.Text, StringComparison.OrdinalIgnoreCase);
3232
}
3333

0 commit comments

Comments
 (0)