diff --git a/dotnet/samples/04-hosting/FoundryResponsesHosting/Pages.cs b/dotnet/samples/04-hosting/FoundryResponsesHosting/Pages.cs index bff2c62e99..916b0fdf17 100644 --- a/dotnet/samples/04-hosting/FoundryResponsesHosting/Pages.cs +++ b/dotnet/samples/04-hosting/FoundryResponsesHosting/Pages.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft. All rights reserved. +// Copyright (c) Microsoft. All rights reserved. /// /// Static HTML pages served by the sample application. diff --git a/dotnet/samples/04-hosting/FoundryResponsesHosting/Program.cs b/dotnet/samples/04-hosting/FoundryResponsesHosting/Program.cs index 32f39f641c..88af464ac7 100644 --- a/dotnet/samples/04-hosting/FoundryResponsesHosting/Program.cs +++ b/dotnet/samples/04-hosting/FoundryResponsesHosting/Program.cs @@ -16,8 +16,8 @@ // - AZURE_OPENAI_DEPLOYMENT - the model deployment name (default: "gpt-4o") using System.ComponentModel; -using Azure.AI.OpenAI; using Azure.AI.AgentServer.Responses; +using Azure.AI.OpenAI; using Azure.Identity; using Microsoft.Agents.AI; using Microsoft.Agents.AI.Hosting; diff --git a/dotnet/samples/04-hosting/FoundryResponsesHosting/ResponseStreamValidator.cs b/dotnet/samples/04-hosting/FoundryResponsesHosting/ResponseStreamValidator.cs index 72da677f45..5dc1b4c791 100644 --- a/dotnet/samples/04-hosting/FoundryResponsesHosting/ResponseStreamValidator.cs +++ b/dotnet/samples/04-hosting/FoundryResponsesHosting/ResponseStreamValidator.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft. All rights reserved. +// Copyright (c) Microsoft. All rights reserved. using System.Text.Json; using System.Text.Json.Serialization; @@ -36,7 +36,7 @@ internal sealed class ResponseStreamValidator private bool _hasTerminal; /// All violations found so far. - internal IReadOnlyList Violations => _violations; + internal IReadOnlyList Violations => this._violations; /// /// Processes a single SSE event line pair (event type + JSON data). @@ -52,33 +52,33 @@ internal sealed class ResponseStreamValidator } catch (JsonException ex) { - Fail("PARSE-01", $"Invalid JSON in event data: {ex.Message}"); + this.Fail("PARSE-01", $"Invalid JSON in event data: {ex.Message}"); return; } - _eventCount++; + this._eventCount++; // ── Sequence number validation ────────────────────────────────── if (data.TryGetProperty("sequence_number", out var seqProp) && seqProp.ValueKind == JsonValueKind.Number) { int seq = seqProp.GetInt32(); - if (seq != _expectedSequenceNumber) + if (seq != this._expectedSequenceNumber) { - Fail("SEQ-01", $"Expected sequence_number {_expectedSequenceNumber}, got {seq}"); + this.Fail("SEQ-01", $"Expected sequence_number {this._expectedSequenceNumber}, got {seq}"); } - _expectedSequenceNumber = seq + 1; + this._expectedSequenceNumber = seq + 1; } - else if (_state != StreamState.Initial || eventType != "error") + else if (this._state != StreamState.Initial || eventType != "error") { // Pre-creation error events may not have sequence_number - Fail("SEQ-02", $"Missing sequence_number on event '{eventType}'"); + this.Fail("SEQ-02", $"Missing sequence_number on event '{eventType}'"); } // ── Post-terminal guard ───────────────────────────────────────── - if (_hasTerminal) + if (this._hasTerminal) { - Fail("TERM-01", $"Event '{eventType}' received after terminal event"); + this.Fail("TERM-01", $"Event '{eventType}' received after terminal event"); return; } @@ -86,93 +86,93 @@ internal sealed class ResponseStreamValidator switch (eventType) { case "response.created": - ValidateResponseCreated(data); + this.ValidateResponseCreated(data); break; case "response.queued": - ValidateStateTransition(eventType, StreamState.Created, StreamState.Queued); - ValidateResponseEnvelope(data, eventType); + this.ValidateStateTransition(eventType, StreamState.Created, StreamState.Queued); + this.ValidateResponseEnvelope(data, eventType); break; case "response.in_progress": - if (_state is StreamState.Created or StreamState.Queued) + if (this._state is StreamState.Created or StreamState.Queued) { - _state = StreamState.InProgress; + this._state = StreamState.InProgress; } else { - Fail("ORDER-02", $"'response.in_progress' received in state {_state} (expected Created or Queued)"); + this.Fail("ORDER-02", $"'response.in_progress' received in state {this._state} (expected Created or Queued)"); } - ValidateResponseEnvelope(data, eventType); + this.ValidateResponseEnvelope(data, eventType); break; case "response.output_item.added": case "output_item.added": - ValidateInProgress(eventType); - ValidateOutputItemAdded(data); + this.ValidateInProgress(eventType); + this.ValidateOutputItemAdded(data); break; case "response.output_item.done": case "output_item.done": - ValidateInProgress(eventType); - ValidateOutputItemDone(data); + this.ValidateInProgress(eventType); + this.ValidateOutputItemDone(data); break; case "response.content_part.added": case "content_part.added": - ValidateInProgress(eventType); - ValidateContentPartAdded(data); + this.ValidateInProgress(eventType); + this.ValidateContentPartAdded(data); break; case "response.content_part.done": case "content_part.done": - ValidateInProgress(eventType); - ValidateContentPartDone(data); + this.ValidateInProgress(eventType); + this.ValidateContentPartDone(data); break; case "response.output_text.delta": case "output_text.delta": - ValidateInProgress(eventType); - ValidateTextDelta(data); + this.ValidateInProgress(eventType); + this.ValidateTextDelta(data); break; case "response.output_text.done": case "output_text.done": - ValidateInProgress(eventType); - ValidateTextDone(data); + this.ValidateInProgress(eventType); + this.ValidateTextDone(data); break; case "response.function_call_arguments.delta": case "function_call_arguments.delta": - ValidateInProgress(eventType); + this.ValidateInProgress(eventType); break; case "response.function_call_arguments.done": case "function_call_arguments.done": - ValidateInProgress(eventType); + this.ValidateInProgress(eventType); break; case "response.completed": - ValidateTerminal(data, "completed"); + this.ValidateTerminal(data, "completed"); break; case "response.failed": - ValidateTerminal(data, "failed"); + this.ValidateTerminal(data, "failed"); break; case "response.incomplete": - ValidateTerminal(data, "incomplete"); + this.ValidateTerminal(data, "incomplete"); break; case "error": // Pre-creation error — standalone, no response.created precedes it - if (_state != StreamState.Initial) + if (this._state != StreamState.Initial) { - Fail("ERR-01", "'error' event received after response.created — should use response.failed instead"); + this.Fail("ERR-01", "'error' event received after response.created — should use response.failed instead"); } - _hasTerminal = true; + this._hasTerminal = true; break; default: @@ -186,31 +186,31 @@ internal sealed class ResponseStreamValidator /// internal void Complete() { - if (!_hasTerminal && _state != StreamState.Initial) + if (!this._hasTerminal && this._state != StreamState.Initial) { - Fail("TERM-02", "Stream ended without a terminal event (response.completed, response.failed, or response.incomplete)"); + this.Fail("TERM-02", "Stream ended without a terminal event (response.completed, response.failed, or response.incomplete)"); } - if (_state == StreamState.Initial && _eventCount == 0) + if (this._state == StreamState.Initial && this._eventCount == 0) { - Fail("EMPTY-01", "No events received in the stream"); + this.Fail("EMPTY-01", "No events received in the stream"); } // Check for output items that were added but never completed - foreach (int idx in _addedItemIndices) + foreach (int idx in this._addedItemIndices) { - if (!_doneItemIndices.Contains(idx)) + if (!this._doneItemIndices.Contains(idx)) { - Fail("ITEM-03", $"Output item at index {idx} was added but never received output_item.done"); + this.Fail("ITEM-03", $"Output item at index {idx} was added but never received output_item.done"); } } // Check for content parts that were added but never completed - foreach (string key in _addedContentParts) + foreach (string key in this._addedContentParts) { - if (!_doneContentParts.Contains(key)) + if (!this._doneContentParts.Contains(key)) { - Fail("CONTENT-03", $"Content part '{key}' was added but never received content_part.done"); + this.Fail("CONTENT-03", $"Content part '{key}' was added but never received content_part.done"); } } } @@ -221,9 +221,9 @@ internal sealed class ResponseStreamValidator internal ValidationResult GetResult() { return new ValidationResult( - EventCount: _eventCount, - IsValid: _violations.Count == 0, - Violations: [.. _violations]); + EventCount: this._eventCount, + IsValid: this._violations.Count == 0, + Violations: [.. this._violations]); } // ═══════════════════════════════════════════════════════════════════════ @@ -232,28 +232,28 @@ internal sealed class ResponseStreamValidator private void ValidateResponseCreated(JsonElement data) { - if (_state != StreamState.Initial) + if (this._state != StreamState.Initial) { - Fail("ORDER-01", $"'response.created' received in state {_state} (expected Initial — must be first event)"); + this.Fail("ORDER-01", $"'response.created' received in state {this._state} (expected Initial — must be first event)"); return; } - _state = StreamState.Created; + this._state = StreamState.Created; // Must have a response envelope if (!data.TryGetProperty("response", out var resp)) { - Fail("FIELD-01", "'response.created' missing 'response' object"); + this.Fail("FIELD-01", "'response.created' missing 'response' object"); return; } // Required response fields - ValidateRequiredResponseFields(resp, "response.created"); + this.ValidateRequiredResponseFields(resp, "response.created"); // Capture response ID for cross-event checks if (resp.TryGetProperty("id", out var idProp)) { - _responseId = idProp.GetString(); + this._responseId = idProp.GetString(); } // Status must be non-terminal @@ -262,28 +262,28 @@ internal sealed class ResponseStreamValidator string? status = statusProp.GetString(); if (status is "completed" or "failed" or "incomplete" or "cancelled") { - Fail("STATUS-01", $"'response.created' has terminal status '{status}' — must be 'queued' or 'in_progress'"); + this.Fail("STATUS-01", $"'response.created' has terminal status '{status}' — must be 'queued' or 'in_progress'"); } } } private void ValidateTerminal(JsonElement data, string expectedKind) { - if (_state is StreamState.Initial or StreamState.Created) + if (this._state is StreamState.Initial or StreamState.Created) { - Fail("ORDER-03", $"Terminal event 'response.{expectedKind}' received before 'response.in_progress'"); + this.Fail("ORDER-03", $"Terminal event 'response.{expectedKind}' received before 'response.in_progress'"); } - _hasTerminal = true; - _state = StreamState.Terminal; + this._hasTerminal = true; + this._state = StreamState.Terminal; if (!data.TryGetProperty("response", out var resp)) { - Fail("FIELD-01", $"'response.{expectedKind}' missing 'response' object"); + this.Fail("FIELD-01", $"'response.{expectedKind}' missing 'response' object"); return; } - ValidateRequiredResponseFields(resp, $"response.{expectedKind}"); + this.ValidateRequiredResponseFields(resp, $"response.{expectedKind}"); if (resp.TryGetProperty("status", out var statusProp)) { @@ -295,12 +295,12 @@ internal sealed class ResponseStreamValidator if (status == "completed" && !hasCompletedAt) { - Fail("FIELD-02", "'completed_at' must be non-null when status is 'completed'"); + this.Fail("FIELD-02", "'completed_at' must be non-null when status is 'completed'"); } if (status != "completed" && hasCompletedAt) { - Fail("FIELD-03", $"'completed_at' must be null when status is '{status}'"); + this.Fail("FIELD-03", $"'completed_at' must be null when status is '{status}'"); } // error field validation @@ -309,39 +309,39 @@ internal sealed class ResponseStreamValidator if (status == "failed" && !hasError) { - Fail("FIELD-04", "'error' must be non-null when status is 'failed'"); + this.Fail("FIELD-04", "'error' must be non-null when status is 'failed'"); } if (status is "completed" or "incomplete" && hasError) { - Fail("FIELD-05", $"'error' must be null when status is '{status}'"); + this.Fail("FIELD-05", $"'error' must be null when status is '{status}'"); } // error structure validation if (hasError) { - ValidateErrorObject(errProp, $"response.{expectedKind}"); + this.ValidateErrorObject(errProp, $"response.{expectedKind}"); } // cancelled output must be empty (B11) if (status == "cancelled" && resp.TryGetProperty("output", out var outputProp) && outputProp.ValueKind == JsonValueKind.Array && outputProp.GetArrayLength() > 0) { - Fail("CANCEL-01", "Cancelled response must have empty output array (B11)"); + this.Fail("CANCEL-01", "Cancelled response must have empty output array (B11)"); } // response ID consistency - if (_responseId is not null && resp.TryGetProperty("id", out var idProp) - && idProp.GetString() != _responseId) + if (this._responseId is not null && resp.TryGetProperty("id", out var idProp) + && idProp.GetString() != this._responseId) { - Fail("ID-01", $"Response ID changed: was '{_responseId}', now '{idProp.GetString()}'"); + this.Fail("ID-01", $"Response ID changed: was '{this._responseId}', now '{idProp.GetString()}'"); } } // Usage validation (optional, but if present must be structured correctly) if (resp.TryGetProperty("usage", out var usageProp) && usageProp.ValueKind == JsonValueKind.Object) { - ValidateUsage(usageProp, $"response.{expectedKind}"); + this.ValidateUsage(usageProp, $"response.{expectedKind}"); } } @@ -350,19 +350,19 @@ internal sealed class ResponseStreamValidator if (data.TryGetProperty("output_index", out var idxProp) && idxProp.ValueKind == JsonValueKind.Number) { int index = idxProp.GetInt32(); - if (!_addedItemIndices.Add(index)) + if (!this._addedItemIndices.Add(index)) { - Fail("ITEM-01", $"Duplicate output_item.added for output_index {index}"); + this.Fail("ITEM-01", $"Duplicate output_item.added for output_index {index}"); } } else { - Fail("FIELD-06", "output_item.added missing 'output_index' field"); + this.Fail("FIELD-06", "output_item.added missing 'output_index' field"); } if (!data.TryGetProperty("item", out _)) { - Fail("FIELD-07", "output_item.added missing 'item' object"); + this.Fail("FIELD-07", "output_item.added missing 'item' object"); } } @@ -371,37 +371,37 @@ internal sealed class ResponseStreamValidator if (data.TryGetProperty("output_index", out var idxProp) && idxProp.ValueKind == JsonValueKind.Number) { int index = idxProp.GetInt32(); - if (!_addedItemIndices.Contains(index)) + if (!this._addedItemIndices.Contains(index)) { - Fail("ITEM-02", $"output_item.done for output_index {index} without preceding output_item.added"); + this.Fail("ITEM-02", $"output_item.done for output_index {index} without preceding output_item.added"); } - _doneItemIndices.Add(index); + this._doneItemIndices.Add(index); } else { - Fail("FIELD-06", "output_item.done missing 'output_index' field"); + this.Fail("FIELD-06", "output_item.done missing 'output_index' field"); } } private void ValidateContentPartAdded(JsonElement data) { string key = GetContentPartKey(data); - if (!_addedContentParts.Add(key)) + if (!this._addedContentParts.Add(key)) { - Fail("CONTENT-01", $"Duplicate content_part.added for {key}"); + this.Fail("CONTENT-01", $"Duplicate content_part.added for {key}"); } } private void ValidateContentPartDone(JsonElement data) { string key = GetContentPartKey(data); - if (!_addedContentParts.Contains(key)) + if (!this._addedContentParts.Contains(key)) { - Fail("CONTENT-02", $"content_part.done for {key} without preceding content_part.added"); + this.Fail("CONTENT-02", $"content_part.done for {key} without preceding content_part.added"); } - _doneContentParts.Add(key); + this._doneContentParts.Add(key); } private void ValidateTextDelta(JsonElement data) @@ -411,13 +411,13 @@ internal sealed class ResponseStreamValidator ? deltaProp.GetString() ?? string.Empty : string.Empty; - if (!_textAccumulators.TryGetValue(key, out string? existing)) + if (!this._textAccumulators.TryGetValue(key, out string? existing)) { - _textAccumulators[key] = delta; + this._textAccumulators[key] = delta; } else { - _textAccumulators[key] = existing + delta; + this._textAccumulators[key] = existing + delta; } } @@ -430,13 +430,13 @@ internal sealed class ResponseStreamValidator if (finalText is null) { - Fail("TEXT-01", $"output_text.done for {key} missing 'text' field"); + this.Fail("TEXT-01", $"output_text.done for {key} missing 'text' field"); return; } - if (_textAccumulators.TryGetValue(key, out string? accumulated) && accumulated != finalText) + if (this._textAccumulators.TryGetValue(key, out string? accumulated) && accumulated != finalText) { - Fail("TEXT-02", $"output_text.done text for {key} does not match accumulated deltas (accumulated {accumulated.Length} chars, done has {finalText.Length} chars)"); + this.Fail("TEXT-02", $"output_text.done text for {key} does not match accumulated deltas (accumulated {accumulated.Length} chars, done has {finalText.Length} chars)"); } } @@ -448,34 +448,34 @@ internal sealed class ResponseStreamValidator { if (!HasNonNullString(resp, "id")) { - Fail("FIELD-01", $"{context}: response missing 'id'"); + this.Fail("FIELD-01", $"{context}: response missing 'id'"); } if (resp.TryGetProperty("object", out var objProp)) { if (objProp.GetString() != "response") { - Fail("FIELD-08", $"{context}: response.object must be 'response', got '{objProp.GetString()}'"); + this.Fail("FIELD-08", $"{context}: response.object must be 'response', got '{objProp.GetString()}'"); } } else { - Fail("FIELD-08", $"{context}: response missing 'object' field"); + this.Fail("FIELD-08", $"{context}: response missing 'object' field"); } if (!resp.TryGetProperty("created_at", out var catProp) || catProp.ValueKind == JsonValueKind.Null) { - Fail("FIELD-09", $"{context}: response missing 'created_at'"); + this.Fail("FIELD-09", $"{context}: response missing 'created_at'"); } if (!resp.TryGetProperty("status", out _)) { - Fail("FIELD-10", $"{context}: response missing 'status'"); + this.Fail("FIELD-10", $"{context}: response missing 'status'"); } if (!resp.TryGetProperty("output", out var outputProp) || outputProp.ValueKind != JsonValueKind.Array) { - Fail("FIELD-11", $"{context}: response missing 'output' array"); + this.Fail("FIELD-11", $"{context}: response missing 'output' array"); } } @@ -483,12 +483,12 @@ internal sealed class ResponseStreamValidator { if (!HasNonNullString(error, "code")) { - Fail("ERR-02", $"{context}: error object missing 'code' field"); + this.Fail("ERR-02", $"{context}: error object missing 'code' field"); } if (!HasNonNullString(error, "message")) { - Fail("ERR-03", $"{context}: error object missing 'message' field"); + this.Fail("ERR-03", $"{context}: error object missing 'message' field"); } } @@ -496,17 +496,17 @@ internal sealed class ResponseStreamValidator { if (!usage.TryGetProperty("input_tokens", out _)) { - Fail("USAGE-01", $"{context}: usage missing 'input_tokens'"); + this.Fail("USAGE-01", $"{context}: usage missing 'input_tokens'"); } if (!usage.TryGetProperty("output_tokens", out _)) { - Fail("USAGE-02", $"{context}: usage missing 'output_tokens'"); + this.Fail("USAGE-02", $"{context}: usage missing 'output_tokens'"); } if (!usage.TryGetProperty("total_tokens", out _)) { - Fail("USAGE-03", $"{context}: usage missing 'total_tokens'"); + this.Fail("USAGE-03", $"{context}: usage missing 'total_tokens'"); } } @@ -514,17 +514,17 @@ internal sealed class ResponseStreamValidator { if (!data.TryGetProperty("response", out var resp)) { - Fail("FIELD-01", $"'{eventType}' missing 'response' object"); + this.Fail("FIELD-01", $"'{eventType}' missing 'response' object"); return; } - ValidateRequiredResponseFields(resp, eventType); + this.ValidateRequiredResponseFields(resp, eventType); // Response ID consistency - if (_responseId is not null && resp.TryGetProperty("id", out var idProp) - && idProp.GetString() != _responseId) + if (this._responseId is not null && resp.TryGetProperty("id", out var idProp) + && idProp.GetString() != this._responseId) { - Fail("ID-01", $"Response ID changed: was '{_responseId}', now '{idProp.GetString()}'"); + this.Fail("ID-01", $"Response ID changed: was '{this._responseId}', now '{idProp.GetString()}'"); } } @@ -534,27 +534,27 @@ internal sealed class ResponseStreamValidator private void ValidateInProgress(string eventType) { - if (_state != StreamState.InProgress) + if (this._state != StreamState.InProgress) { - Fail("ORDER-04", $"'{eventType}' received in state {_state} (expected InProgress)"); + this.Fail("ORDER-04", $"'{eventType}' received in state {this._state} (expected InProgress)"); } } private void ValidateStateTransition(string eventType, StreamState expected, StreamState next) { - if (_state != expected) + if (this._state != expected) { - Fail("ORDER-05", $"'{eventType}' received in state {_state} (expected {expected})"); + this.Fail("ORDER-05", $"'{eventType}' received in state {this._state} (expected {expected})"); } else { - _state = next; + this._state = next; } } private void Fail(string ruleId, string message) { - _violations.Add(new ValidationViolation(ruleId, message, _eventCount)); + this._violations.Add(new ValidationViolation(ruleId, message, this._eventCount)); } private static bool HasNonNullString(JsonElement obj, string property) diff --git a/dotnet/tests/Microsoft.Agents.AI.Hosting.AzureAIResponses.UnitTests/AgentFrameworkResponseHandlerTests.cs b/dotnet/tests/Microsoft.Agents.AI.Hosting.AzureAIResponses.UnitTests/AgentFrameworkResponseHandlerTests.cs index ee32771a67..10d1271d10 100644 --- a/dotnet/tests/Microsoft.Agents.AI.Hosting.AzureAIResponses.UnitTests/AgentFrameworkResponseHandlerTests.cs +++ b/dotnet/tests/Microsoft.Agents.AI.Hosting.AzureAIResponses.UnitTests/AgentFrameworkResponseHandlerTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft. All rights reserved. +// Copyright (c) Microsoft. All rights reserved. using System; using System.Collections.Generic; @@ -20,8 +20,6 @@ namespace Microsoft.Agents.AI.Hosting.AzureAIResponses.UnitTests; public class AgentFrameworkResponseHandlerTests { - private static string ValidResponseId => "resp_" + new string('0', 46); - [Fact] public async Task CreateAsync_WithDefaultAgent_ProducesStreamEvents() { @@ -688,13 +686,13 @@ public class AgentFrameworkResponseHandlerTests protected override ValueTask SerializeSessionCoreAsync( AgentSession session, - System.Text.Json.JsonSerializerOptions? jsonSerializerOptions, + JsonSerializerOptions? jsonSerializerOptions, CancellationToken cancellationToken = default) => throw new NotImplementedException(); protected override ValueTask DeserializeSessionCoreAsync( JsonElement serializedState, - System.Text.Json.JsonSerializerOptions? jsonSerializerOptions, + JsonSerializerOptions? jsonSerializerOptions, CancellationToken cancellationToken = default) => throw new NotImplementedException(); } @@ -721,13 +719,13 @@ public class AgentFrameworkResponseHandlerTests protected override ValueTask SerializeSessionCoreAsync( AgentSession session, - System.Text.Json.JsonSerializerOptions? jsonSerializerOptions, + JsonSerializerOptions? jsonSerializerOptions, CancellationToken cancellationToken = default) => throw new NotImplementedException(); protected override ValueTask DeserializeSessionCoreAsync( JsonElement serializedState, - System.Text.Json.JsonSerializerOptions? jsonSerializerOptions, + JsonSerializerOptions? jsonSerializerOptions, CancellationToken cancellationToken = default) => throw new NotImplementedException(); } @@ -743,8 +741,8 @@ public class AgentFrameworkResponseHandlerTests AgentRunOptions? options, CancellationToken cancellationToken = default) { - CapturedMessages = messages.ToList(); - CapturedOptions = options; + this.CapturedMessages = messages.ToList(); + this.CapturedOptions = options; return ToAsyncEnumerableAsync(new AgentResponseUpdate { MessageId = "resp_msg_1", @@ -765,13 +763,13 @@ public class AgentFrameworkResponseHandlerTests protected override ValueTask SerializeSessionCoreAsync( AgentSession session, - System.Text.Json.JsonSerializerOptions? jsonSerializerOptions, + JsonSerializerOptions? jsonSerializerOptions, CancellationToken cancellationToken = default) => throw new NotImplementedException(); protected override ValueTask DeserializeSessionCoreAsync( JsonElement serializedState, - System.Text.Json.JsonSerializerOptions? jsonSerializerOptions, + JsonSerializerOptions? jsonSerializerOptions, CancellationToken cancellationToken = default) => throw new NotImplementedException(); } @@ -802,13 +800,13 @@ public class AgentFrameworkResponseHandlerTests protected override ValueTask SerializeSessionCoreAsync( AgentSession session, - System.Text.Json.JsonSerializerOptions? jsonSerializerOptions, + JsonSerializerOptions? jsonSerializerOptions, CancellationToken cancellationToken = default) => throw new NotImplementedException(); protected override ValueTask DeserializeSessionCoreAsync( JsonElement serializedState, - System.Text.Json.JsonSerializerOptions? jsonSerializerOptions, + JsonSerializerOptions? jsonSerializerOptions, CancellationToken cancellationToken = default) => throw new NotImplementedException(); } diff --git a/dotnet/tests/Microsoft.Agents.AI.Hosting.AzureAIResponses.UnitTests/InputConverterTests.cs b/dotnet/tests/Microsoft.Agents.AI.Hosting.AzureAIResponses.UnitTests/InputConverterTests.cs index 34555798a7..85748214f1 100644 --- a/dotnet/tests/Microsoft.Agents.AI.Hosting.AzureAIResponses.UnitTests/InputConverterTests.cs +++ b/dotnet/tests/Microsoft.Agents.AI.Hosting.AzureAIResponses.UnitTests/InputConverterTests.cs @@ -1,9 +1,7 @@ -// Copyright (c) Microsoft. All rights reserved. +// Copyright (c) Microsoft. All rights reserved. using System; -using System.Collections.Generic; using System.Linq; -using System.Text.Json; using Azure.AI.AgentServer.Responses; using Azure.AI.AgentServer.Responses.Models; using Microsoft.Extensions.AI; diff --git a/dotnet/tests/Microsoft.Agents.AI.Hosting.AzureAIResponses.UnitTests/OutputConverterTests.cs b/dotnet/tests/Microsoft.Agents.AI.Hosting.AzureAIResponses.UnitTests/OutputConverterTests.cs index dde11298c7..f139e3bf71 100644 --- a/dotnet/tests/Microsoft.Agents.AI.Hosting.AzureAIResponses.UnitTests/OutputConverterTests.cs +++ b/dotnet/tests/Microsoft.Agents.AI.Hosting.AzureAIResponses.UnitTests/OutputConverterTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft. All rights reserved. +// Copyright (c) Microsoft. All rights reserved. using System; using System.Collections.Generic; @@ -7,8 +7,8 @@ using System.Threading; using System.Threading.Tasks; using Azure.AI.AgentServer.Responses; using Azure.AI.AgentServer.Responses.Models; -using Microsoft.Extensions.AI; using Microsoft.Agents.AI.Workflows; +using Microsoft.Extensions.AI; using Moq; using MeaiTextContent = Microsoft.Extensions.AI.TextContent; @@ -233,7 +233,7 @@ public class OutputConverterTests public async Task ConvertUpdatesToEventsAsync_NullTextContent_NoTextDeltaEmitted() { var (stream, _) = CreateTestStream(); - var update = new AgentResponseUpdate { MessageId = "msg_1", Contents = [new MeaiTextContent((string)null!)] }; + var update = new AgentResponseUpdate { MessageId = "msg_1", Contents = [new MeaiTextContent(null!)] }; var events = new List(); await foreach (var evt in OutputConverter.ConvertUpdatesToEventsAsync(ToAsync(new[] { update }), stream)) @@ -314,7 +314,7 @@ public class OutputConverterTests var (stream, _) = CreateTestStream(); var update = new AgentResponseUpdate { - Contents = [new FunctionCallContent("call_1", "do_something", (IDictionary?)null)] + Contents = [new FunctionCallContent("call_1", "do_something", null)] }; var events = new List(); diff --git a/dotnet/tests/Microsoft.Agents.AI.Hosting.AzureAIResponses.UnitTests/ServiceCollectionExtensionsTests.cs b/dotnet/tests/Microsoft.Agents.AI.Hosting.AzureAIResponses.UnitTests/ServiceCollectionExtensionsTests.cs index 9cf45d70af..2be9dc0bc8 100644 --- a/dotnet/tests/Microsoft.Agents.AI.Hosting.AzureAIResponses.UnitTests/ServiceCollectionExtensionsTests.cs +++ b/dotnet/tests/Microsoft.Agents.AI.Hosting.AzureAIResponses.UnitTests/ServiceCollectionExtensionsTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft. All rights reserved. +// Copyright (c) Microsoft. All rights reserved. using System; using System.Linq; @@ -67,6 +67,6 @@ public class ServiceCollectionExtensionsTests { var services = new ServiceCollection(); Assert.Throws( - () => services.AddAgentFrameworkHandler((AIAgent)null!)); + () => services.AddAgentFrameworkHandler(null!)); } } diff --git a/dotnet/tests/Microsoft.Agents.AI.Hosting.AzureAIResponses.UnitTests/WorkflowIntegrationTests.cs b/dotnet/tests/Microsoft.Agents.AI.Hosting.AzureAIResponses.UnitTests/WorkflowIntegrationTests.cs index e5f9bb0405..e8f035ba85 100644 --- a/dotnet/tests/Microsoft.Agents.AI.Hosting.AzureAIResponses.UnitTests/WorkflowIntegrationTests.cs +++ b/dotnet/tests/Microsoft.Agents.AI.Hosting.AzureAIResponses.UnitTests/WorkflowIntegrationTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft. All rights reserved. +// Copyright (c) Microsoft. All rights reserved. using System; using System.Collections.Generic; @@ -27,8 +27,6 @@ namespace Microsoft.Agents.AI.Hosting.AzureAIResponses.UnitTests; /// public class WorkflowIntegrationTests { - private static string ValidResponseId => "resp_" + new string('0', 46); - // ===== Sequential Workflow Tests ===== [Fact] @@ -156,7 +154,7 @@ public class WorkflowIntegrationTests executionEnvironment: InProcessExecution.OffThread); var services = new ServiceCollection(); - services.AddKeyedSingleton("my-workflow", workflowAgent); + services.AddKeyedSingleton("my-workflow", workflowAgent); var sp = services.BuildServiceProvider(); var handler = new AgentFrameworkResponseHandler(sp, NullLogger.Instance); @@ -357,7 +355,7 @@ public class WorkflowIntegrationTests CreateHandlerWithAgent(AIAgent agent, string userMessage) { var services = new ServiceCollection(); - services.AddSingleton(agent); + services.AddSingleton(agent); services.AddSingleton>(NullLogger.Instance); var sp = services.BuildServiceProvider();