Forward runtime kwargs to skill resource functions#3
Open
SergeyMenshykh wants to merge 50 commits intosupport-code-skillsfrom
Open
Forward runtime kwargs to skill resource functions#3SergeyMenshykh wants to merge 50 commits intosupport-code-skillsfrom
SergeyMenshykh wants to merge 50 commits intosupport-code-skillsfrom
Conversation
…ion (microsoft#4192)" (microsoft#4385) This reverts commit c9cd067.
…nAIResponsesClient (microsoft#4310) * Fix walrus operator precedence for model_id in AzureOpenAIResponsesClient (microsoft#4299) Add parentheses around the walrus assignment so model_id receives the actual string value instead of the boolean result of `kwargs.pop(...) and not deployment_name`. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Address review: replace walrus with explicit None check, add edge-case tests (microsoft#4299) - Replace walrus operator with explicit assignment and 'is not None' check to avoid boolean-coercion pitfalls (empty string now correctly surfaces as ValueError instead of silently falling back) - Add test: deployment_name takes precedence over model_id kwarg - Add test: model_id='' raises ValueError - Add test: model_id=None falls back to env var Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Add explicit validation for empty model_id in AzureOpenAIResponsesClient Reject empty or whitespace-only model_id with ValueError instead of silently passing an empty deployment name downstream. This ensures the test_init_model_id_kwarg_empty_string test correctly validates behavior defined in production code rather than relying on downstream validation. Addresses PR review feedback for microsoft#4299. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Simplify model_id handling using walrus operator Addresses review comment on PR microsoft#4310. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Restore explicit model_id validation to fix test failures (microsoft#4299) The walrus operator refactor silently dropped the empty-string validation, causing test_init_model_id_kwarg_empty_string to fail. Restore the explicit None check and ValueError raise for empty model_id. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Revert "Restore explicit model_id validation to fix test failures (microsoft#4299)" This reverts commit 1d2965f. * Revert to walrus operator fix per review feedback --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…#4355) * Fix samples discovered by auto validation pipeline * Update python/samples/02-agents/devui/in_memory_mode.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…flows. (microsoft#4269) * Fix Mermaid rendering errors in WorkflowVisualizer.ToMermaidString Fix two bugs in the Mermaid diagram output: 1. Use safe node aliases (node_0, node_1, ...) instead of raw executor IDs as Mermaid node identifiers. Raw IDs containing spaces, dots, or non-ASCII characters (e.g. Japanese) caused Mermaid parse errors. 2. Fix conditional edge arrow syntax from '.--> ' (invalid) to '.-> ' (valid Mermaid dotted arrow syntax). Fixes microsoft#1406 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Use recognizable sanitized IDs for Mermaid node identifiers\n\nReplace generic node_0/node_1 aliases with IDs derived from the original\nexecutor names. ASCII letters, digits, and underscores are preserved;\nother characters become underscores (collapsed, trimmed). Leading digits\nget an n_ prefix. Collisions are resolved with a numeric suffix.\n\nThis keeps node IDs readable in the Mermaid source while the display\nlabels continue to show the full original names." * Remove issue number references from test names and comments" * Address PR review feedback from Copilot\n\n- Add Throw.IfNull(id) guard to SanitizeMermaidNodeId\n- Add safety limit (10,000) to collision resolution loop\n- Restore missing edge assertions (middle1/middle2 --> end)\n- Fix comment to show actual sanitized ID (n_1_User_input)\n- Use stricter regex in Unicode test (must start with letter/underscore)" * Address second round of PR review feedback\n\n- Escape node display labels via EscapeMermaidLabel to handle quotes,\n brackets, and newlines in executor IDs\n- Fix XML doc on SanitizeMermaidNodeId to accurately describe that\n existing consecutive underscores in input are preserved\n- Restore specific edge assertion (mid --> end) in conditional edge test\n- Restore fan-in routing assertions (s1/s2 through intermediate node,\n no direct edges to t) in fan-in test" --------- Co-authored-by: alliscode <bentho@microsoft.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…soft#4354) * Add sample demonstrating authentication and user access in agent tools * Add fixes to enable running on windows * Add launchsettings, add docker-compose to slnx and fix formatting * Switch to Expenses rather than todo based sample and address PR comments * Rename sample * Fix formatting
* Skip flaky OffThread observability test Temporarily skip CreatesWorkflowEndToEndActivities_WithCorrectName_OffThreadAsync due to intermittent failures. Tracked in microsoft#4398. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Update dotnet/tests/Microsoft.Agents.AI.Workflows.UnitTests/ObservabilityTests.cs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…ntAsIs is true (microsoft#4389) * Skip tool validation when UseProvidedChatClientAsIs is true (microsoft#3855) When GetAIAgentAsync is called with ChatClientAgentOptions.UseProvidedChatClientAsIs = true, skip requireInvocableTools validation so users can handle function calls manually via custom ChatClient middleware without needing to provide matching AIFunction tools. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Simplify requireInvocableTools expression per review feedback UseProvidedChatClientAsIs is a non-nullable bool, so use ! operator instead of != true for clarity. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Decouple tool matching from validation and add tool preservation test (microsoft#3855) Always match provided AIFunctions to server-side function definitions regardless of requireInvocableTools flag. Only throw when validation is required and no match is found. This ensures UseProvidedChatClientAsIs still preserves user-provided AIFunction tools instead of falling back to the broken ResponseToolAITool wrapper. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…icrosoft#4284) Bumps [rollup](https://github.com/rollup/rollup) from 4.57.1 to 4.59.0. - [Release notes](https://github.com/rollup/rollup/releases) - [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md) - [Commits](rollup/rollup@v4.57.1...v4.59.0) --- updated-dependencies: - dependency-name: rollup dependency-version: 4.59.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [rollup](https://github.com/rollup/rollup) from 4.52.4 to 4.59.0. - [Release notes](https://github.com/rollup/rollup/releases) - [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md) - [Commits](rollup/rollup@v4.52.4...v4.59.0) --- updated-dependencies: - dependency-name: rollup dependency-version: 4.59.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.15.2 to 0.15.4. - [Release notes](https://github.com/astral-sh/ruff/releases) - [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md) - [Commits](astral-sh/ruff@0.15.2...0.15.4) --- updated-dependencies: - dependency-name: ruff dependency-version: 0.15.4 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [prek](https://github.com/j178/prek) from 0.3.3 to 0.3.4. - [Release notes](https://github.com/j178/prek/releases) - [Changelog](https://github.com/j178/prek/blob/master/CHANGELOG.md) - [Commits](j178/prek@v0.3.3...v0.3.4) --- updated-dependencies: - dependency-name: prek dependency-version: 0.3.4 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [poethepoet](https://github.com/nat-n/poethepoet) from 0.42.0 to 0.42.1. - [Release notes](https://github.com/nat-n/poethepoet/releases) - [Commits](nat-n/poethepoet@v0.42.0...v0.42.1) --- updated-dependencies: - dependency-name: poethepoet dependency-version: 0.42.1 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [uv](https://github.com/astral-sh/uv) from 0.10.5 to 0.10.7. - [Release notes](https://github.com/astral-sh/uv/releases) - [Changelog](https://github.com/astral-sh/uv/blob/main/CHANGELOG.md) - [Commits](astral-sh/uv@0.10.5...0.10.7) --- updated-dependencies: - dependency-name: uv dependency-version: 0.10.7 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…e_json in HITL sample (microsoft#4405) * fix(python): use AgentResponse.value instead of model_validate_json in HITL sample Since the agent is configured with response_format=GuessOutput, the AgentResponse already provides .value with the parsed Pydantic model. Using .value is more idiomatic and avoids redundant JSON parsing. Fixes microsoft#4396 * fix: add safety guard for AgentResponse.value being None Address Copilot review feedback: .value is optional and may be None if response_format isn't propagated through the streaming path. Add an explicit None check with a clear error message.
…nts API streaming (microsoft#4333) * fix: handle thread.message.completed event in Assistants API streaming Previously, `thread.message.completed` events fell through to the catch-all `else` branch and yielded empty `ChatResponseUpdate` objects, silently discarding fully-resolved annotation data (file citations, file paths, and their character-offset regions). This commit adds a dedicated handler for `thread.message.completed` that: - Walks the completed ThreadMessage.content array - Extracts text blocks with their fully-resolved annotations - Maps FileCitationAnnotation and FilePathAnnotation to the framework's Annotation type with proper TextSpanRegion data - Yields a ChatResponseUpdate containing the complete text and annotations Fixes microsoft#4322 * test: add tests for thread.message.completed annotation handling Tests cover: - File citation annotation extraction - File path annotation extraction - Multiple annotations on a single text block - Text-only messages (no annotations) - Non-text blocks are skipped - Mixed content blocks (text + image) - Conversation ID propagation * fix: address Copilot review - add quote field and log unrecognized annotations - Include `quote` from `annotation.file_citation.quote` in `additional_properties` for FileCitationAnnotation, preserving the exact cited text snippet from the source file - Add `else` clause to log unrecognized annotation types at debug level, consistent with the pattern in `_responses_client.py` - Add `import logging` and module-level logger * test: add coverage for quote field and unrecognized annotation logging - test_message_completed_with_file_citation_quote: verifies quote is included in additional_properties - test_message_completed_with_file_citation_no_quote: verifies quote is omitted when None - test_message_completed_unrecognized_annotation_logged: verifies unknown annotation types are logged at debug level and skipped * fix: address reviewer nits — logger name convention + annotation type string Per @giles17's review: - Use logging.getLogger('agent_framework.openai') to match module convention - Simplify debug message to use annotation.type instead of type().__name__ * refactor: move message.completed tests into consolidated test file Per @giles17's review: moved all tests from test_assistants_message_completed.py into test_openai_assistants_client.py and deleted the standalone file. * fix: resolve mypy no-redef and ruff RET504 lint errors - Remove duplicate type annotation for 'ann' variable (no-redef) - Return directly from fixture instead of unnecessary assignment (RET504) * fix: rename annotation variable in completed block to fix mypy type conflict The 'annotation' loop variable in thread.message.completed has type FileCitationAnnotation | FilePathAnnotation, which conflicts with the delta block's 'annotation' of type FileCitationDeltaAnnotation | FilePathDeltaAnnotation. Renamed to 'completed_annotation' to avoid mypy 'Incompatible types in assignment' error. * fix: remove quote field from FileCitationAnnotation handling --------- Co-authored-by: Giles Odigwe <79032838+giles17@users.noreply.github.com>
) * Initial plan * Add auto_retry.py sample for rate limiting handling Co-authored-by: eavanvalkenburg <13749212+eavanvalkenburg@users.noreply.github.com> * Update auto_retry sample to use class decorator for get_response retries Co-authored-by: eavanvalkenburg <13749212+eavanvalkenburg@users.noreply.github.com> * Address review feedback on auto_retry sample header and wrapper usage Co-authored-by: eavanvalkenburg <13749212+eavanvalkenburg@users.noreply.github.com> * Restore class-decorator retry sample and address reviewer feedback Co-authored-by: eavanvalkenburg <13749212+eavanvalkenburg@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: eavanvalkenburg <13749212+eavanvalkenburg@users.noreply.github.com>
…nitialization (microsoft#4335) * Python: Add regression tests for microsoft#3948 - Entry JoinExecutor initializes Workflow.Inputs Add tests verifying that when workflow.run() is called with a dict or string input, the Entry node (JoinExecutor with kind: 'Entry') correctly initializes Workflow.Inputs via _ensure_state_initialized so that: - Expressions like =inputs.age resolve to the correct value - Conditions like =Local.age < 13 evaluate based on actual input (not blank/0) - String inputs populate both inputs.input and System.LastMessage.Text Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Apply pre-commit auto-fixes * Fix D420 and RUF070 lint errors across packages * Revert _workflow.py yield-inside-context-manager changes Moving yield inside `with _framework_event_origin()` blocks in the async generator causes ContextVar token reset failures on Python 3.12 Windows. The token stays un-reset while the generator is suspended, and async generator finalization in a different contextvars.Context triggers ValueError, corrupting OpenTelemetry span state and causing test_span_creation_and_attributes to see leaked spans. Keep yields outside the context manager blocks to ensure tokens are reset immediately before the generator suspends. --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ft#4327) * Add response filter for store input for *Providers * Apply suggestions from code review Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Address feedback * Apply suggestions from code review Co-authored-by: SergeyMenshykh <68852919+SergeyMenshykh@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: SergeyMenshykh <68852919+SergeyMenshykh@users.noreply.github.com>
* Created cosmos history provider * add marker * Python: address Cosmos PR feedback - address provider/test/sample review feedback and cleanup typing - add cosmos integration test coverage and skip gating - add dedicated cosmos emulator jobs to python merge/integration workflows - switch cosmos workflow execution to package poe integration-tests task Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Python: handle empty Cosmos session id - replace default partition fallback for empty session_id - log warning and generate GUID when session_id is empty - update unit tests to validate GUID fallback behavior Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix sample * fix cross partition query --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…essages in Magentic-One workflow (microsoft#4413) * Fix IndexError when reasoning models return no text content (microsoft#4384) In _prepare_message_for_openai(), the text_reasoning case unconditionally accessed all_messages[-1] to attach reasoning_details. When a reasoning model (e.g. gpt-5-mini) returns reasoning_details without text content, all_messages is empty, causing an IndexError. Guard the access by initializing all_messages with the current args dict when it is empty, so reasoning_details can be safely attached. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Address review: buffer reasoning details for valid message payloads (microsoft#4384) - Buffer pending reasoning details and attach to the next message with content/tool_calls, avoiding standalone reasoning-only messages. - When reasoning is the only content, emit a message with empty content to satisfy Chat Completions schema requirements. - Strengthen test assertions to verify text+reasoning co-location and that all messages with reasoning_details also have content or tool_calls. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix text_reasoning handling: always buffer and tighten tests (microsoft#4384) - Always buffer reasoning into pending_reasoning instead of conditionally attaching to the previous message via fragile all_messages emptiness check - Attach buffered reasoning to last message at end-of-loop when no subsequent content consumed it - Assert exact content values (content == '' not in ('', None)) - Assert exact list lengths (== 1 not >= 1) for stronger regression guards - Add test for reasoning before FunctionCallContent Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Apply pre-commit auto-fixes --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Added shell tool * Fixed CI error * Add ShellTool support for OpenAI and Anthropic providers - Add shell_tool_call, shell_tool_result, and shell_command_output content types - Add ShellTool class and shell_tool decorator to core - Add get_hosted_shell_tool() to OpenAI Responses client - Handle shell_call and shell_call_output parsing in OpenAI (sync and streaming) - Map ShellTool to Anthropic bash tool API format - Parse bash_code_execution_tool_result as shell_tool_result in Anthropic - Add unit tests for all new functionality - Add sample scripts for hosted and local shell execution Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Addressed comments * Reverted ruff change * Fixed tests * Addressed comments --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…osoft#4395) * Change *Provider StateKey to list of StateKeys * Add more statekey validation tests * Address PR comments
…gent (microsoft#4409) * Fix microsoft#4371: Propagate session to manager agent in StandardMagenticManager StandardMagenticManager._complete() was calling self._agent.run(messages) without passing a session. This caused context providers (e.g. RedisHistoryProvider) configured on the manager agent to silently fail, as each call created a new ephemeral session with a different session_id. Changes: - Create an AgentSession in StandardMagenticManager.__init__() - Pass session=self._session in _complete() calls to agent.run() - Persist/restore the session in checkpoint save/restore methods - Add regression tests for session propagation and checkpoint round-trip Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Add type: ignore[reportPrivateUsage] to private attribute assertions in tests Address PR review feedback: add # type: ignore[reportPrivateUsage] comments to _session attribute accesses in the new regression tests, matching the existing convention used elsewhere in test_magentic.py (e.g., lines 401-406). The @pytest.mark.asyncio decorator is not needed because pyproject.toml sets asyncio_mode = "auto". Fixes microsoft#4371 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Address review: use getattr for private _session access in tests (microsoft#4371) Replace direct mgr._session access with getattr(mgr, "_session") to avoid reportPrivateUsage type-checking warnings without needing type: ignore comments. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Apply pre-commit auto-fixes * Address PR review: fix session restore guard and improve test robustness (microsoft#4371) - Use 'is not None' instead of truthiness check for session_payload restore - Use getattr() for private _session attribute access in tests - Add backward-compatibility test for on_checkpoint_restore with empty state Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Make non-async tests plain def to avoid pytest-asyncio dependency (microsoft#4409) Tests that never await anything don't need to be async. Using plain def ensures they always run regardless of pytest-asyncio configuration. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Apply pre-commit auto-fixes --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
) (microsoft#4326) * Python: Add OpenTelemetry instrumentation to ClaudeAgent (microsoft#4278) Add inline telemetry to ClaudeAgent.run() so that enable_instrumentation() emits invoke_agent spans and metrics. Covers both streaming and non-streaming paths using the same observability helpers as AgentTelemetryLayer. Adds 5 unit tests for telemetry behavior. Co-Authored-By: amitmukh <amimukherjee@microsoft.com> * Address PR review feedback for ClaudeAgent telemetry - Add justification comment for private observability API imports - Pass system_instructions to capture_messages for system prompt capture - Use monkeypatch instead of try/finally for test global state isolation Co-Authored-By: amitmukh <amitmukh@users.noreply.github.com> Co-Authored-By: Claude <noreply@anthropic.com> * Adopt AgentTelemetryLayer instead of inline telemetry Restructure ClaudeAgent to inherit from AgentTelemetryLayer via a _ClaudeAgentRunImpl mixin, eliminating duplicated telemetry code and private API imports. MRO: ClaudeAgent → AgentTelemetryLayer → _ClaudeAgentRunImpl → BaseAgent - Remove inline _run_with_telemetry / _run_with_telemetry_stream methods - Remove private observability helper imports (_capture_messages, etc.) - Add default_options property mapping system_prompt → instructions - Net -105 lines by reusing core telemetry layer Co-Authored-By: amitmukh <amitmukh@users.noreply.github.com> Co-Authored-By: Claude <noreply@anthropic.com> * Fix mypy: align _ClaudeAgentRunImpl.run() signature with AgentTelemetryLayer.run() Remove explicit `options` parameter from mixin's run() signature and extract it from **kwargs to match AgentTelemetryLayer's signature. Also align overload return types (ResponseStream, Awaitable) to match. Co-Authored-By: Claude <noreply@anthropic.com> * Introduce RawClaudeAgent following framework's RawAgent/Agent pattern Replace private _ClaudeAgentRunImpl mixin with public RawClaudeAgent class that contains all core logic (init, run, lifecycle, tools). ClaudeAgent becomes a thin wrapper that adds AgentTelemetryLayer. - RawClaudeAgent(BaseAgent): full implementation without telemetry - ClaudeAgent(AgentTelemetryLayer, RawClaudeAgent): adds OTel tracing - Export RawClaudeAgent from package __init__.py Users who want to skip telemetry or provide their own can use RawClaudeAgent directly. Co-Authored-By: Claude <noreply@anthropic.com> * Address review nits: trim RawClaudeAgent docstring, fix import paths - Simplify RawClaudeAgent docstring to a single basic example (not the primary entry point for most users) - Use agent_framework.anthropic import path in docstrings instead of direct agent_framework_claude path - Add RawClaudeAgent to agent_framework.anthropic lazy re-exports Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Amit Mukherjee <amimukherjee@microsoft.com> Co-authored-by: amitmukh <amitmukh@users.noreply.github.com> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Dmytro Struk <13853051+dmytrostruk@users.noreply.github.com>
* Add ADR for Python context compaction strategy * Remove async vs sync open question - compact() is async * updated adr * docs: refine context compaction ADR Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * updated adr * further refinement * renamed and numbered * remove XX version --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Fix workflow tests pyright warnings * Update uv.lock * Fix pyright * Comments * Update root pyproject pyright setting * Update core pyproject pyright setting * Update core pyproject pyright setting
…_tool() (microsoft#4201) * Python: Add file_ids and data_sources support to AzureAIAgentClient.get_code_interpreter_tool() Update the factory method to accept file_ids and data_sources keyword arguments, matching the underlying azure.ai.agents SDK CodeInterpreterTool constructor. This enables users to attach uploaded files for code interpreter analysis. Fixes microsoft#4050 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * addressed comments * addressed comments * Add per-message file attachment support for AzureAIAgentClient Add hosted_file handling in _prepare_messages() to convert Content.from_hosted_file() into MessageAttachment on ThreadMessageOptions. This enables per-message file scoping for code interpreter, matching the underlying Azure AI Agents SDK MessageAttachment pattern. - Add hosted_file case in _prepare_messages() match statement - Import MessageAttachment from azure.ai.agents.models - Add sample for per-message CSV file attachment with code interpreter - Add employees.csv test data file - Add 3 unit tests for hosted_file attachment conversion Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Address PR review: validation, fix assertions, remove MessageAttachment - Add empty string validation in resolve_file_ids() - Add test for Content with file_id=None - Add test for empty string file_ids - Revert MessageAttachment/hosted_file handling from _prepare_messages() (moved to separate issue microsoft#4352 for proper design) - Remove per-message file upload sample and employees.csv - Keep data_sources assertion as-is (dict keyed by asset_identifier) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…icrosoft#4197) * Fix: Parse oauth_consent_request events in Azure AI client (microsoft#3950) When Azure AI Agent Service returns an oauth_consent_request output item for OAuth-protected MCP tools, the base OpenAI responses parser drops it (hits case _ default branch). This causes agent runs to complete silently with zero content. Changes: - Add oauth_consent_request ContentType and Content.from_oauth_consent_request() factory with consent_link field and user_input_request=True - Override _parse_response_from_openai and _parse_chunk_from_openai in RawAzureAIClient to intercept Azure-specific oauth_consent_request items - Add _emit_oauth_consent helper in AG-UI to emit CustomEvent for frontends - Add tests proving base parser drops the event and Azure AI override catches it Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * addressed comment * addressed comments * addressed comments --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Updated Copilot SDK to the latest version * Added retry
* Upgraded azure-ai-projects to 2.0.0b4 * Fixed tests
…e present (microsoft#4432) * Fix MCP tools duplicated on second turn when runtime tools are present When AG-UI's collect_server_tools pre-expands MCP functions on turn 2 (after the MCP server is connected), _prepare_run_context unconditionally appends them again from self.mcp_tools, duplicating every MCP tool. Skip MCP functions whose names already exist in the final tool list, following the same name-based dedup pattern used in _merge_options. Fixes microsoft#4381 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * mypy fix * Remove issue-specific references from test docstring Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
microsoft#4329) Co-authored-by: Leela Karthik U <wqtk@novonordisk.com> Co-authored-by: Giles Odigwe <79032838+giles17@users.noreply.github.com>
…ng CurrentUICulture to en-US (microsoft#4408) * Fix microsoft#4321: Set CurrentUICulture to en-US in PowerFx eval() On non-English systems, CultureInfo.CurrentUICulture causes PowerFx to emit localized error messages. The existing ValueError guard only matches English strings ("isn't recognized", "Name isn't valid"), so undefined variable errors crash instead of returning None gracefully. Fix: save and restore CurrentUICulture alongside CurrentCulture before calling engine.eval(), ensuring error messages are always in English. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Reuse single CultureInfo instance to avoid redundant allocations Cache CultureInfo("en-US") in a local variable instead of instantiating it twice per eval() call, as suggested in PR review. Fixes microsoft#4321 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Add assertion for CurrentUICulture restoration after eval Assert that the production code's finally-block correctly restores CurrentUICulture to it-IT after eval returns, covering future regressions where the culture could leak. The CultureInfo caching suggestion (comment #2) was already implemented in the production code. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…t#4451) Skip all three structured output run tests in OpenAIAssistantStructuredOutputRunTests as they fail intermittently on the build agent/CI, matching the pattern already used in AzureAIAgentsPersistentStructuredOutputRunTests. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Update Microsoft.Agents.AI.AzureAI for Azure.AI.Projects SDK 2.0.0 - Bump Azure.AI.Projects to 2.0.0-alpha.20260213.1 - Bump Azure.AI.Projects.OpenAI to 2.0.0-alpha.20260213.1 - Bump System.ClientModel to 1.9.0 (transitive dependency) - Switch both GetAgent and CreateAgentVersion to protocol methods with MEAI user-agent policy injection via RequestOptions - Migrate 29 CREATE-path tests from FakeAgentClient to HttpHandlerAssert pattern for real HTTP pipeline testing - Fix StructuredOutputDefinition constructor (BinaryData -> IDictionary) - Fix responses endpoint path (openai/responses -> /responses) - Add local-packages NuGet source for pre-release nupkgs Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Update Azure.AI.Projects to 2.0.0-beta.1 from NuGet.org - Update Azure.AI.Projects and Azure.AI.Projects.OpenAI to 2.0.0-beta.1 - Remove local-packages NuGet source (packages now on nuget.org) - Fix MemorySearchTool -> MemorySearchPreviewTool rename - Fix RedTeams.CreateAsync ambiguous call - Fix CreateAgentVersion/Async signature change (BinaryData -> string) - Suppress AAIP001 experimental warning for WorkflowAgentDefinition Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Move s_modelWriterOptionsWire field before methods that use it Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix flaky test: prevent spurious workflow_invoke Activity on timeout wake-up The StreamingRunEventStream run loop uses a 1-second timeout on WaitForInputAsync. When the timeout fires before the consumer calls StopAsync, the loop would create a spurious workflow_invoke Activity even though no actual input was provided. This caused the WorkflowRunActivity_IsStopped_Streaming_OffThread_MultiTurnAsync test to intermittently fail (expecting 2 activities but finding 3). Fix: guard the loop body with a HasUnprocessedMessages check. On timeout wake-ups with no work, the loop waits again without creating an activity or changing the run status. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix epoch race condition causing unit tests to hang on net10.0 and net472 The HasUnprocessedMessages guard (previous commit) correctly prevents spurious workflow_invoke Activity creation on timeout wake-ups, but exposed a latent race in the epoch-based signal filtering. The race: when the run loop processes messages quickly and calls Interlocked.Increment(ref _completionEpoch) before the consumer calls TakeEventStreamAsync, the consumer reads the already-incremented epoch and sets myEpoch = epoch + 1. This causes the consumer to skip the valid InternalHaltSignal (its epoch < myEpoch) and block forever waiting for a signal that will never arrive (since the guard prevents spurious signal generation). Fix: read _completionEpoch without +1. The +1 was originally needed to filter stale signals from timeout-driven spurious loop iterations, but those no longer exist thanks to the HasUnprocessedMessages guard. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Revert "Fix epoch race condition causing unit tests to hang on net10.0 and net472" This reverts commit 6ce7f01. * Revert "Fix flaky test: prevent spurious workflow_invoke Activity on timeout wake-up" This reverts commit 98963e1. * Skip hanging multi-turn declarative integration tests The ValidateMultiTurnAsync tests (ConfirmInput.yaml, RequestExternalInput.yaml) hang indefinitely in CI, blocking the merge queue. The hang is SDK-independent (reproduces with both Azure.AI.Projects 1.2.0-beta.5 and 2.0.0-beta.1) and is a pre-existing issue in the declarative workflow multi-turn test logic. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Remove unused using directive in IntegrationTest.cs Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Restore Azure.AI.Projects 2.0.0-beta.1 version bump The merge from main accidentally reverted the package versions back to 1.2.0-beta.5. This is the primary change of this PR. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Address merge conflict * Skip flaky WorkflowRunActivity_IsStopped_Streaming_OffThread_MultiTurnAsync test Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Skip CheckSystem test cases temporarily Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Skip flacky UT * Ignore org-level GitHub App checks in merge-gatekeeper Add Cleanup artifacts, Agent, Prepare, and Upload results to the ignored list. These are check runs created by an org-level GitHub App (MSDO), not by any workflow in this repo, and their transient failures should not block merges. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ort options to ClaudeAgentOptions (microsoft#4425) * feat(claude): add plugins, setting_sources, thinking, and effort options Add four Claude Agent SDK options to ClaudeAgentOptions that are clean passthroughs with no abstraction conflicts: - plugins: load Claude Code plugins programmatically via SdkPluginConfig - setting_sources: control which .claude settings files are loaded - thinking: modern extended thinking config (adaptive/enabled/disabled) - effort: control thinking depth (low/medium/high/max) * feat(claude): remove max_thinking_tokens, add plugins/setting_sources/thinking/effort Remove the deprecated max_thinking_tokens field from ClaudeAgentOptions in favor of the new thinking field (ThinkingConfig). Add four Claude Agent SDK options as clean passthroughs: - plugins: load Claude Code plugins via SdkPluginConfig - setting_sources: control which .claude settings files are loaded - thinking: extended thinking config (adaptive/enabled/disabled) - effort: thinking depth control (low/medium/high/max)
* support code skills * address pr review comments * address package and syntax checks * address pr review comments * address pr review comment * address failed check * rename agentskill and agetnskillprovider * move agent skills related assets to _skills.py * address pr review comments * address review comments
…ks (microsoft#4401) * discover resources in skills folder * address pr review comments * change type of AllowedResourceExtensions * address pr review comment
) * bug fix for duplicate output on GitHubCopilotAgent * Add Test code for bug fix of duplicate output on GitHubCopilotAgenttT * update Test code for bug fix of duplicate output on GitHubCopilotAgenttT * update Test for duplicate output of GitHubCopilotAgent --------- Co-authored-by: Mark Wallace <127216156+markwallace-microsoft@users.noreply.github.com> Co-authored-by: Dmytro Struk <13853051+dmytrostruk@users.noreply.github.com>
…nt-as-tool scenarios (microsoft#4439) * Python: Add propagate_session parameter to as_tool() for session sharing Add opt-in session propagation in agent-as-tool scenarios. When propagate_session=True, the parent agent's AgentSession is forwarded to the sub-agent's run() call, allowing both agents to share session state (history, metadata, session_id). - Add propagate_session parameter to BaseAgent.as_tool() (default False) - Include session in additional_function_arguments so it flows to tools - Add 3 tests for propagation on/off and shared state verification - Add sample showing session propagation with observability middleware Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Clarify propagate_session docstring per review feedback Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
SergeyMenshykh
pushed a commit
that referenced
this pull request
Apr 2, 2026
…after_run hooks (microsoft#5013) * Fix GitHubCopilotAgent not calling context provider hooks (microsoft#3984) GitHubCopilotAgent accepted context_providers in its constructor but never called before_run()/after_run() on them in _run_impl() or _stream_updates(), silently ignoring all context providers. Add _run_before_providers() helper to create SessionContext and invoke before_run on each provider. Both _run_impl() and _stream_updates() now run the full provider lifecycle: before_run before sending the prompt (with provider instructions prepended) and after_run after receiving the response. This follows the same pattern used by A2AAgent. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Python: Fix GitHubCopilotAgent to invoke context provider before_run/after_run hooks Fixes microsoft#3984 * fix(microsoft#3984): address review feedback for context provider integration - Build prompt from session_context.get_messages(include_input=True) so provider-injected context_messages are included in both non-streaming and streaming paths (review comments #1, #2) - Preserve timeout in opts (use get instead of pop) so providers can observe it via context.options (review comment #3) - Eliminate streaming double-buffer: move after_run invocation to a ResponseStream result_hook (matching Agent class pattern) instead of maintaining a separate updates list in the generator (review comment #4) - Improve _run_before_providers docstring Add tests for: - Context messages included in prompt (non-streaming + streaming) - Error path: after_run NOT called when send_and_wait/streaming raises - Multiple providers: forward before_run, reverse after_run ordering - BaseHistoryProvider with load_messages=False is skipped - Streaming after_run response contains aggregated updates - Streaming with no updates still sets empty response - Timeout preserved in session context options for providers Note: _run_before_providers remains on GitHubCopilotAgent for now. A follow-up PR should extract it to BaseAgent so subclasses can reuse it without duplicating the provider iteration logic. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Address review feedback for microsoft#3984: Python: [Bug]: GitHubCopilotAgent Memory Example * refactor(microsoft#3984): promote _run_before_providers to BaseAgent Move _run_before_providers from GitHubCopilotAgent into BaseAgent, mirroring the existing _run_after_providers helper. Agent's _prepare_session_and_messages now delegates to the shared base method, eliminating the near-duplicate provider iteration logic that could drift as the provider contract evolves. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Address review feedback for microsoft#3984: Python: [Bug]: GitHubCopilotAgent Memory Example * revert: keep _run_before_providers in GitHubCopilotAgent only Undo the promotion of _run_before_providers to BaseAgent. The method stays in GitHubCopilotAgent where it is needed, and _agents.py retains its original inline provider iteration in RawAgent. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: replace deprecated BaseContextProvider/BaseHistoryProvider with ContextProvider/HistoryProvider Update imports and usages in GitHubCopilotAgent and its tests to use the new non-deprecated class names from the core package. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: address review feedback - reorder providers before session, wrap streaming after_run in try/except, assert after_run on skipped HistoryProvider - Move _run_before_providers before _get_or_create_session so provider contributions can affect session configuration - Wrap _run_after_providers in try/except in streaming _after_run_hook to prevent provider errors from replacing successful responses - Add after_run assertion to test_history_provider_skip_when_load_messages_false Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <copilot@github.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Enables
@skill.resourcedecorated functions to receive runtime keyword arguments passed viaagent.run(), matching the existing@toolkwargs pattern.Problem
Currently, skill resource functions (decorated with
@skill.resource) are always called with zero arguments. In contrast, regular@toolfunctions can receive runtime kwargs passed viaagent.run(user_id="123")through**kwargs. This makes it impossible to inject request-scoped context (app version, auth tokens, correlation IDs) into skill resources.Changes
Core (
_skills.py)**kwargs: Anyto_read_skill_resource()method signature**kwargsviainspect.signature(same pattern asFunctionTool)**kwargsare unaffected (backward compatible)Tests (
test_skills.py)**kwargsstill works when extra args are passedSample (
code_skill.py)project_info_skill'senvironment()resource to accept**kwargsand useapp_versionmain()to passapp_version="2.4.1"viaagent.run()Co-authored-by: Copilot 223556219+Copilot@users.noreply.github.com