dependabot/github_actions/github/codeql-action/init-4.37.3
2652 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
78c0c45695 |
Bump github/codeql-action/init from 4.37.0 to 4.37.3
Bumps [github/codeql-action/init](https://github.com/github/codeql-action) from 4.37.0 to 4.37.3. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/99df26d4f13ea111d4ec1a7dddef6063f76b97e9...e4fba868fa4b1b91e1fdab776edc8cfbe6e9fb81) --- updated-dependencies: - dependency-name: github/codeql-action/init dependency-version: 4.37.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> |
||
|
|
c6442de528 |
.NET: Graduate GitHub Copilot agent to stable (#7313)
Promote Microsoft.Agents.AI.GitHub.Copilot from release candidate to released by replacing IsReleaseCandidate=true with IsReleased=true, so the package builds with the stable central version (no -rc suffix). Also clears the package-validation baseline and disables package validation for this first stable release, since the package has never shipped a stable NuGet to validate against (mirrors the Microsoft.Agents.AI.Harness graduation in #7119). Non-breaking: the package exposes no [Experimental] APIs to un-mark. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: f523064c-60b4-4d18-bf95-c16c5fda9126 |
||
|
|
0df184e7dd |
Python: Fix sub-workflow checkpoint restore to preserve sub-workflow state (#7097)
* Fix sub-workflow checkpoint restore to preserve sub-workflow state Add Runner.capture_checkpoint_object/restore_from_checkpoint_object (quiescent-only nested checkpoint) and embed a sub_workflow_checkpoint in WorkflowExecutor.on_checkpoint_save/on_checkpoint_restore so a resumed parent restores each sub-workflow's mid-progress state instead of only replaying pending request-info events. Keeps a backward-compat fallback when sub_workflow_checkpoint is absent. * Move checkpoint-object construction into the runner context Add RunnerContext.create_checkpoint_object alongside create_checkpoint (create_checkpoint now delegates to it and persists), so Runner.capture_checkpoint_object builds the snapshot via the context instead of a one-off get_messages peek primitive. In-flight messages are captured non-destructively (per-source lists copied). The checkpoint-less capturing contexts (azurefunctions, durabletask) raise NotImplementedError to match create_checkpoint. * Remove per-execution bookkeeping from WorkflowExecutor The sub-workflow is a single shared instance, so per-execution ExecutionContext/request routing never provided real isolation. Delegate request/response tracking to the sub-workflow itself: can_handle accepts targeted propagated responses, _handle_response validates against the sub-workflow's pending requests and forwards responses immediately, and on_checkpoint_save embeds only the sub-workflow checkpoint (on_checkpoint_restore keeps a legacy reader for older checkpoints). Also emit the fresh-message/checkpoint-while-pending warning from FunctionalWorkflow.run to match Workflow.run. * Drop redundant decode in WorkflowExecutor.on_checkpoint_restore The storage backend already materializes the full checkpoint on load (FileCheckpointStorage decodes recursively; InMemoryCheckpointStorage deep-copies), so the embedded sub_workflow_checkpoint (and legacy execution_contexts) arrive already decoded - like every other executor's on_checkpoint_restore state. Remove the no-op decode_checkpoint_value calls and the now-unused import. * Clean up * Do not allow checkpoint storage in sub workflow * Address comments * Fix syntax check * Add warning --------- Co-authored-by: Evan Mattson <35585003+moonbox3@users.noreply.github.com> |
||
|
|
d0a0d5a3df |
.NET: Add TodoProvider and AgentModeProvider samples (#7262)
* Add samples for todo and mode providers * Address PR review: add Step21 to samples index and trim slash-command input Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Print agent mode after each turn in AgentMode sample Reflects mode changes the agent makes itself via the mode_set tool. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
c59a65da5e |
.NET: fix InMemoryChatHistoryProvider persisting when service stores history (#7284)
* Fix chat history storage bug * Improve error messaging * Address PR comment |
||
|
|
e90b6de5a7 |
Python: Improve python package management operations (#7274)
* improve package mgmt timings * Address Python release validation review feedback |
||
|
|
d98ac29115 |
Python: Fix duplicate function call on approval round-trip (#7267) (#7271)
* Python: Fix duplicate function call on approval round-trip (#7267) `_replace_approval_contents_with_results` deduped restored function calls against only the message currently being scanned. On an approval round-trip the hosting layer replays the stored `function_call` item and its `mcp_approval_request` item as two separate assistant messages, so the per-message check never fired and the approval request restored a second copy of the call. Only one copy received the function result; the orphaned copy was left unanswered, which the Responses API rejects with "No tool output found for function call call_<id>". Collect existing call ids across all messages instead, and add a restored call to that set so two approval requests for the same call cannot both expand. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * Refactor approval placeholder result handling Refactor approval handling logic to improve clarity and maintainability. * Refactor test to support reused call IDs after completion Updated the test to allow reused call IDs after completion, ensuring that a completed call does not suppress later approval requests with the same ID. Adjusted assertions to reflect the new behavior. --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
040e2705aa |
Promote agent-framework-github-copilot to 1.0.0 (released) (#7302)
Promote the GitHub Copilot package from release candidate (1.0.0rc4) to released (1.0.0): bump the version, switch the classifier to Production/Stable, update PACKAGE_STATUS.md, and drop the --pre install flag from the package and sample READMEs. Add a github-copilot-1.0.0 CHANGELOG section covering the promotion and the input-attachment forwarding shipped in this release. No core/root bump: this is a standalone package promotion and the core[all] extra references the package without a version pin. Copilot-Session: f523064c-60b4-4d18-bf95-c16c5fda9126python-github-copilot-1.0.0 |
||
|
|
8c057507f4 |
Python: Forward GitHub Copilot input attachments as inline blobs (#7300)
* Python: Forward GitHub Copilot input attachments as inline blobs The Python GitHubCopilotAgent built the prompt from message text only, so DataContent (images/documents) passed on input was silently dropped. The .NET provider already forwards these as attachments. Map input data content to the Copilot SDK's inline BlobAttachment (base64, no temp files) in both the streaming and non-streaming send paths. Data content without a media type is dropped with a warning instead of silently. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: ac85c429-4115-42ef-a18a-f576e3cf03f7 * Python: Handle non-base64 data URIs and fix attachment docstring Address PR review feedback: - Guard _get_data_bytes_as_str against ContentError so a non-base64 data: URI (which _validate_uri still classifies as type="data") is skipped with a warning instead of failing the entire Copilot request. - Correct the docstring: remote URIs and non-base64 data URIs are neither attached nor added to the prompt (the prompt is built from text content only). - Add tests for the non-base64 data URI path. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: ac85c429-4115-42ef-a18a-f576e3cf03f7 * Python: Fix flaky attachment test under telemetry The end-to-end non-base64 data URI test failed in CI because GitHubCopilotAgent's telemetry layer serializes message content (observability._to_otel_part -> _get_data_bytes_as_str), which raises ContentError on a non-base64 data: URI before the attachment code runs. That is an unrelated core-observability limitation, not attachment behavior. Use RawGitHubCopilotAgent (no telemetry layer) for that test so it isolates the provider's send path. The direct helper test still covers the ContentError guard. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: ac85c429-4115-42ef-a18a-f576e3cf03f7 --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: ac85c429-4115-42ef-a18a-f576e3cf03f7 |
||
|
|
0d5c0f8fa0 |
.NET: Add language and prompt customization to Magentic orchestration (#7263)
* Add language and prompt customization to Magentic orchestration * Update default prompts formatting |
||
|
|
217912a2c0 |
Python: Support async credentials in FoundryToolbox (#7208)
* Python: Support async credentials in `FoundryToolbox` * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Refactor: Use AzureCredentialTypes for credential type annotations in Toolbox classes * Remove auth_flow method from _ToolboxAuth class --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> |
||
|
|
0841116330 |
Python: fix(foundry_hosting): preserve auth credentials across FoundryToolbox reconnections (#7202)
* fix(foundry_hosting): preserve auth credentials across FoundryToolbox reconnections * Address copilot comments * fix syntax check * Fix tests * Fix formatting * Fix formatting --------- Co-authored-by: Tao Chen <taochen@microsoft.com> |
||
|
|
cd6345e91e |
Python: Align AG-UI workflow cache scoping (#7277)
* snapshot scope resolver isolation * Fix AG-UI scope resolver test typing |
||
|
|
59b979213a |
Python: Fix stale agent.json references in A2A sample (#7281)
Co-authored-by: Amit Dhawan <amit.dhawan@barco.com> |
||
|
|
ad26cfe8c7 |
.NET: Switch to using new community toolkit VectorData packages (#5694)
* Switch to using new community toolkit VectorData packages * Fix formatting. * Update dotnet/Directory.Packages.props Co-authored-by: Adam Sitnik <adam.sitnik@gmail.com> * Fix build error. * Upgrade MEAI * Upgrade additional dependencies * Address rename after package upgrade. * Revert some packages versions due to version mismatches --------- Co-authored-by: Adam Sitnik <adam.sitnik@gmail.com> |
||
|
|
0c8bf5b6c0 |
Bump brace-expansion in /python/packages/devui/frontend (#7232)
Bumps [brace-expansion](https://github.com/juliangruber/brace-expansion) from 1.1.12 to 1.1.16. - [Release notes](https://github.com/juliangruber/brace-expansion/releases) - [Commits](https://github.com/juliangruber/brace-expansion/compare/v1.1.12...v1.1.16) --- updated-dependencies: - dependency-name: brace-expansion dependency-version: 1.1.16 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
cb2914fa7e |
Bump agent-framework-hosting-a2a to 1.0.0a260723 (#7282)
Prepare the focused alpha release for the progressive A2A adapters from #7258. No other package versions or dependency bounds change. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 003e02dd-dba0-40a5-9ebf-083901aefb57python-hosting-a2a-1.0.0a260723 |
||
|
|
0796af0c26 |
Python: add progressive A2A hosting adapters (#7258)
* Python: add progressive A2A hosting adapters Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 5d6987cd-1b67-4ba1-8b54-3c50da6e7607 * Python: address A2A adapter review feedback Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 5d6987cd-1b67-4ba1-8b54-3c50da6e7607 --------- Copilot-Session: 5d6987cd-1b67-4ba1-8b54-3c50da6e7607 |
||
|
|
711d6f24ae |
Bump Python package versions for 1.12.1 release (#7273)
Bump root and core to 1.12.1, OpenAI to 1.11.0 for new public prompt-cache options, Foundry to 1.10.3, and Gemini and Foundry Hosting to beta 260722 based on CHANGELOG entries. Promote AG-UI from 1.0.0rc9 to stable 1.0.0. No beta cohort bump was applied, and core floors remain unchanged under the strict affected-dependency policy because the connectors do not require a new core API.python-1.12.1 |
||
|
|
bd17a64697 |
Restore dedicated DevFlow Copilot authentication (#7276)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: d9fa4e9c-c32d-42fb-8ee4-4772473e6479 |
||
|
|
5147579992 |
Python: Enforce package coverage by lifecycle (#7261)
* Enforce Python coverage by package lifecycle Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 9ae5ad8e-6b66-41b3-a862-4e2a3fae1cd0 * Fix Python CI and deprecation usage Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 9ae5ad8e-6b66-41b3-a862-4e2a3fae1cd0 * Make POSIX kill-tree test portable Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 9ae5ad8e-6b66-41b3-a862-4e2a3fae1cd0 --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 9ae5ad8e-6b66-41b3-a862-4e2a3fae1cd0 |
||
|
|
2d34deeb82 |
Reduce workflow credential exposure (#7270)
* Mask workflow authentication configuration Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: d9fa4e9c-c32d-42fb-8ee4-4772473e6479 * Use run-scoped Copilot authentication Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: d9fa4e9c-c32d-42fb-8ee4-4772473e6479 --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: d9fa4e9c-c32d-42fb-8ee4-4772473e6479dotnet-1.15.0 |
||
|
|
a2927c1c09 |
Python: Fix stateless replay of reasoning-paired tool calls (#7233)
* Python: Fix reasoning-paired client tool replay * Python: Handle middleware-terminated reasoning tool loops * Python: Replay encrypted reasoning function groups Key decisions: - Request encrypted reasoning on client-managed Responses calls while preserving caller include values. - Store encrypted payloads in Content.protected_data and reconstruct one provider reasoning item per reasoning id. - Replay active and completed function call/result groups; retain continuation-owned history behavior and the existing orphan-safe MCP path. Files changed: - python/packages/openai/agent_framework_openai/_chat_client.py - python/packages/openai/tests/openai/test_openai_chat_client.py Next iteration: - Extend encrypted reasoning preservation to streaming and framework serialization boundaries. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Python: Preserve encrypted reasoning through streaming Key decisions: - Capture encrypted reasoning from terminal streamed output items in Content.protected_data. - Preserve summary and private reasoning as distinct framework contents while reconstructing one provider reasoning item per id. - Prove replay after Message JSON and workflow checkpoint round trips, including encrypted-only and completed function groups. Files changed: - python/packages/core/agent_framework/_types.py - python/packages/openai/agent_framework_openai/_chat_client.py - python/packages/openai/tests/openai/test_openai_chat_client.py Next iteration: - Extend lossless stateless reasoning replay to hosted MCP call/output groups. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Python: Replay hosted MCP reasoning groups Key decisions: - Preserve hosted MCP call/output groups in client-managed history instead of deleting them when reasoning cannot be reconstructed. - Keep call/result coalescing and orphan-result exclusion intact, while retaining continuation-owned duplicate avoidance. - Cover completed, active, and multi-call reasoning groups plus the public outgoing request boundary. Files changed: - python/packages/openai/agent_framework_openai/_chat_client.py - python/packages/openai/tests/openai/test_openai_chat_client.py Next iteration: - Preserve middleware-terminated and parallel function groups atomically. - Add preflight rejection for non-replayable reasoning groups in the dedicated validation slice. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Python: Preserve terminated parallel reasoning groups Key decisions: - Return ordinary function results when middleware terminates a loop, removing the provider-specific durable marker. - Preserve every parallel call and available sibling result as one encrypted reasoning group in stateless replay. - Prove successful and policy-blocked batches through the public two-agent Foundry workflow and outgoing HTTP boundary. Files changed: - python/packages/core/agent_framework/_tools.py - python/packages/core/tests/core/test_function_invocation_logic.py - python/packages/openai/tests/openai/test_openai_chat_client.py - python/packages/foundry/tests/foundry/test_foundry_agent.py Next iteration: - Add preflight rejection for non-replayable and partially compacted reasoning groups. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Python: Reject unsafe stateless reasoning replay Key decisions: - Validate client-managed reasoning groups after compaction and report every affected reasoning and call identifier before transport. - Permit service-owned continuation and fully excluded atomic groups while rejecting partial compaction projections. - Surface encrypted-reasoning capability failures without lossy retries. Files changed: - python/packages/openai/agent_framework_openai/_chat_client.py - python/packages/openai/tests/openai/test_openai_chat_client.py Next iteration: - Run the resource-specific Foundry proof and finish PR #7233; that live proof remains intentionally local and requires the configured developer resource. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Python: Preserve reasoning metadata in Foundry hosting * Python: Avoid duplicating reasoning text metadata * Python: Gate encrypted reasoning for Foundry agents * Python: Type stateless reasoning integration test * Python: Narrow Foundry mock call arguments --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
c68c099347 |
.NET: Fix expensive logging (#7268)
* .NET: Guard workflow warning logging Avoid unnecessary structured logging argument evaluation when warning logging is disabled, resolving CA1873 in release builds. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 0bc01e26-22ba-42ce-ac1e-6fe166500f4f * .NET: Use generated workflow logging Align the no-progress warning with the repository-standard LoggerMessage source generator pattern. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 0bc01e26-22ba-42ce-ac1e-6fe166500f4f * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Ben Thomas <25218250+alliscode@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Copilot-Session: 0bc01e26-22ba-42ce-ac1e-6fe166500f4f |
||
|
|
61802723ff |
Python: Support prompt cache breakpoints for GPT-5.6 models in OpenAI clients (#7163)
* Python: Support prompt cache breakpoints for GPT-5.6 models in OpenAI clients Add request-level prompt_cache_options to OpenAIChatOptions and OpenAIChatCompletionOptions, and forward a per-part prompt_cache_breakpoint from Content.additional_properties onto the content blocks each API supports. Text parts that carry a breakpoint keep typed list content, since the plain-string form cannot hold one; without a breakpoint the existing string forms are unchanged. * Clarify system-message content-shape comment * Address review: SDK prompt cache types, private helper, add sample Replace the custom PromptCacheOptions TypedDict with the openai SDK's own types for each API, which raises the openai floor to 2.45.0 where those types were introduced. Make the breakpoint helper private to the two chat clients. Add a prompt caching sample with a README entry, and unquote the helper's Content annotation so the pyupgrade hook passes. * Guard the prompt cache options import for older openai versions The SDK's PromptCacheOptions types only exist in openai 2.45.0 and later, so each client falls back to a local mirror when the import fails and the dependency floor stays at 2.25.0. A TYPE_CHECKING-only import is not enough because the options classes are introspected with get_type_hints() at runtime. Verified against openai 2.25.0: the package imports, the fallback resolves, and part-level breakpoints still work; sending the option itself requires 2.45.0, which the field docstrings now note. * Make the old-openai fallback for PromptCacheOptions deliberately empty Assigning None instead, as suggested in review, trips pyright's reportInvalidTypeForm on the field annotation (the symbol becomes type | None after the try/except). An empty TypedDict gives the same effect for users on older openai versions: any content they put in prompt_cache_options is flagged by their type checker, since the option cannot be sent on those versions anyway, while get_type_hints() on the options classes keeps working at runtime. * Guard prompt_cache_options at runtime instead of via an empty fallback type The empty-TypedDict fallback flagged valid `prompt_cache_options` usage under pyright on every openai version — including this PR's own `client_prompt_caching.py` sample (`poe check -S`) — because pyright resolves the try/except symbol to the fallback shape regardless of the installed openai, while mypy/ty resolve the failed import to `Any` and never warn. So a type-only "warn on old openai" signal is not achievable cleanly across type checkers. Restore the faithful fallback (mirrors the SDK's `mode`/`ttl` shape) so the option type-checks identically on every supported openai version, and add a runtime guard: setting `prompt_cache_options` on openai < 2.45 now raises a clear ChatClientInvalidRequestException instead of forwarding an unusable option to the SDK. This keeps the option non-silent for all users regardless of type checker, without forcing an openai upgrade. Adds tests covering the guard for both clients. * Gate system/developer breakpoint shape on a real mapping value The system/developer branch switched to list-form content whenever prompt_cache_breakpoint was set to any non-None value, but the option is only attached when the value is a mapping. A malformed value (e.g. a string) therefore changed the message shape without adding a breakpoint. Decide the shape from the built part instead, matching the user-role path. |
||
|
|
ddb0622f9c |
.NET: Added GettingStarted example demonstrating Dapr as an agent provider (#1615)
* Added example demonstrating creating an AIAgent using the Microsoft.AI.Extensions implementation of IChatClient using Dapr as the inference backend provider - in this example, using Ollama Signed-off-by: Whit Waldo <whit.waldo@innovian.net> * Update dotnet/samples/GettingStarted/AgentProviders/Agent_With_Dapr/README.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Added copyright statement at top of file Signed-off-by: Whit Waldo <whit.waldo@innovian.net> * Update dotnet/agent-framework-dotnet.slnx That's odd the IDE added it a second time. Co-authored-by: westey <164392973+westey-m@users.noreply.github.com> * Address review nits: configurable Dapr gRPC endpoint and document VersionOverride Make the Dapr sidecar gRPC endpoint configurable via the DAPR_GRPC_ENDPOINT environment variable (defaulting to http://localhost:3501) and document it in the README. Add a comment explaining why the Microsoft.Extensions.* VersionOverride entries are needed and when they can be removed. --------- Signed-off-by: Whit Waldo <whit.waldo@innovian.net> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: westey <164392973+westey-m@users.noreply.github.com> Co-authored-by: Roger Barreto <19890735+RogerBarreto@users.noreply.github.com> |
||
|
|
12b23250f4 |
Updating dotnet version for release. (#7265)
Co-authored-by: Ben Thomas <25218250+alliscode@users.noreply.github.com> |
||
|
|
bfc73a5b14 |
.NET: Fix declarative autosend output (#7217)
* Fix declarative workflow auto-send output Restore completed responses for workflow-conversation agents while preventing hosted workflow adapters from materializing streamed responses twice. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: c2d86826-ead0-40bc-b84b-a513ac4d325f * Correlate streamed workflow responses by message Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: c2d86826-ead0-40bc-b84b-a513ac4d325f * Handle empty streaming message IDs Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: c2d86826-ead0-40bc-b84b-a513ac4d325f * Restore workflow conversation auto-send Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: c2d86826-ead0-40bc-b84b-a513ac4d325f * Address workflow response review feedback Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: c2d86826-ead0-40bc-b84b-a513ac4d325f * Ignore whitespace workflow message IDs Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: c2d86826-ead0-40bc-b84b-a513ac4d325f * Correlate all content-bearing agent updates Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: c2d86826-ead0-40bc-b84b-a513ac4d325f --------- Co-authored-by: Ben Thomas <25218250+alliscode@users.noreply.github.com> |
||
|
|
1f1da1bddb |
.NET: [BREAKING] Hosting OpenAI Responses protocol helpers and optional execution state (#7000)
* .NET: Add OpenAI Responses protocol helpers and optional execution state (ADR-0032)
* Fix netstandard2.0/net472 build; harden helpers and workflow checkpoint key per review
* .NET: Migrate hosting Responses samples to Azure.AI.Projects and fix workflow resume
Migrate HostingResponsesAgent and HostingResponsesWorkflow samples from
Azure.AI.OpenAI to Azure.AI.Projects (AIProjectClient.AsAIAgent), using the
FOUNDRY_PROJECT_ENDPOINT/FOUNDRY_MODEL convention.
Fix HostedWorkflowState.RunOrResumeAsync: on subsequent turns, restore the
session's latest checkpoint and run the workflow forward with the new turn's
input (mirroring the Python hosting host's restore-then-run semantics) instead
of resuming a halted run with no input, which waited on input indefinitely.
Add round-trip resume tests and update ADR-0032/spec-003 wording.
* .NET: Fix HostedWorkflowState resume hang on unserviced external requests
On resume, HostedWorkflowState.RunOrResumeAsync drained the workflow with the
blocking WatchStreamAsync overload, so a workflow that halts at an unserviced
RequestInfoEvent (human-in-the-loop / approval) blocked forever — asymmetric
with the first-turn RunAsync path, which returns at the same halt. Break the
drain when a superstep completes with HasPendingRequests, restoring symmetry
with turn 1. Add a HITL approval-gate workflow and a resume-does-not-block test.
* .NET: Warn when a HostedWorkflowState resume makes no progress
Add an optional ILoggerFactory to HostedWorkflowState and log a warning when a
resumed turn produces no events, mirroring the Python host's zero-event restore
warning (a stale checkpoint or an input that does not match the workflow's
expected type leaves session state unprogressed). Add a non-chat string workflow
helper, a capturing logger, and a red/green test.
* .NET: Resume HostedWorkflowState from durable checkpoint on cursor miss
Add CheckpointManager.GetLatestCheckpointAsync(sessionId) and have
HostedWorkflowState fall back to it when its in-memory head cursor misses, so a
durable CheckpointManager resumes a session across a process restart or a new
holder instead of restarting from the workflow's start executor. Mirrors the
Python host's per-turn get_latest read-through. Add a counting workflow that
proves resume-vs-fresh via accumulated state, plus a red/green test, and update
ADR-0032/spec-003 and the XML remarks.
* .NET: Serialize HostedWorkflowState turns through a workflow lock
A single workflow instance backs the holder and workflow instances do not
support concurrent runs (the runner throws "already owned by another runner"),
so concurrent turns could fault or race the head cursor. Serialize all turns
through one SemaphoreSlim (mirroring the Python host's workflow lock) and make
HostedWorkflowState IDisposable to own it. Add a gated workflow and a
deterministic concurrency red/green test.
* .NET: Cover non-chat resume and multi-turn checkpoint advance
Add tests for HostedWorkflowState resuming a non-chat-protocol workflow (no
TurnToken) and for a third turn continuing to advance the head checkpoint,
closing the coverage gaps the parity review flagged.
* .NET: Add streaming workflow resume path and stream the workflow sample
Add HostedWorkflowState.RunOrResumeStreamingAsync, which yields the turn's
WorkflowEvents as they occur (fresh run or checkpoint resume) under the same
serialization lock and records the head checkpoint after the stream drains,
keeping the blocking and streaming workflow paths in lockstep with the Python
host. Honor stream:true in the HostingResponsesWorkflow sample by projecting
AgentResponseUpdateEvent updates over the Responses SSE wire. Add a streaming
resume test and update the README/spec.
* .NET: Cover Responses input adaptation to a typed workflow start executor
Demonstrate that HostedWorkflowState's generic RunOrResumeAsync<TInput> is the
input-adaptation seam (parity with Python's ResponsesChannel run hook): the app
adapts the Responses input into the workflow start executor's own type at the
call site. Add a typed-brief workflow and a test, and note the seam in spec-003.
* .NET: Drain workflow resume non-blocking to prevent hang and truncation
The resume drain used a SuperStepCompletedEvent{HasPendingRequests} proxy over
the blocking public WatchStreamAsync. That proxy (a) truncated a resumed turn
when a superstep both emitted a request and queued downstream work, and (b)
could fail to fire at all — re-introducing the indefinite hang — when a resume
input drove no superstep (e.g. a rejected non-chat input).
Make StreamingRun.WatchStreamAsync(bool blockOnPendingRequest, CancellationToken)
public and drain both the blocking and streaming resume paths with
blockOnPendingRequest:false, exactly matching the first-turn RunAsync semantics
(Run.RunToNextHaltAsync). Add guard tests: resume with a rejected input does not
hang, and a resume superstep with a request plus downstream work is not
truncated (verified red against the old proxy).
* .NET: Return file-store checkpoint index in commit order
CheckpointManager.GetLatestCheckpointAsync takes the last entry of a store's
index as the head checkpoint. FileSystemJsonCheckpointStore backed its index
with a HashSet, whose enumeration order is not contractual: after a rollback
frees and reuses a slot, enumeration can diverge from commit order, so the
durable read-through could resume a stale checkpoint. Mirror the HashSet with an
insertion-ordered list and enumerate it from RetrieveIndexAsync so 'latest' is
reliable. Add a CheckpointManager.GetLatestCheckpointAsync contract test over the
file store.
Note: the HashSet disorder is only reachable via the internal rollback path, so
the test locks the ordering contract rather than reproducing the rare disorder.
* .NET: Advance cursor when a streaming resume is abandoned
RunOrResumeStreamingAsync recorded the head checkpoint only after the stream was
fully enumerated. If an SSE consumer disconnected mid-turn after supersteps had
committed, the in-memory cursor kept the previous turn's head; because the next
turn is then a cursor hit, durable read-through could not self-heal, so it
resumed pre-disconnect state. Record the run's last committed checkpoint in a
finally so an abandoned stream still advances the cursor. Add a red/green test.
* .NET: Stream only the final agent's updates in the workflow sample
ExtractUpdates streamed every agent's updates, so the sequential Writer->Reviewer
sample streamed the intermediate draft and the final answer over SSE, differing
from the non-streaming response (final message only). Filter the streamed updates
to the final agent so streaming and non-streaming produce the same response.
Live-verified against Foundry: one output item streamed instead of two.
* .NET: Isolate the holder lock in the concurrency test
The concurrency test asserted the second same-session turn did not enter the
workflow, which also passes via the engine's concurrent-run ownership guard
(which faults) rather than the holder lock (which waits). Assert instead that the
second turn is not completed while the first holds the lock: a fault would
complete the task, so a pending task isolates the holder lock from the engine
guard. Verified red with the lock removed.
* Fix IDE1006 naming in tests; address review feedback and add hosting/live tests
* Document commit-order contract for ICheckpointStore.RetrieveIndexAsync
* Restructure hosting samples under af-hosting with client/server split matching Python parity
* Clarify hosting sample README wording and drop Python comparisons
* Make AgentSessionStore.DeleteSessionAsync abstract and rename session id parameter to sessionStoreId
* Rename OpenAIResponses id helpers and parse the request once for id extraction
* Reclaim per-session locks in HostedAgentState and demonstrate session locking in the agent sample
* Internalize per-session locking in HostedAgentState (automatic, on by default) and remove mirroring-Python wording from code and spec
* Remove HostedAgentState; app-owned routes use AgentSessionStore directly
HostedAgentState only bundled an AIAgent with an AgentSessionStore and, after
the per-session lock was removed, its GetOrCreateSessionAsync/SaveSessionAsync/
DeleteSessionAsync were pass-throughs that just bound the agent argument.
Create-on-miss already lives in the store (unlike Python, whose get/set-only
SessionStore justifies its AgentState holder), so the type earned its place
only via the lock.
Each AgentSessionStore.GetSessionAsync now returns an independent session
instance per call, so concurrent gets fork the same stored state (e.g.
branching from previous_response_id or managing several conversation ids)
without sharing an instance. The store does no cross-call locking; serializing
concurrent runs against the same id is the application's concern.
- Delete HostedAgentState and its unit tests.
- Rewire the local_responses sample and the OpenAI hosting unit/integration
tests to call AgentSessionStore (GetSessionAsync/SaveSessionAsync) directly.
- Update ADR-0032, spec-003, and the af-hosting sample READMEs.
* Isolate hosted session snapshots and distinguish conversation vs response continuation
Mirrors the Python hosted-session isolation work: a hosted session read must be
an independent copy, and the app-owned route must persist under the right
continuation key depending on how the caller continued the thread.
- AgentSessionStore.GetSessionAsync: document the isolation invariant (each
call returns an independent AgentSession so concurrent branches from one
previous_response_id do not observe each other's mutations or alter stored
state); fix the stale "or null if not found" wording (in-box stores return a
fresh created session on miss). The in-box stores already satisfy this via a
serialize/deserialize snapshot round-trip.
- local_responses sample + hosting unit-test route: choose the save key by
channel. A stable conversation id is a mutable head (write back under the
same id; app owns single-writer coordination). A previous_response_id
continuation or first turn is an immutable snapshot (save under the new
response id so branches from the same prior response stay independent).
- Add regression tests: independent get returns a distinct instance
(InMemoryAgentSessionStore); previous_response_id supports independent
branches ([1,2,2,3,3]); conversation id advances the mutable head ([1,2]).
- Update the sample README and ADR-0032 wording.
* Add workflow-factory support to HostedWorkflowState for concurrent sessions
HostedWorkflowState backed every session with one shared Workflow instance and
serialized all turns through a lock, so independent sessions could not run
concurrently. Add a workflow-factory constructor and remove the run lock.
- New constructor HostedWorkflowState(Func<CancellationToken, ValueTask<Workflow>>
workflowFactory, ..., bool cacheWorkflow = false):
- cacheWorkflow: false (default) builds a fresh instance per run, so independent
sessions run in parallel. A resume rehydrates a fresh instance from the
session's checkpoint in the shared store.
- cacheWorkflow: true builds the workflow once, lazily on first use, and reuses
it (a deferred, cached target that, like a shared instance, cannot run
concurrent turns).
- Remove the internal SemaphoreSlim run lock and IDisposable; the instance
constructor is unchanged in behaviour (one shared instance still cannot run
concurrent turns). Turns are no longer serialized by the holder; a single
writer per session is the application's responsibility.
- Switch the local_responses_workflow sample to the factory constructor with an
explicit cacheWorkflow: false, and document the option.
- Add tests: parallel independent sessions (factory), fresh-instance resume,
cached factory builds once and reuses, uncached factory builds per run.
- Update ADR-0032, spec-003, and the sample README.
* Clarify in ADR-0032 how .NET covers AgentState factory and async-setup via DI
* Rebuild cached workflow after a faulted build and add checkpoint index dedup tests
|
||
|
|
83ba938d1e |
Python: preserve Gemini 3 thought_signature across function-call replays (#7095)
* Python: preserve Gemini 3 thought_signature across function-call replays Gemini 3 requires the opaque thought_signature attached to each functionCall part to be echoed back on every replay of that call, or the request is rejected with 400 INVALID_ARGUMENT. The signature previously survived only via raw_representation, so any layer that reconstructs a FunctionCallContent (e.g. harness tool approval) dropped it and broke the next step of the tool loop. Capture the signature into additional_properties on parse and replay it when building the Gemini Part, independent of raw_representation. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 33233834-bc6e-4ad2-a6f3-6f1d6e57b1d2 * Store Gemini thought_signature as base64 for JSON-safe persistence Content.additional_properties is serialized via json.dumps(message.to_dict()) by history providers (e.g. RedisHistoryProvider), which fails on raw bytes. Store the thought_signature as a base64 string on parse and decode it back to bytes when building the Gemini Part. Also narrow call_id/name in the round-trip test to satisfy the type checkers. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 33233834-bc6e-4ad2-a6f3-6f1d6e57b1d2 * Harden Gemini thought_signature decode against corrupted history Guard the untyped additional_properties value with an isinstance(str) check and decode with validate=True, degrading gracefully (warn + drop the signature) on malformed data instead of raising binascii.Error mid tool loop. Matches the defensive base64 handling already used for data URIs in this file. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 33233834-bc6e-4ad2-a6f3-6f1d6e57b1d2 * Carry Gemini thought_signature on reasoning content via protected_data Represent the signature as a text_reasoning content's protected_data (base64) immediately preceding the function call, instead of a bespoke additional_properties key. This uses the framework's first-class opaque-signature field (as Anthropic does), survives streaming accumulation, and stays intact when the harness reconstructs the function call. Replay correlates the signature by adjacency. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 33233834-bc6e-4ad2-a6f3-6f1d6e57b1d2 --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
d97c901301 |
Harden workflow credential selection (#7249)
* Harden workflow credential selection Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: d9fa4e9c-c32d-42fb-8ee4-4772473e6479 * Address workflow authentication review feedback Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: d9fa4e9c-c32d-42fb-8ee4-4772473e6479 * Fail safely on membership lookup errors Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: d9fa4e9c-c32d-42fb-8ee4-4772473e6479 --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
d1d2610b28 | Add MCPStreamableHTTPTool security guidance for custom http client (#7245) | ||
|
|
848443ac68 |
[BREAKING] Python: Ensure session isolation for FHA invocation impl (#7158)
* Ensure session isolation for FHA invocation impl * Fix type check errors * Add user isolation to samplepython-1.12.0 |
||
|
|
1466d68cf1 |
Python: make FoundryToolbox.as_skills_provider() disable_caching effective (#7135)
* Python: make FoundryToolbox.as_skills_provider() disable_caching effective as_skills_provider() forwarded disable_caching to SkillsProvider, which ignores it for a caller-supplied SkillsSource, so it was a no-op and the toolbox re-read skill://index.json on every agent run. Compose caching in as_skills_provider() instead: wrap the context-independent _FoundryToolboxSkillsSource in DeduplicatingSkillsSource(CachingSkillsSource(...)). Add a cache_refresh_interval param, fix the docstring, and add tests covering cached, disabled, and refresh-interval behavior. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 84150ec4-6f7c-4ef8-b9fb-12fa11652773 * Clarify caller-invariant skill-set wording in as_skills_provider docs Emphasize that the toolbox advertises the same skill set to every caller (the per-request call-id governs execution/authorization, not which skills are listed) rather than leaning on 'ignores SkillsSourceContext'. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 84150ec4-6f7c-4ef8-b9fb-12fa11652773 * Make MCP skills reconnect-safe via session_provider Cached MCPSkill objects captured the MCP ClientSession at construction, so after a FoundryToolbox reconnect (which replaces its session) load_skill and read_skill_resource would fail against the closed session. This regressed once as_skills_provider() started caching discovery by default. Add an optional session_provider callable to MCPSkillsSource and MCPSkill (exactly one of client or session_provider). When supplied, the session is resolved on every fetch, mirroring how MCPTool resolves self.session live at call time. _FoundryToolboxSkillsSource now passes a provider that returns the toolbox's current session, so cached skills always use the live session. The fixed client= path is unchanged and backward-compatible. Update core tests, foundry_hosting tests, and core AGENTS.md. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 84150ec4-6f7c-4ef8-b9fb-12fa11652773 * Fix ty error: type captured session_provider as Callable in test ty could not call the provider narrowed from \object\ (Top callable). Type the captured value as Callable[[], object] and drop the redundant callable() assert. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 84150ec4-6f7c-4ef8-b9fb-12fa11652773 * Simplify _resolve_mcp_session_provider per review Address review feedback: replace the dense (client is None) == (session_provider is None) guard with explicit branches, and drop the cast by binding the narrowed client to a typed local. Keeps strict 'exactly one' semantics (raises on both and on neither), matching the codebase convention (e.g. security.py mcp_tool/url). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 84150ec4-6f7c-4ef8-b9fb-12fa11652773 * Add PR #7135 entries to the 1.12.0 changelog Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 84150ec4-6f7c-4ef8-b9fb-12fa11652773 * Drop redundant @pytest.mark.asyncio from MCP skills tests asyncio_mode is 'auto', so the marker is unnecessary. Remove it from the whole file for consistency with the async-by-default convention. Per review feedback. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 84150ec4-6f7c-4ef8-b9fb-12fa11652773 --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
d08200d00e |
Python: Bump package versions for 1.12.0 release (#7238)
* Bump Python package versions for 1.12.0 release Bump packages represented in the 1.12.0 changelog, promote Foundry Hosting, Azure Content Understanding, Gemini, Mistral, Monty, and Tools to beta, and apply the requested beta cohort date stamp. Root and core move to 1.12.0, released and RC packages use their selected increments, alpha packages including Hosting MCP use the 260721 stamp, and core floors are raised only for proven consumers. Copilot-Session: 2dd9980a-b869-4c16-8642-75b7a6d6ebdf * fix version in readme * Add Responses conversation ID changes to release notes Include the breaking Hosting Responses conversation ID helper changes from #7234 in the Python 1.12.0 changelog. Copilot-Session: 2dd9980a-b869-4c16-8642-75b7a6d6ebdfdotnet-1.14.0 |
||
|
|
fb38b1d10a |
Python: Fix PropertySchema.to_json_schema() not recursing into nested array items / object properties (#7200)
* Python: Fix PropertySchema.to_json_schema() not recursing into nested schemas
Nested array 'items' and object 'properties' kept the declarative 'kind'
key and empty 'enum' placeholders, producing JSON Schema OpenAI rejects
('schema must have a type key'). Recursively apply the same conversion the
top-level properties loop performs, including the serialized named-list
properties shape and nested required arrays.
Fixes #7198
(cherry picked from commit c156ffd05924fb5a1884625f2fc3d9bdc3e152b1)
* Python: Validate nested properties list before mutating to avoid partial conversion
Review feedback: the list-shaped properties branch popped name/required from
each element and returned on the first unexpected one, leaving earlier
elements half-converted. Validate the whole list first so an unexpected
shape leaves the node fully untouched.
* Python: Type nested-properties normalization for strict Pyright and drop unreachable dict branch
ObjectProperty always stores nested properties as a named list, so the
elif-dict branch in _normalize_nested_schemas was unreachable; remove it
and flatten the list conversion behind an early return. Cast the narrowed
items/props values so strict Pyright no longer reports unknown types.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Python: Emit additionalProperties: false on nested object nodes in PropertySchema.to_json_schema()
OpenAI strict structured outputs require additionalProperties: false on
every object node, but the chat clients only inject it at the schema
root, so declarative schemas with nested objects (e.g. array items)
failed with a schema-validation 400. Route the top-level properties loop
through _normalize_schema_node so all object nodes get the key, and add
a live OpenAI integration test covering the nested array-of-objects
response_format shape.
Verified live against the Responses API: the previous emission fails
with "In context=('properties', 'issues', 'items'),
'additionalProperties' is required to be supplied and to be false";
the new emission returns valid structured output.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
|
||
|
|
a70fe21298 |
[BREAKING] Python: add Responses conversation ID helper (#7234)
* Python: add Responses conversation ID helper Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 2dd9980a-b869-4c16-8642-75b7a6d6ebdf * Python: make Responses session flag optional Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 2dd9980a-b869-4c16-8642-75b7a6d6ebdf * Python: correlate Responses session return types Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 2dd9980a-b869-4c16-8642-75b7a6d6ebdf * Python: clarify Responses conversation parameter Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 2dd9980a-b869-4c16-8642-75b7a6d6ebdf * Python: clarify streaming conversation parameter Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 2dd9980a-b869-4c16-8642-75b7a6d6ebdf * Python: include conversation in created event Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 2dd9980a-b869-4c16-8642-75b7a6d6ebdf * Python: warn on nonstandard Responses IDs Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 2dd9980a-b869-4c16-8642-75b7a6d6ebdf |
||
|
|
f6a3c43e9a | .NET: Add source-type-agnostic consent regression test for a2a_preview (#7229) | ||
|
|
e6f7b3e9be | Version bump for .net release (#7237) | ||
|
|
a1f3e536bc |
Python: Add MCP hosting helpers (#7209)
* Python: Add MCP hosting helpers Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 5d6987cd-1b67-4ba1-8b54-3c50da6e7607 * Python: Address MCP hosting review comments Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 5d6987cd-1b67-4ba1-8b54-3c50da6e7607 * renamed to AgentMCPTool |
||
|
|
c033adb1f4 |
.NET: [BREAKING] Graduate HarnessAgent (#7119)
* Graduate HarnessAgent * Switch harness project to released and remove unreleased shell dependency * Address PR comments. |
||
|
|
09473fa7ed |
.NET: [BREAKING] Bind tool-approval responses to surfaced approval requests (#7111)
* .NET: Bind tool-approval responses to surfaced approval requests Harden the tool-approval flow so an approved tool call always matches the request the framework surfaced for approval. Add ApprovalResponseBindingChatClient as the outermost decorator above FunctionInvokingChatClient. It records each model-originated ToolApprovalRequestContent in the session state and, on the next request, binds every ToolApprovalResponseContent to its recorded request: the response tool call is rebound to the recorded call, matched entries are consumed for one-time use, and only approvals tied to a framework-issued request take effect. Apply the same binding in the ToolApprovalAgent harness by tracking the requests it surfaces and binding collected responses to them during a queue cycle. Add ChatClientAgentOptions.DisableApprovalResponseBinding (default off) and a UseApprovalResponseBinding builder extension for custom chat client stacks. Includes unit tests for the decorator and the harness. * .NET: Bind approval responses once per turn and avoid re-enumeration Address review feedback on the approval-response binding decorator: consume a matched request from the per-turn lookup so a duplicate response with the same request id in one turn is honored only once, and return the materialized message list instead of the original enumerable so a single-use sequence is not enumerated twice. Rename the local pending list to pendingRequests for clarity. Adds a duplicate-response regression test. * .NET: Snapshot recorded approval requests and consume duplicates in the harness Address review feedback on ToolApprovalAgent: store a snapshot of each surfaced/pending approval request (cloned tool call with a copied arguments dictionary) so a later mutation of the caller-visible instance cannot change the recorded call used to bind the response, and consume a surfaced request on match so a duplicate response with the same request id in one pass is honored only once. Apply both symmetrically in the harness and the ApprovalResponseBindingChatClient decorator. Adds regression tests for the snapshot and duplicate-response cases. * .NET: Address review feedback on approval-response binding - Harness: store surfaced approval requests in a dictionary and consume matches directly, drop the extra hashset and the redundant record-time dedup; replace clear-on-resolution with a debug assert. - Harness pipeline: add UseApprovalResponseBinding() as the outermost decorator in HarnessAgent (it uses UseProvidedChatClientAsIs) behind a new DisableApprovalResponseBinding option, with tests. - Decorator: avoid message/content allocations when nothing changes, keep the original content when a response already matches the recorded call, clear pending each inbound turn, and shorten helpers. * .NET: Compare tool calls by fields instead of serializing Replace the JSON-serialization comparison in the approval-response binding decorator with a direct field comparison. Fast-path FunctionCallContent by comparing CallId, Name, and arguments field by field; any other tool call shape rebinds. The comparison only skips an allocation (the call is always rebound to the recorded request otherwise), so a miss just triggers a safe rebuild. Adds a test that a matching response is forwarded unchanged. * .NET: Bind approval responses against requests present in history Fix a merge-queue regression where AG-UI mixed server/client tool invocation stopped executing the server tool. The binding decorator validated approval responses only against its own recorded pending state, so a matched approval request/response pair replayed from conversation history was treated as unbound and dropped, and the auto-approved server tool never ran. Treat known requests as the recorded pending state plus any approval requests already present in the current messages, and stop dropping approval requests (a request in history is the pairing authority). A response with no known request anywhere is still dropped, so a forged approval cannot execute. Also address review feedback: return the mutable contents buffer from a helper instead of a null-forgiving operator, and use clearer naming (PrepareMutableContentsBuffer / mutableContentsBuffer). Adds regression tests for a request in history and a response bound to a history request with empty pending state. |
||
|
|
a4f02aabf0 |
Python: Fix header_provider headers not reaching streamable HTTP transport requests (#7218)
* Python: fix header_provider headers not reaching streamable HTTP requests MCPStreamableHTTPTool.call_tool stores header_provider output in a ContextVar, but the streamable HTTP transport sends requests from tasks spawned at connect time, whose contexts never observe values set later. The request hook therefore always read an empty dict on real connections and the per-call headers (e.g. Authorization) were silently dropped. Keep the ContextVar for in-context reads and add an instance-level snapshot of the active call's headers that the request hook falls back to across tasks. * Python: serialize header_provider tool calls to prevent cross-call header mixing Parallel tool invocations run concurrently per function-invocation batch, so two call_tool invocations on the same MCPStreamableHTTPTool could overwrite each other's active-header snapshot while requests were still in flight, attaching the wrong per-call credentials. Hold a per-instance lock for the duration of a header-bearing call, add a regression test that fails without the lock, and normalize captured header casing in the transport-task test. |
||
|
|
afdf8af400 |
Python: Prevent compaction from emitting empty projections (#7219)
* Python: preserve a non-empty compaction projection * Python: annotate compaction regression input * Python: document compaction retention floor |
||
|
|
9e836f7b42 |
Python: Return MCP tool-use sampling results (#7189)
* Python: support MCP sampling tool-use results * Python: align MCP sampling test tool schemas * Python: centralize MCP sampling content type |
||
|
|
9cf5143321 |
.NET: Populate AgentResponse metadata in CopilotStudioAgent (#6791)
* .NET: Populate AgentResponse metadata in CopilotStudioAgent Map CreatedAt, FinishReason, RawRepresentation and AdditionalProperties onto AgentResponse and AgentResponseUpdate, and map the activity timestamp and properties onto ChatMessage, so Copilot Studio agents expose the same metadata surface as other AIAgent implementations. Streaming sets the finish reason on the terminal update while still emitting already-received content if the source faults. Add unit tests covering the metadata mapping. * fix: add Async suffix to async test methods (IDE1006) |
||
|
|
b6b16ddb75 |
Python: forward GitHubCopilotOptions verbatim to create_session (#7155)
* Python: forward GitHubCopilotOptions verbatim to create_session Refactor the GitHub Copilot agent to forward the full options dict to the Copilot SDK's create_session/resume_session instead of hand-mapping a fixed subset. GitHubCopilotOptions stays as the curated, typed surface, but any other create_session parameter (reasoning_effort, context_tier, enable_citations, ...) is now passed through verbatim. Unknown keys surface as TypeError from the SDK instead of being silently dropped. De-duplicates the near-identical _create_session/_resume_session bodies into a shared _build_session_kwargs helper. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: f9d016d5-4d8c-43f0-a8fb-f3cf3d1ad7eb * Python: address review feedback on GHCP options passthrough - Strip agent-internal/client-level keys (on_pre_tool_use, on_function_approval, timeout, cli_path, log_level, base_directory) from the forwarded kwargs so they cannot leak into create_session/resume_session and raise TypeError. - Source caller tools from the merged options layer so tools supplied via default_options are honored instead of silently dropped. - Honor a caller-supplied native 'hooks' dict in _build_session_hooks (composing with the on_pre_tool_use shortcut) instead of unconditionally overwriting it. - Validate mock create_session/resume_session calls against the real SDK signatures in tests so invalid kwargs surface as TypeError, and add regression tests for the passthrough contract. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: f9d016d5-4d8c-43f0-a8fb-f3cf3d1ad7eb * Python: avoid redundant re-read of model in _build_session_kwargs model is popped from default_options into settings at init, so a per-run model already lands in the merged kwargs. Keep that value when present and only fall back to the resolved setting otherwise, instead of re-reading opts. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: f9d016d5-4d8c-43f0-a8fb-f3cf3d1ad7eb --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
c218067646 |
Python: Consolidate dependency updates (#7204)
* Bump uv from 0.11.28 to 0.11.29 in /python Bumps [uv](https://github.com/astral-sh/uv) from 0.11.28 to 0.11.29. - [Release notes](https://github.com/astral-sh/uv/releases) - [Changelog](https://github.com/astral-sh/uv/blob/main/CHANGELOG.md) - [Commits](https://github.com/astral-sh/uv/compare/0.11.28...0.11.29) --- updated-dependencies: - dependency-name: uv dependency-version: 0.11.29 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> * Bump zuban from 0.8.2 to 0.9.0 in /python Bumps [zuban](https://github.com/zubanls/zubanls-python) from 0.8.2 to 0.9.0. - [Release notes](https://github.com/zubanls/zubanls-python/releases) - [Commits](https://github.com/zubanls/zubanls-python/compare/v0.8.2...v0.9.0) --- updated-dependencies: - dependency-name: zuban dependency-version: 0.9.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> * PR #7146: Bump ty from 0.0.55 to 0.0.60 in /python * Bump ruff from 0.15.20 to 0.15.22 in /python Bumps [ruff](https://github.com/astral-sh/ruff) from 0.15.20 to 0.15.22. - [Release notes](https://github.com/astral-sh/ruff/releases) - [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md) - [Commits](https://github.com/astral-sh/ruff/compare/0.15.20...0.15.22) --- updated-dependencies: - dependency-name: ruff dependency-version: 0.15.21 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> * Bump mypy from 2.2.0 to 2.3.0 in /python Bumps [mypy](https://github.com/python/mypy) from 2.2.0 to 2.3.0. - [Changelog](https://github.com/python/mypy/blob/master/CHANGELOG.md) - [Commits](https://github.com/python/mypy/compare/v2.2.0...v2.3.0) --- updated-dependencies: - dependency-name: mypy dependency-version: 2.3.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> * Bump prek from 0.4.8 to 0.4.10 in /python Bumps [prek](https://github.com/j178/prek) from 0.4.8 to 0.4.10. - [Release notes](https://github.com/j178/prek/releases) - [Changelog](https://github.com/j178/prek/blob/master/CHANGELOG.md) - [Commits](https://github.com/j178/prek/compare/v0.4.8...v0.4.10) --- updated-dependencies: - dependency-name: prek dependency-version: 0.4.10 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> * Bump azure-ai-projects from 2.2.0 to 2.3.0 in /python Bumps azure-ai-projects from 2.2.0 to 2.3.0. --- updated-dependencies: - dependency-name: azure-ai-projects dependency-version: 2.3.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> * Bump types-python-dateutil in /python Bumps [types-python-dateutil](https://github.com/python/typeshed) from 2.9.0.20260518 to 2.9.0.20260716. - [Commits](https://github.com/python/typeshed/commits) --- updated-dependencies: - dependency-name: types-python-dateutil dependency-version: 2.9.0.20260716 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> * Bump mypy from 2.2.0 to 2.3.0 in /python Bumps [mypy](https://github.com/python/mypy) from 2.2.0 to 2.3.0. - [Changelog](https://github.com/python/mypy/blob/master/CHANGELOG.md) - [Commits](https://github.com/python/mypy/compare/v2.2.0...v2.3.0) --- updated-dependencies: - dependency-name: mypy dependency-version: 2.3.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> * Bump botocore from 1.43.45 to 1.43.49 in /python Bumps [botocore](https://github.com/boto/botocore) from 1.43.45 to 1.43.49. - [Commits](https://github.com/boto/botocore/compare/1.43.45...1.43.49) --- updated-dependencies: - dependency-name: botocore dependency-version: 1.43.49 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> * PRs #7144/#7147: Align lab uv and ruff pins * Regenerate lockfile for Python Dependabot PRs #7144-#7153 * Python: Support azure-ai-projects 2.3 session operations (#7150) * Python: Apply Ruff 0.15.22 suppression updates (#7147) * Python: Update tests for ty 0.0.60 (#7146) * Python: Update Foundry samples for azure-ai-projects 2.3 (#7150) * Python: Address dependency rollup review comments --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
ac474100ce |
Python: [BREAKING] Graduate create_harness_agent out of experimental (#7120)
* Graduate harness agent * Add agents.md update * Fix build errors * Address PR comments * Fix build error |
||
|
|
a057cd505c |
Python: Add agent-framework-azure-cosmos-memory context provider (#6719)
* Add agent-framework-azure-cosmos-memory context provider (draft) Introduces CosmosMemoryContextProvider, a ContextProvider that wraps the azure-cosmos-agent-memory toolkit to give agents long-term, Cosmos DB-backed memory (fact/procedural recall + user summaries). Includes package scaffolding, unit tests (mocked client), live Azure integration tests (marked), samples, README, and AGENTS.md. Draft: uv.lock is intentionally left unchanged. This package depends on azure-cosmos-agent-memory (requires Python >=3.11), which is unsatisfiable against the workspace's current >=3.10 floor, so adding it to the shared lock requires a workspace decision (raise floor to 3.11 or exclude from workspace). Test coverage to be expanded. * ci: exclude azure-cosmos-memory from uv workspace resolution The package depends on azure-cosmos-agent-memory which requires Python >=3.11 and a prompty pre-release (>=2.0.0a9). Both are unsatisfiable against the workspace's >=3.10 floor and pre-release policy, causing uv sync to fail in every Python CI job. Exclude the package from the shared workspace so it is resolved and tested as a standalone package. * ci: fix code-quality failures for azure-cosmos-memory - Strip trailing whitespace from package files (pre-commit trailing-whitespace hook) - Exclude the package README from markdown-code-lint: the package is excluded from the uv workspace, so its README snippets import a module that is not installed in the workspace env and Pyright cannot resolve it * Exclude azure-cosmos-memory README from markdown-code-lint task * Address PR review comments on cosmos-memory context provider - Wire credential into Cosmos and AI Foundry clients; let toolkit own DefaultAzureCredential when none supplied (remove dead import). - Honor auto_extract=False by zeroing extraction/summary cadence thresholds. - Skip whitespace-only conversation turns and store stripped content. - Show confidence 0.0 and coerce confidence to float in _format_memories. - Register both 'integration' and 'azure' pytest markers accurately. - Fix duplicated install block in README. - Update and extend unit tests for new credential wiring and fixes. * Include azure-cosmos-memory in the uv workspace Follow the github_copilot pattern for a package with a Python 3.11-only dependency: lower requires-python to >=3.10 and gate azure-cosmos-agent-memory behind a python_version >= '3.11' marker. Add a direct, gated prompty pre-release dependency so the workspace's if-necessary-or-explicit prerelease policy permits the toolkit's transitive prompty requirement. Guard the test modules with pytest.importorskip so the 3.10 CI leg skips cleanly. Remove the workspace exclude and the markdown-code-lint exclude, and regenerate uv.lock. * Address review feedback on cosmos-memory provider Rename provider parameters to match Agent Framework conventions: foundry_endpoint (was ai_foundry_endpoint) and embedding_model/chat_model (were *_deployment_name). Move DEFAULT_* to module-level constants, type memory_types as a Literal, use DEFAULT_CONTEXT_PROMPT as the default value, and add ProcessorConfig/CosmosMemorySettings TypedDicts. Resolve connection settings via agent_framework load_settings with required-field validation, replacing the manual getenv/raise blocks. Scope user_id/thread_id to the provider state and drop the unpreventable first-turn warning. Rewrite the samples around Agent (not raw SessionContext), provider-scoped state, and session-id threading; use PEP 723 inline dependencies instead of a samples dependency group; use a plain input() loop; remove the dead custom processor stub. Update README/AGENTS for the renamed parameters and env vars. Add a samples ruff per-file-ignores entry now that the package is linted in CI. * Add emulator-backed vector search integration test Bump azure-cosmos-agent-memory to >=0.2.0b2 (adds the embeddings/chat client injection seam) and add tests/test_emulator.py: an integration (not azure) suite that exercises real Cosmos vector search with a quantizedFlat index against a local Cosmos DB emulator, using deterministic in-memory fakes for embeddings and chat so no Azure AI Foundry account or LLM is required. To run on a stock emulator the fixture strips the toolkit's full-text index (the provider only does pure vector search) and requests provisioned autoscale throughput instead of serverless. The suite skips cleanly when no emulator is reachable. * Fix CI typing and package checks for azure-cosmos-memory The package recently joined the uv workspace, so its source and tests are now covered by the Test Typing Checks and Package Checks gates for the first time. tests: rename stale constructor kwargs to the current provider API (foundry_endpoint/embedding_model/chat_model); use a typed _STUB_AGENT for the unused agent param so pyright/pyrefly/ty/zuban all accept it; make processor_config values ints; assert non-None memory_client in the emulator tests. source: relax reportUnknown*/reportOptional* for this package only (the toolkit ships no py.typed; mirrors the hosting-telegram precedent); decouple the conditional toolkit import from the annotation type; use settings.get(); fix memory_types list invariance; drop a redundant None guard; read role via getattr. * Apply pyupgrade: single-arg AsyncGenerator in test_integration * Make Cosmos memory extraction drain transparently on provider exit The provider now drains in-flight background memory extraction in __aexit__, so applications no longer need to call flush() in their own control flow; the client's close() would otherwise cancel pending extraction tasks. flush() is hardened against clients that expose no usable background-task registry. sample: interactive_chat reads input via asyncio.to_thread so the event loop stays free and background extraction runs during the session; removes the manual flush now that the provider drains on exit. tests: add explicit transparent-extraction integration tests (emulator: after_run schedules extraction and __aexit__ drains it; live Azure: a fact is extracted and recalled in a later session with no manual flush). Emulator tests reuse a single fixed database to avoid exhausting the emulator's partition budget across runs. * Add custom extraction-prompt seam and sample to cosmos-memory provider Adds a prompts_dir option to CosmosMemoryContextProvider that points the Agent Memory Toolkit pipeline at a caller-supplied directory of Prompty templates, so callers can override extract_memories.prompty to control what the extraction LLM produces. The toolkit exposes no public prompts-directory seam, so the provider contains the one internal touch (swapping the pipeline's template loader after the store connects); applies to both provider-built and supplied clients. sample: interactive_chat_custom_extraction.py - the interactive chat wired with a custom coding-assistant extraction rubric. It derives a complete prompts directory at runtime (copies the bundled templates and augments extract_memories.prompty) so it stays schema-compatible with the installed toolkit. tests: unit tests assert the provider redirects the pipeline loader only when prompts_dir is set; an emulator integration test proves end to end that a unique marker in a custom extract_memories.prompty reaches the extraction LLM call. * docs: document prompts_dir custom-extraction seam in cosmos-memory README Replaces the stale, non-functional CustomMemoryProcessor snippet with the working prompts_dir approach, lists the new interactive_chat_custom_extraction.py sample, and corrects the interactive-sample feature list. * Address review: rename _new_session, drop defensive toolkit import guard Sample (comment): rename _new_thread to _new_session in both interactive samples (a new session is the new thread). Provider (comment): replace the _memory_toolkit_available flag + __init__ ImportError guard with a plain guarded import that re-raises a clear ImportError, matching the github_copilot package's pattern for its 3.11-only SDK. Kept requires-python >=3.10 (bumping this one workspace member to 3.11 would force the entire uv workspace lock floor to 3.11). Tests now run importorskip before importing the package, mirroring github_copilot. * Pass cadence via cadence_thresholds instead of mutating os.environ * Mark package alpha and drop private naming in samples * Require Python 3.11 and inject user summary as untrusted context * CI: exclude azure-cosmos-memory from uv sync on Python 3.10 * Re-trigger CI (flaky external link check) * Require chat/embedding models instead of silent defaults * Fix pyright: narrow resolved chat/embedding models to str --------- Co-authored-by: Theo van Kraay <thvankra@microsoft.com> |