Update NuGet pins to latest stable: Microsoft.Agents.AI 1.17.0, ModelContextProtocol(.Core) 2.1.0; pin OpenAI 2.12.0 - #9
Conversation
…ContextProtocol(.Core) 2.1.0; pin OpenAI 2.12.0 The OpenAI pin makes the previously transitive-only version explicit and is required by the upcoming Responses API sample under central package management. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0165XhSYHxBtRZy97c7KtxkR
…Reasoning Breaking changes: - Rename ChatProgressKind.Thinking to ChatProgressKind.Reasoning (value preserved). - The middleware no longer emits RequestStarted/Thinking at request start or after tool round-trips; the first in-band event of a tool request is now ToolInvoking. The Reasoning status is now truthful: it is emitted once per model turn when TextReasoningContent is detected in the stream (OpenAI Responses API today; any provider surfacing reasoning content works), re-armed after each tool round-trip, and mirrored post-hoc for non-streaming responses. The event never carries reasoning text. Developers own request-level statuses outside the middleware via the new ChatProgressUpdate.CreateRequestStarted/CreateReasoning factories (stamped with the well-known ExternalScopeId) and ToResponseUpdate(), which wraps an update in the same synthetic shape the middleware emits for UI consumption. Also adds an optional skippable Responses API integration test gated on the new AzureOpenAI:ResponsesDeployment setting. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0165XhSYHxBtRZy97c7KtxkR
…n the demo The new samples/Andes.Extensions.AI.Demo.Responses console app drives the tracked pipeline over the Azure OpenAI Responses API using stable packages only: the plain OpenAIClient against the OpenAI-v1-compatible endpoint, GetResponsesClient().AsIChatClient(deployment), and ChatOptions.Reasoning = Summary so reasoning summaries stream back as TextReasoningContent and light up the middleware's Reasoning status live. The existing demo now prepends ChatProgressUpdate.CreateRequestStarted() .ToResponseUpdate() to the stream its renderer consumes, demonstrating the developer-owned request statuses that replaced the middleware's auto-emission. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0165XhSYHxBtRZy97c7KtxkR
The README gains NuGet version badges for all four packages, the NuGet Publish workflow badge, license and target-framework badges, a Reasoning feature bullet, an 'Emit your own statuses' quickstart section, and the Responses sample. CLAUDE.md now describes the detection-driven status behavior, the new sample projects, the optional ResponsesDeployment integration setting, and the 0.5.0 lockstep version. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0165XhSYHxBtRZy97c7KtxkR
…ests, sample config guard The status factories now stamp timestamps via TimeProvider.System for symmetry with the tracker, the factory tests bound the timestamp with InRange instead of a weak default check, and both samples' IsConfigured now rejects the sample file's placeholder endpoint so a half-filled config gets the friendly setup panel instead of a DNS failure. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0165XhSYHxBtRZy97c7KtxkR
Updates getting-started (kinds, transcripts, new 'Emit request-level statuses yourself' section), architecture (detection design and the non-streaming post-hoc note), the MCP/Agent transcripts, ui.md, and the progress-board example for the detection-driven Reasoning status, and adds releases/v0.5.0.md covering the breaking changes with migration guidance, the additions, and the dependency updates. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0165XhSYHxBtRZy97c7KtxkR
There was a problem hiding this comment.
Pull request overview
This PR updates central NuGet pins and introduces the v0.5.0 behavior/model for progress reporting: request-level statuses are no longer auto-emitted, Thinking is renamed to a detection-driven Reasoning, and apps can prepend their own request-level statuses via new public factories and a ToResponseUpdate() helper. It also adds a new Responses API demo sample (using the pinned OpenAI SDK) plus corresponding docs and test coverage.
Changes:
- Bump central package pins (Microsoft.Agents.AI 1.17.0, ModelContextProtocol(.Core) 2.1.0) and add an explicit
OpenAI2.12.0 pin/reference for Responses API usage. - Introduce reasoning detection + developer-owned request status factories (
CreateRequestStarted/CreateReasoning) andChatProgressUpdateExtensions.ToResponseUpdate(), and remove auto-emitted request-level statuses from the middleware. - Add a new Responses API sample and expand unit/integration/UI tests and docs to reflect the new progress/status model.
Reviewed changes
Copilot reviewed 45 out of 45 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| tests/Andes.Extensions.AI.Unit.Test/StripProgressContentTests.cs | Updates expectations for renamed Reasoning progress kind. |
| tests/Andes.Extensions.AI.Unit.Test/StreamingProgressTests.cs | Adjusts streaming progress assertions to reflect removal of auto request-level statuses. |
| tests/Andes.Extensions.AI.Unit.Test/ReasoningDetectionTests.cs | New unit coverage for reasoning detection behavior and ordering. |
| tests/Andes.Extensions.AI.Unit.Test/NonStreamingTests.cs | Updates observer-order assertions for non-streaming requests under the new status model. |
| tests/Andes.Extensions.AI.Unit.Test/ChatProgressUpdateFactoryTests.cs | New unit tests for request-status factories and ToResponseUpdate() wrapping. |
| tests/Andes.Extensions.AI.UI.Unit.Test/ChatResponseUiExtensionsTests.cs | Adds test proving developer-prepended RequestStarted drives UI status snapshots. |
| tests/Andes.Extensions.AI.UI.Unit.Test/AssistantStatusReducerTests.cs | Updates sample status text from “Thinking…” to “Reasoning…”. |
| tests/Andes.Extensions.AI.Integration.Test/StreamingIntegrationTests.cs | Updates integration expectations for absence of auto RequestStarted. |
| tests/Andes.Extensions.AI.Integration.Test/ResponsesStreamingIntegrationTests.cs | New end-to-end integration test for Responses API reasoning detection + usage. |
| tests/Andes.Extensions.AI.Integration.Test/AzureOpenAIFixture.cs | Adds optional ResponsesDeployment configuration gate and helper property. |
| tests/Andes.Extensions.AI.Integration.Test/appsettings.integration.sample.json | Adds ResponsesDeployment sample setting. |
| tests/Andes.Extensions.AI.Integration.Test/Andes.Extensions.AI.Integration.Test.csproj | Adds OpenAI reference and suppresses experimental warning for Responses API surface. |
| samples/Andes.Extensions.AI.Demo/README.md | Documents developer-prepended request status due to middleware change. |
| samples/Andes.Extensions.AI.Demo/Program.cs | Prepends CreateRequestStarted().ToResponseUpdate() outside recording loop. |
| samples/Andes.Extensions.AI.Demo/AzureOpenAISettings.cs | Tightens “configured” check (rejects placeholder endpoint). |
| samples/Andes.Extensions.AI.Demo.Responses/StatusRenderer.cs | New console renderer for status snapshots and final output. |
| samples/Andes.Extensions.AI.Demo.Responses/ResponsesDemoTools.cs | New local tools demonstrating progress reporting during Responses tool loops. |
| samples/Andes.Extensions.AI.Demo.Responses/README.md | New sample documentation for Responses API demo and reasoning detection. |
| samples/Andes.Extensions.AI.Demo.Responses/Program.cs | New Responses API demo app wiring OpenAI Responses + tool tracking + UI snapshots. |
| samples/Andes.Extensions.AI.Demo.Responses/AzureOpenAISettings.cs | New settings loader for the Responses sample. |
| samples/Andes.Extensions.AI.Demo.Responses/appsettings.sample.json | Sample config for Responses demo (gitignored runtime config). |
| samples/Andes.Extensions.AI.Demo.Responses/Andes.Extensions.AI.Demo.Responses.csproj | New sample project referencing core/UI and OpenAI SDK. |
| releases/v0.5.0.md | New release notes documenting breaking changes, additions, and verification. |
| README.md | Adds badges and documents reasoning detection + developer-owned request statuses + new sample. |
| docs/ui.md | Updates core dependency floor and clarifies request-level status handling in the UI contract. |
| docs/mcp.md | Updates core dependency floor and removes outdated request-start/thinking transcript lines. |
| docs/getting-started.md | Updates progress-kind docs, adds “Emit request-level statuses yourself” section and examples. |
| docs/examples/progress-board.md | Updates example narrative and kind handling for Reasoning + app-emitted RequestStarted. |
| docs/architecture.md | Updates design description to “detected reasoning, never guessed” and non-streaming post-hoc note. |
| docs/agents.md | Updates core dependency floor and removes outdated request-start/thinking transcript lines. |
| Directory.Packages.props | Updates pins for Agents/MCP and adds explicit OpenAI 2.12.0 version. |
| Andes.Extensions.slnx | Adds the new Responses demo project to the solution. |
| Andes.Extensions.AI/ToolTrackingChatClient.cs | Removes auto request-level emissions; adds reasoning detection in streaming + post-hoc non-streaming. |
| Andes.Extensions.AI/Progress/ChatProgressUpdateExtensions.cs | New helper to wrap progress updates into synthetic ChatResponseUpdate shape. |
| Andes.Extensions.AI/Progress/ChatProgressUpdate.cs | Adds external scope constant and public factories for app-owned request statuses. |
| Andes.Extensions.AI/Progress/ChatProgressKind.cs | Renames Thinking→Reasoning and updates semantics/docs for request-level kinds. |
| Andes.Extensions.AI/Internal/RequestTracker.cs | Implements per-turn reasoning-announcement gating and removes “advance emits thinking” behavior. |
| Andes.Extensions.AI/Andes.Extensions.AI.csproj | Bumps package version to 0.5.0. |
| Andes.Extensions.AI.UI/typescript/andes-assistant-ui.ts | Updates doc text to reference “Reasoning…” status. |
| Andes.Extensions.AI.UI/AssistantUiEventKind.cs | Updates doc text to reference “Reasoning…”. |
| Andes.Extensions.AI.UI/AssistantStatusSnapshot.cs | Updates doc text to reference “Reasoning…”. |
| Andes.Extensions.AI.UI/Andes.Extensions.AI.UI.csproj | Bumps package version to 0.5.0. |
| Andes.Extensions.AI.Mcp/Andes.Extensions.AI.Mcp.csproj | Bumps package version to 0.5.0. |
| Andes.Extensions.AI.Agent/Andes.Extensions.AI.Agent.csproj | Bumps package version to 0.5.0. |
| .claude/CLAUDE.md | Updates repo-specific guidance notes to reflect v0.5 request-status model. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
…ment - Updated reasoning output settings to use Full verbosity in Azure OpenAI Responses API. - Improved handling of reasoning status updates, ensuring accurate tracking of reasoning phases. - Enhanced user interface to display reasoning text and duration in final output. - Modified request status handling to use a custom message for better clarity. - Updated README documentation to reflect changes in reasoning behavior and output. - Added unit tests to verify reasoning text accumulation and status emission order. - Refactored integration tests to ensure compliance with new reasoning handling logic.
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 51 out of 51 changed files in this pull request and generated no new comments.
Suppressed comments (3)
Andes.Extensions.AI/ToolTrackingChatClient.cs:31
- The class XML doc now has two separate
<remarks>blocks, and the second one is effectively being used to document the primary constructor. This is redundant/confusing in generated docs and may trip XML-doc analyzers; keep a single<remarks>section and document the primary-constructor parameters directly with<param>tags.
/// <remarks>
/// Initializes a new instance of the <see cref="ToolTrackingChatClient"/> class.
/// </remarks>
/// <param name="innerClient">The inner client to delegate to.</param>
/// <param name="options">The tracking options, or <see langword="null"/> to use defaults.</param>
Andes.Extensions.AI/Andes.Extensions.AI.csproj:8
- The PR title/description indicates this is primarily a NuGet pin update, but this change also bumps the package version to 0.5.0 and introduces breaking API changes (e.g., progress kind renames), new samples, and extensive docs/tests updates. Please update the PR title/description to reflect the real scope or split the package-pin-only changes into a separate PR to make review/release notes traceability clearer.
<PackageId>Andes.Extensions.AI</PackageId>
<Version>0.5.0</Version>
<Authors>Rodrigo Rojas</Authors>
samples/Andes.Extensions.AI.Demo/Program.cs:57
- This demo now always sends
ChatOptions.ReasoningwithEffort = ExtraHighandOutput = Full, but the demo README prerequisites still describe only needing “a chat deployment”. That mismatch may confuse users and/or cause failures on deployments that don’t support these reasoning settings. Consider either updating the demo README to require a reasoning-capable deployment, or conditionally enabling these options only when configured.
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 51 out of 51 changed files in this pull request and generated no new comments.
Suppressed comments (2)
Andes.Extensions.AI/ToolTrackingChatClient.cs:27
- The type XML docs contain two separate blocks; the second one is only used to say "Initializes..." and then closes immediately. This produces redundant documentation markup and makes the generated XML harder to consume. Consider replacing the second wrapper with a simple (or removing it entirely).
/// <remarks>
/// Initializes a new instance of the <see cref="ToolTrackingChatClient"/> class.
/// </remarks>
releases/v0.5.0.md:11
- The PR title/description focus on NuGet pin updates, but this change set also introduces a new 0.5.0 release with breaking API/behavior changes (e.g., request-level status semantics, new Reasoning/ReasoningCompleted kinds) and adds a new sample + tests. To avoid surprise for reviewers and consumers, the PR metadata should be updated to reflect that broader scope.
The middleware stops guessing: the auto-emitted "Starting request"/"Thinking..." statuses are gone, replaced by a **detection-driven `Reasoning`/`ReasoningCompleted` status pair** that fires only when the model actually streams reasoning content — opened the moment reasoning is detected, closed (with the elapsed reasoning time) the moment the answer or the next tool call starts — plus a **public `Custom` status factory** so applications emit their own request-level statuses — in the exact synthetic shape the middleware uses. The UI package gains a **reasoning-text surface** (`ReasoningDelta` events folding into `AssistantStatusSnapshot.ReasoningText`), and a new sample runs the whole pipeline over the Azure OpenAI Responses API with stable packages only.
## Breaking changes
- **`ChatProgressKind.Thinking` is renamed to `ChatProgressKind.Reasoning`** (`Andes.Extensions.AI/Progress/ChatProgressKind.cs`; the underlying value `1` is preserved). Consumers switching on the enum rename `Thinking` → `Reasoning`; persisted numeric values are unaffected.
The OpenAI pin makes the previously transitive-only version explicit and is
required by the upcoming Responses API sample under central package management.
Co-Authored-By: Claude Fable 5 noreply@anthropic.com
Claude-Session: https://claude.ai/code/session_0165XhSYHxBtRZy97c7KtxkR