Commit Graph

1718 Commits

  • Python: Fix streamed workflow agent continuation context by finalizing AgentExecutor streams (#3882)
    * Fix streamed workflow agent continuation context by finalizing AgentExecutor streams
    
    * Fix stream handling
    
    * Fixes
    
    * Fix DevUI and tests
  • Python: (ag-ui): fix Workflow.as_agent() streaming regression (#3875)
    * fix Workflow.as_agent() streaming regression in ag-ui
    
    * Address PR feedback
    
    * PR feedback
  • Python: [BREAKING] PR2 — Wire context provider pipeline, remove old types, update all consumers (#3850)
    * PR2: Wire context provider pipeline and update all internal consumers
    
    - Replace AgentThread with AgentSession across all packages
    - Replace ContextProvider with BaseContextProvider across all packages
    - Replace context_provider param with context_providers (Sequence)
    - Replace thread= with session= in run() signatures
    - Replace get_new_thread() with create_session()
    - Add get_session(service_session_id) to agent interface
    - DurableAgentThread -> DurableAgentSession
    - Remove _notify_thread_of_new_messages from WorkflowAgent
    - Wire before_run/after_run context provider pipeline in RawAgent
    - Auto-inject InMemoryHistoryProvider when no providers configured
    
    * fix: update all tests for context provider pipeline, fix lazy-loaders, remove old test files
    
    * refactor: update all sample files for context provider pipeline (AgentThread→AgentSession, ContextProvider→BaseContextProvider)
    
    * fix: update remaining ag-ui references (client docstring, getting_started sample)
    
    * fix: make get_session service_session_id keyword-only to avoid confusion with session_id
    
    * refactor: rename _RunContext.thread_messages to session_messages
    
    * refactor: remove _threads.py, _memory.py, and old provider files; migrate devui to use plain message lists
    
    * rename: remove _new_ prefix from test files
    
    * refactor: rewrite SlidingWindowChatMessageStore as SlidingWindowHistoryProvider(InMemoryHistoryProvider)
    
    * fix: read full history from session state directly instead of reaching into provider internals
    
    * fix: update stale .pyi stubs, sample imports, and README references for new provider types
    
    * fix: remove stale message_store, _notify_thread_of_new_messages, and session_id.key references in samples
    
    * refactor: merge context_providers and sessions sample folders into sessions, remove aggregate_context_provider
    
    * refactor: UserInfoMemory stores state in session.state instead of instance attributes
    
    * feat: add Pydantic BaseModel support to session state serialization
    
    Pydantic models stored in session.state are now automatically serialized
    via model_dump() and restored via model_validate() during to_dict()/from_dict()
    round-trips. Models are auto-registered on first serialization; use
    register_state_type() for cold-start deserialization.
    
    Also export register_state_type as a public API.
    
    * fix mem0
    
    * Update sample README links and descriptions for session terminology
    
    - Replace 'thread' with 'session' in sample descriptions across all READMEs
    - Update file links for renamed samples (mem0_sessions, redis_sessions, etc.)
    - Fix Threads section → Sessions section in main samples/README.md
    - Update tools, middleware, workflows, durabletask, azure_functions READMEs
    - Update architecture diagrams in concepts/tools/README.md
    - Update migration guides (autogen, semantic-kernel)
    
    * Fix broken Redis README link to renamed sample
    
    * Fix Mem0 OSS client search: pass scoping params as direct kwargs
    
    AsyncMemory (OSS) expects user_id/agent_id/run_id as direct kwargs,
    while AsyncMemoryClient (Platform) expects them in a filters dict.
    Adds tests for both client types.
    
    Port of fix from #3844 to new Mem0ContextProvider.
    
    * Fix rebase issues: restore missing _conversation_state.py and checkpoint decode logic
    
    - Add back _conversation_state.py (encode/decode_chat_messages) lost in rebase
    - Fix on_checkpoint_restore to decode cache/conversation with decode_chat_messages
    - Fix on_checkpoint_restore to use decode_checkpoint_value for pending requests
    - Add tests/workflow/__init__.py for relative import support
    - Fix test_agent_executor checkpoint selection (checkpoints[1] not superstep)
    
    * Add STORES_BY_DEFAULT ClassVar to skip redundant InMemoryHistoryProvider injection
    
    Chat clients that store history server-side by default (OpenAI Responses API,
    Azure AI Agent) now declare STORES_BY_DEFAULT = True. The agent checks this
    during auto-injection and skips InMemoryHistoryProvider unless the user
    explicitly sets store=False.
    
    * Fix broken markdown links in azure_ai and redis READMEs
    
    * Fix getting-started samples to use session API instead of removed thread/ContextProvider API
    
    * updates to workflow as agent
    
    * fix group chat import
    
    * Rename Thread→Session throughout, fix service_session_id propagation, remove stale AGUIThread
    
    - Fix: Propagate conversation_id from ChatResponse back to session.service_session_id
      in both streaming and non-streaming paths in _agents.py
    - Rename AgentThreadException → AgentSessionException
    - Remove stale AGUIThread from ag_ui lazy-loader
    - Rename use_service_thread → use_service_session in ag-ui package
    - Rename test functions from *_thread_* to *_session_*
    - Rename sample files from *_thread* to *_session*
    - Update docstrings and comments: thread → session
    - Update _mcp.py kwargs filter: add 'session' alongside 'thread'
    - Fix ContinuationToken docstring example: thread=thread → session=session
    - Fix _clients.py docstring: 'Agent threads' → 'Agent sessions'
    
    * Fix broken markdown links after thread→session file renames
    
    * fix azure ai test
  • .NET: Update GitHub.Copilot.SDK to 0.1.23 and copy new session config prope… (#3788)
    * Update GitHub.Copilot.SDK to 0.1.23 and copy new session config properties
    
    - Bump GitHub.Copilot.SDK from 0.1.18 to 0.1.23
    - Add new SessionConfig properties: ReasoningEffort, Hooks, OnUserInputRequest,
      WorkingDirectory, ConfigDir, InfiniteSessions
    - Add missing ResumeSessionConfig properties: Model, SystemMessage,
      AvailableTools, ExcludedTools, ReasoningEffort, Hooks, OnUserInputRequest,
      WorkingDirectory, ConfigDir, InfiniteSessions
    - Fix UserMessageDataAttachmentsItem -> UserMessageDataAttachmentsItemFile
      for new polymorphic attachment API
    - Add unit tests for new session config properties
    
    * Address PR review: centralize config mapping and improve test coverage
    
    - Extract CopySessionConfig/CopyResumeSessionConfig as internal static helpers
      to eliminate duplicated mapping logic between RunCoreStreamingAsync and
      CreateResumeConfig (addresses reviewer comment on drift risk)
    - Add InternalsVisibleTo for unit test project
    - Replace shallow constructor tests with comprehensive property-verification
      tests that validate every config property is correctly copied, including
      OnUserInputRequest (addresses reviewer comments on test coverage)
    
    * Remove accidentally committed git-lfs hooks
  • Python: restructure: Python samples into progressive 01-05 layout (#3862)
    * restructure: Python samples into progressive 01-05 layout
    
    - 01-get-started/: 6 numbered steps (hello agent → hosting)
    - 02-agents/: all agent concept samples (tools, middleware, providers, etc.)
    - 03-workflows/: ALL existing workflow samples preserved as-is
    - 04-hosting/: azure-functions, durabletask, a2a
    - 05-end-to-end/: demos, evaluation, hosted agents
    - Old files moved to _to_delete/ for review
    - Added AGENTS.md with structure documentation
    - autogen-migration/ and semantic-kernel-migration/ preserved at root
    
    * fix: switch to AzureOpenAI Foundry, fix CI failures
    
    - Switch all 01-get-started samples to AzureOpenAIResponsesClient with
      Azure AI Foundry project endpoint (AZURE_AI_PROJECT_ENDPOINT +
      AZURE_OPENAI_RESPONSES_DEPLOYMENT_NAME + AzureCliCredential)
    - Add _to_delete/ and 05-end-to-end/ to pyrightconfig.samples.json excludes
    - Fix test paths in packages/ that referenced old getting_started/ dirs:
      durabletask conftest + streaming test, azurefunctions conftest,
      devui conftest + capture_messages + openai_sdk_integration
    - Fix workflow_as_agent_human_in_the_loop.py import (sibling import)
    - Update hosting READMEs and tool comment paths
    - Replace root README.md with new structure overview
    - Update AGENTS.md to document Azure OpenAI Foundry as default provider
    
    * cleanup: remove _to_delete folder, copy resource files to active dirs
    
    All files in _to_delete/ were either:
    - Exact duplicates of files in the new structure (240 files)
    - Same file with only comment path updates (100 files)
    - One import-fix diff (workflow_as_agent_human_in_the_loop.py)
    - One superseded minimal_sample.py
    
    Resource files (sample.pdf, countries.json, employees.pdf, weather.json)
    copied to 02-agents/sample_assets/ and 02-agents/resources/ since active
    samples reference them.
    
    * fix: address PR review comments, centralize resources, remove root duplicates
    
    - Fix type annotation in 04_memory.py (string union -> proper types)
    - Fix old sample paths in observability files
    - Fix grammar/spelling in observability samples
    - Move sample_assets/ and resources/ to shared/ folder
    - Remove 8 duplicate observability files from 02-agents root
    - Update resource path references in multimodal_input and provider samples
    
    * fix: update broken links from old getting_started paths to new structure
    
    - Update relative paths in READMEs: getting_started/ → 01-get-started/,
      02-agents/, 03-workflows/, 04-hosting/, 05-end-to-end/
    - Fix absolute GitHub URLs in package READMEs
    - Fix broken link in ollama package README
    
    * fix: convert absolute GitHub URLs to relative paths for link checker
    
    Absolute URLs to python/samples/ on main branch 404 until PR merges.
    Converted to relative paths that linkspector can verify locally.
    
    * fix: update link for handoff sample moved to orchestrations/
    
    * fix: update chatkit-integration README path from demos/ to 05-end-to-end/
    
    * fix: update broken links in orchestrations README to match flat directory structure
  • .NET Workflows - Add unit tests for ForeachExecutor (Declarative Workflows) (#3835)
    * Initial plan
    
    * Add comprehensive unit tests for ForeachExecutor
    
    Co-authored-by: crickman <66376200+crickman@users.noreply.github.com>
    
    * Formatting
    
    * Checkpoint
    
    * Checkpoint
    
    * Updated test capabilities for non-discrete
    
    * Update dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/ObjectModel/ForeachExecutorTest.cs
    
    Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
    
    * Update dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/ObjectModel/ForeachExecutorTest.cs
    
    Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
    
    * Consistency
    
    * Cleanup test
    
    * Fixed
    
    ---------
    
    Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
    Co-authored-by: crickman <66376200+crickman@users.noreply.github.com>
    Co-authored-by: Chris Rickman <crickman@microsoft.com>
    Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
  • Bump pillow from 12.1.0 to 12.1.1 in /python (#3852)
    Bumps [pillow](https://github.com/python-pillow/Pillow) from 12.1.0 to 12.1.1.
    - [Release notes](https://github.com/python-pillow/Pillow/releases)
    - [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst)
    - [Commits](https://github.com/python-pillow/Pillow/compare/12.1.0...12.1.1)
    
    ---
    updated-dependencies:
    - dependency-name: pillow
      dependency-version: 12.1.1
      dependency-type: indirect
    ...
    
    Signed-off-by: dependabot[bot] <support@github.com>
    Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
  • Python: Centralize tool result parsing in FunctionTool.invoke() (#3854)
    * Centralize tool result parsing in FunctionTool.invoke()
    
    - Add parse_result static method to FunctionTool that converts raw
      function return values to strings at invocation time
    - Add result_parser parameter to FunctionTool and @tool decorator
      for custom parsing
    - Remove prepare_function_call_results from all 9 consumer files
      and from the public API
    - Update MCPTool to parse MCP types directly to strings via
      _parse_tool_result_from_mcp and _parse_prompt_result_from_mcp
    - Change MCPTool parse_tool_results/parse_prompt_results type from
      Literal[True] | Callable | None to Callable | None
    - Remove ReturnT type parameter from FunctionTool (now single
      generic ArgsT since invoke() always returns str)
    - Update all subclass signatures and docstrings
    
    Fixes #1147
    
    * Fix test_mcp_tool_call_tool_with_meta_integration for string results
    
    The test was still accessing result[0].additional_properties but
    invoke() now returns a string, not a list of Content objects.
    
    * Fix SIM108 lint: use binary operator for output assignment
    
    * Fix bedrock: use FunctionTool.parse_result instead of str() fallback
    
    str(result) turns None into literal 'None' and dicts into Python reprs
    with single quotes, breaking JSON parsing. Use the shared parse_result
    which handles None as '' and serializes via json.dumps.
    
    * updated lock
    
    * updates from feedback
  • .NET: [BREAKING] Change SerializeSession to be Async (#3879)
    * Change SerializeSession to be Async
    
    * Update Changelog
  • Python: (samples): adopt AzureOpenAIResponsesClient, reorganize orchestration examples, and fix workflow/orchestration bugs (#3873)
    * adopt AzureOpenAIResponsesClient, reorganize orchestration examples, and fix workflow/orchestration bugs
    
    * Updates
    
    * add comment
  • Python: Replace Pydantic Settings with TypedDict + load_settings() (#3843)
    * Replace Pydantic Settings with TypedDict + load_settings()
    
    - Remove pydantic-settings dependency, add python-dotenv
    - Delete _pydantic.py (AFBaseSettings, HTTPsUrl)
    - Add _settings.py with generic load_settings() function, SecretString,
      type coercion, and Required field validation (SettingNotFoundError)
    - Convert all 13 settings classes from AFBaseSettings subclasses to
      TypedDict definitions with load_settings() calls
    - Update all consumers from attribute access to dict access
    - Add 20 unit tests for load_settings() covering basic loading, dotenv,
      SecretString, type coercion, and required field validation
    - Update all existing tests for new settings patterns
    
    * Fix mypy type errors from settings conversion
    
    - Fix str | None attribute access in responses_client (walrus operator)
    - Fix SecretString | None narrowing in bedrock (type: ignore after guard)
    - Convert _context_provider.py attribute access to dict access (missed file)
    - Fix endpoint type narrowing in search_provider and context_provider
    - Fix purview: str | None .rstrip(), int | None defaults, urlparse bytes
    
    * Address PR review: required_fields param, type validation, fixes
    
    - Move required field validation from TypedDict annotations (Required)
      to a required_fields parameter on load_settings(), enabling runtime
      decisions about which fields are required
    - Remove Required imports and restore from __future__ import annotations
      in ollama and foundry_local
    - Add _check_override_type() for deterministic ServiceInitializationError
      on invalid override types (e.g. dict passed for str field)
    - Fix all multi-exception test catches back to single exception type
    - Fix Ollama host=None: use .get() so None is passed through to SDK default
    - Fix Purview processor: use explicit is-None checks instead of or operator
    - Remove unused BaseModel import from openai/_shared.py
    - Add 4 new tests (24 total): required_fields param, type validation
    
    * Fix type validation: allow int for float fields
    
    _check_override_type now permits int values for float-typed fields,
    matching Python's standard numeric promotion behavior.
    
    * fix: wrap urlparse arg with str() to fix mypy bytes endswith error
  • .NET Workflows - Add unit tests for DefaultActionExecutor (Declarative Workflows) (#3836)
    * Initial plan
    
    * Add comprehensive unit tests for DefaultActionExecutor with 100% code coverage
    
    Co-authored-by: crickman <66376200+crickman@users.noreply.github.com>
    
    * Address code review feedback: Add explicit Xunit using and improve variable naming
    
    Co-authored-by: crickman <66376200+crickman@users.noreply.github.com>
    
    * Streamlined tests
    
    * Update dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/ObjectModel/DefaultActionExecutorTest.cs
    
    Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
    
    * Restore all 4 test cases and remove redundant event assertions
    
    Co-authored-by: crickman <66376200+crickman@users.noreply.github.com>
    
    * Remove redudant tests
    
    ---------
    
    Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
    Co-authored-by: crickman <66376200+crickman@users.noreply.github.com>
    Co-authored-by: Chris Rickman <crickman@microsoft.com>
    Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
  • Python: Fix declarative package powerfx import crash and response_format kwarg error (#3841)
    * Fix declarative package powerfx import crash and response_format kwarg error
    
    * Address PR feedback. Propagate kwargs for declarative workflows
    
    * move tests
    
    * Fix options merge logic
  • .NET Workflows - Add unit tests for CopyConversationMessagesExecutor (Declarative Workflows) (#3834)
    * Initial plan
    
    * Add CopyConversationMessagesExecutorTest with 7 comprehensive test cases
    
    Co-authored-by: crickman <66376200+crickman@users.noreply.github.com>
    
    * Simplify ExecuteTestAsync to avoid duplicate event filtering logic
    
    Co-authored-by: crickman <66376200+crickman@users.noreply.github.com>
    
    * Refine
    
    ---------
    
    Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
    Co-authored-by: crickman <66376200+crickman@users.noreply.github.com>
    Co-authored-by: Chris Rickman <crickman@microsoft.com>
  • [BREAKING] Python: Checkpoint refactor: encode/decode, checkpoint format, etc (#3744)
    * WIP: Checkpoint refactor: encode/decode, checkpoint format, etc
    
    * WIP: Remove workflow ID in checkpoints
    
    * Refactor checkpointing
    
    * Add get_latest tests
    
    * Increase test coverage
    
    * Fix formatting
    
    * Fix unit tests
    
    * Fix samples
    
    * fix unit tests
    
    * fix pipeline
    
    * Copilot comments
    
    * Fix tests
    
    * Fix more tests
    
    * Address comments part 1
    
    * Address comments part 2
    
    * Comments
  • .NET Workflows - Add unit tests for EditTableExecutorAction (Declarative Workflows) (#3832)
    * Initial plan
    
    * Add comprehensive unit tests for EditTableExecutor with 100% coverage
    
    Co-authored-by: crickman <66376200+crickman@users.noreply.github.com>
    
    * Remove redundant State.Bind() calls from EditTableExecutorTest
    
    Co-authored-by: crickman <66376200+crickman@users.noreply.github.com>
    
    * Fix formatting
    
    * Update dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/ObjectModel/EditTableExecutorTest.cs
    
    Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
    
    ---------
    
    Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
    Co-authored-by: crickman <66376200+crickman@users.noreply.github.com>
    Co-authored-by: Chris Rickman <crickman@microsoft.com>
    Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
  • Python: Add more packages to unit test coverage gate (#3831)
    * Add more packages to unit test coverage gate
    
    * Trigger workflow
    
    * Remove azure ai search
    
    * Add purview
    
    * Add declarative to coverage report
  • Bump cryptography from 46.0.4 to 46.0.5 in /python (#3839)
    Bumps [cryptography](https://github.com/pyca/cryptography) from 46.0.4 to 46.0.5.
    - [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
    - [Commits](https://github.com/pyca/cryptography/compare/46.0.4...46.0.5)
    
    ---
    updated-dependencies:
    - dependency-name: cryptography
      dependency-version: 46.0.5
      dependency-type: indirect
    ...
    
    Signed-off-by: dependabot[bot] <support@github.com>
    Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
  • Python: Allow AzureOpenAIResponsesClient creation with Foundry project endpoint (#3814)
    * Initial plan
    
    * feat: extend AzureOpenAIResponsesClient to support Foundry project endpoints
    
    Add project_client and project_endpoint parameters to allow creating
    the client via an Azure AI Foundry project. When provided, the client
    uses AIProjectClient.get_openai_client() to obtain the OpenAI client.
    The azure-ai-projects package is imported lazily and only required
    when using the project endpoint path.
    
    Co-authored-by: eavanvalkenburg <13749212+eavanvalkenburg@users.noreply.github.com>
    
    * fix: address code review - remove duplicate MagicMock imports in tests
    
    Co-authored-by: eavanvalkenburg <13749212+eavanvalkenburg@users.noreply.github.com>
    
    * fix: add type field to Responses API input items and add Foundry sample
    
    - Add 'type: message' to input items in _prepare_message_for_openai
      to comply with the Responses API schema requirement
    - Filter out empty dicts from unsupported content types to prevent
      sending items with invalid empty type values
    - Add azure_responses_client_with_foundry.py sample demonstrating
      AzureOpenAIResponsesClient with project_endpoint
    - Update README and pyrightconfig.samples.json accordingly
    
    * updates to response format and setup
    
    * fix: patch AIProjectClient at correct module path in test
    
    Patch agent_framework.azure._responses_client.AIProjectClient instead of
    azure.ai.projects.aio.AIProjectClient since the import is at module level.
    
    * docs: add Foundry sample to READMEs and document AZURE_AI_PROJECT_ENDPOINT env var
    
    ---------
    
    Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
    Co-authored-by: eavanvalkenburg <13749212+eavanvalkenburg@users.noreply.github.com>
    Co-authored-by: eavanvalkenburg <github@vanvalkenburg.eu>
  • Bump poethepoet from 0.40.0 to 0.41.0 in /python (#3767)
    Bumps [poethepoet](https://github.com/nat-n/poethepoet) from 0.40.0 to 0.41.0.
    - [Release notes](https://github.com/nat-n/poethepoet/releases)
    - [Commits](https://github.com/nat-n/poethepoet/compare/v0.40.0...v0.41.0)
    
    ---
    updated-dependencies:
    - dependency-name: poethepoet
      dependency-version: 0.41.0
      dependency-type: direct:development
      update-type: version-update:semver-minor
    ...
    
    Signed-off-by: dependabot[bot] <support@github.com>
    Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
    Co-authored-by: Mark Wallace <127216156+markwallace-microsoft@users.noreply.github.com>
  • Python: [BREAKING] Replace Hosted*Tool classes with tool methods (#3634)
    * Replace Hosted*Tool classes with client static factory methods
    
    * fixed failing test
    
    * mypy fix
    
    * mypy fix 2
    
    * declarative mypy fix
    
    * addressed comments
    
    * ToolProtocol removal
    
    * fixed test
    
    * agents mypy fix
    
    * fix failing tests
    
    * mypy fix
    
    * addressed comments
    
    * fixed tests
    
    * addressed comments + added factory method overrides for azureai v2 client
    
    * mypy fix
    
    * added kwargs to azureai tool methods
    
    * fixed in test
    
    * _sessions fix
    
    * test fix
  • .NET: Add unit tests for EditTableV2Executor (#3773)
    * Initial plan
    
    * Add comprehensive unit tests for EditTableV2Executor
    
    - Test AddItemOperation with record and scalar values
    - Test ClearItemsOperation
    - Test RemoveItemOperation
    - Test TakeLastItemOperation (with items and empty table)
    - Test TakeFirstItemOperation (with items and empty table)
    - Test error cases (null ItemsVariable, non-table variable)
    - Include ExecuteTestAsync and CreateModel helper methods
    - All 10 tests passing
    
    Co-authored-by: crickman <66376200+crickman@users.noreply.github.com>
    
    * Add comprehensive unit tests for EditTableV2Executor - complete with 100% coverage
    
    - Added 13 comprehensive tests covering all code paths
    - Test AddItemOperation with record and scalar values
    - Test ClearItemsOperation
    - Test RemoveItemOperation (including non-table value case)
    - Test TakeLastItemOperation (with items and empty table)
    - Test TakeFirstItemOperation (with items and empty table)
    - Test error cases (null ItemsVariable, non-table variable, null operation values)
    - Include ExecuteTestAsync and CreateModel helper methods
    - 100% line and branch coverage achieved
    
    Co-authored-by: crickman <66376200+crickman@users.noreply.github.com>
    
    * Update tests / refine product code
    
    * Checkpoint
    
    * Updated
    
    * Update dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/ObjectModel/SetTextVariableExecutorTest.cs
    
    Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
    
    * Address code review feedback
    
    - Fix typo: rename metadataExpresssion to metadataExpression
    - Fix test name in AddMessageWithMetadataAsync (was using wrong test name)
    - Fix test name in ClearGlobalScopeAsync (was using wrong test name)
    - Remove pre-population in SetTextVariableExecutorTest that made tests ineffective
    - Use explicit .Where() filter in SetMultipleVariablesExecutorTest foreach loop
    
    Co-authored-by: crickman <66376200+crickman@users.noreply.github.com>
    
    ---------
    
    Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
    Co-authored-by: crickman <66376200+crickman@users.noreply.github.com>
    Co-authored-by: Chris Rickman <crickman@microsoft.com>
    Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
  • Python: [BREAKING] Simplify API: ChatAgent -> Agent, ChatMessage -> Message (#3747)
    * [BREAKING] Rename ChatAgent -> Agent, ChatMessage -> Message, ChatClientProtocol -> SupportsChatGetResponse
    
    Simplify the public API by removing redundant 'Chat' prefix from core types:
    - ChatAgent -> Agent
    - RawChatAgent -> RawAgent
    - ChatMessage -> Message
    - ChatClientProtocol -> SupportsChatGetResponse
    
    Also renamed internal WorkflowMessage (was Message in _runner_context) to avoid collision.
    
    No backward compatibility aliases - this is a clean breaking change.
    
    * [BREAKING] Rename Agent chat_client parameter to client
    
    * Fix rebase issues: WorkflowMessage references and broken markdown links
    
    * Fix formatting and lint issues from code quality checks
    
    * Fix import ordering in workflow sample files
    
    * fixed rebase
    
    * Fix test failures: use WorkflowMessage and A2AMessage after ChatMessage→Message rename
    
    - Replace Message(data=..., source_id=...) with WorkflowMessage(...) in workflow tests
    - Fix isinstance check in A2A agent to use A2AMessage instead of Message
    - Fix import in test_workflow_observability.py (Message→WorkflowMessage)
    
    * Fix lint, fmt, and sample errors after ChatMessage→Message rename
    
    - Auto-fix 70+ ruff lint issues across samples (ChatMessage→Message refs)
    - Fix HostedVectorStoreContent→Content.from_hosted_vector_store in file search sample
    - Fix _normalize_messages→normalize_messages in custom agent sample
    - Fix context.terminate→raise MiddlewareTermination in middleware samples
    - Fix with_update_hook→with_transform_hook in override middleware sample
    - Add TOptions_co import back to custom_chat_client sample
    - Add noqa for FastAPI File() default in chatkit sample
    - Fix B023 loop variable capture in weather agent sample
    
    * fix: update Agent constructor calls from chat_client to client in declaration-only tool tests
    
    * fix: add register_cleanup to devui lazy-loading proxy and type stub
    
    * fixed tests and updated new pieces
    
    * fix agui typevar
    
    * fix merge errors
    
    * fix merge conflicts
    
    * fiux merge
    
    * Remove unused links
    
    ---------
    
    Co-authored-by: Evan Mattson <evan.mattson@microsoft.com>
  • [BREAKING] Python: Remove workflow register factory methods. Update tests and samples (#3781)
    * Remove workflow register factory methods. Update tests and samples
    
    * Address Copilot feedback
  • Python: PR1 — New session and context provider types (side-by-side) (#3763)
    * PR1: Add core context provider types and tests
    
    New types in _sessions.py (no changes to existing code):
    - SessionContext: per-invocation state with extend_messages/get_messages/
      extend_instructions/extend_tools and read-only response property
    - _ContextProviderBase: base class with before_run/after_run hooks
    - _HistoryProviderBase: storage base with load/store flags, abstract
      get_messages/save_messages, default before_run/after_run
    - AgentSession: lightweight session with state dict, to_dict/from_dict
    - InMemoryHistoryProvider: built-in provider storing in session.state
    
    35 unit tests covering all classes and configuration flags.
    
    * feat: keyword-only params, stateless InMemoryHistoryProvider, deep serialization
    
    - Make before_run/after_run parameters keyword-only
    - InMemoryHistoryProvider stores ChatMessage objects directly (no per-cycle serialization)
    - Deep serialization via to_dict/from_dict only at session boundary
    - State type registry for automatic deserialization of registered types
    - Updated tests for new serialization approach
    
    * feat: add new-pattern provider implementations for external packages
    
    - _RedisContextProvider(BaseContextProvider) - Redis search/vector context
    - _RedisHistoryProvider(BaseHistoryProvider) - Redis-backed message storage
    - _Mem0ContextProvider(BaseContextProvider) - Mem0 semantic memory
    - _AzureAISearchContextProvider(BaseContextProvider) - Azure AI Search (semantic + agentic)
    
    All use temporary _ prefix names for side-by-side coexistence with existing providers.
    Will be renamed in PR2 when old ContextProvider/ChatMessageStore are removed.
    
    * test: add tests for new-pattern provider implementations
    
    - 32 tests for _RedisContextProvider and _RedisHistoryProvider
    - 29 tests for _Mem0ContextProvider
    - 17 tests for _AzureAISearchContextProvider
    
    * fix: address PR review comments and CI failures
    
    - Move module docstring before imports in _sessions.py (review comment)
    - Import TYPE_CHECKING unconditionally in Redis _context_provider.py (NameError on Python <3.12)
    - Fix Mem0 test_init_auto_creates_client_when_none to patch at class level
    
    * feat: add source attribution to extend_messages
    
    Set attribution marker in additional_properties for each message
    added via extend_messages(), matching the tool attribution pattern.
    Uses setdefault to preserve any existing attribution.
    
    * refactor: make attribution value a dict with source_id key
    
    * add attribution and use sets for filters
    
    * Add source_type to message attribution and copy messages in extend_messages
    
    - SessionContext.extend_messages now accepts source as str or object with
      source_id attribute; when an object is passed, its class name is recorded
      as source_type in the attribution dict
    - Messages are shallow-copied before attribution is added so callers'
      original objects are never mutated
    - Filter framework-internal keys (attribution) from A2A wire metadata
      to prevent leaking internal state over the wire
    
    * fix: correct mypy type: ignore comment from union-attr to attr-defined
    
    * set attribution to _attribution
    
    * adjusted naming of bools
  • Python: Add long-running agents and background responses support (#3808)
    * Python: Add long-running agents and background responses support
    
    - Add ContinuationToken TypedDict to core types
    - Add continuation_token field to ChatResponse, ChatResponseUpdate,
      AgentResponse, and AgentResponseUpdate
    - Add background and continuation_token options to OpenAIResponsesOptions
    - Implement polling via responses.retrieve() and streaming resumption
      in RawOpenAIResponsesClient
    - Propagate continuation tokens through agent run() and
      map_chat_to_agent_update
    - Fix streaming telemetry 'Failed to detach context' error in both
      ChatTelemetryLayer and AgentTelemetryLayer by avoiding
      trace.use_span() context attachment for async-managed spans
    - Add 14 unit tests for continuation token types and background flows
    - Add background_responses sample showing polling and stream resumption
    
    Fixes #2478
    
    * Python: Add A2A long-running task support via ContinuationToken
    
    - Make ContinuationToken provider-agnostic (total=False, optional task_id/context_id fields)
    - Add background param to A2AAgent.run() controlling token emission
    - Add poll_task() for single-request task state retrieval
    - Add resubscribe support via continuation_token param on run()
    - Extract _updates_from_task() and _map_a2a_stream() for cleaner code
    - Streamline run()/streaming by removing intermediate _stream_updates wrapper
    - Update A2A sample to show background=False (default) with link to background_responses sample
    - Remove stale BareAgent from __all__
    - Add 12 new A2A continuation token tests
    
    * fix logic for overriding continuation token when done
    
    * refactored ContinuationToken setup
  • Python: Add streaming support for code interpreter deltas (#3775)
    * add streaming support for code interpreter deltas
    
    * addressed copilot comments
    
    * mypy fix
  • Python: [BREAKING] Standardize TypeVar naming convention (TName → NameT) (#3770)
    * standardized typevar to use suffix T
    
    * addressed copilot comments
  • .NET: [BREAKING] Update message source code to match python. (#3805)
    * Update message source code to match python.
    
    * Apply suggestion from @Copilot
    
    Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
    
    * Address PR comment
    
    * Move setting of source information to extension method
    
    * Add underscore for attribution key to indicate internal usage
    
    * Stick to version 102 of the SDK since 103 is causing issues.
    
    * Revert global.json change
    
    * Fix unit test
    
    ---------
    
    Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
  • Python: Include sub-workflow structure in graph signature for checkpoint validation (#3783)
    * Include sub-workflow structure in graph signature for checkpoint validation
    
    * Remove redundant computation
  • .NET: Add Foundry Agents Tool Sample - Local MCP (#3703)
    * .NET: Add Local MCP sample #3674
    
    * Apply format fixes
    
    * .NET: Use local MCP client instead of hosted MCP in Step27 sample
    
    * Address PR review feedback: cleanup, try/finally, update parent README
  • .NET: Fix: Checkpoint Deserialization breaks when JSON metadata properties are out of order (#3442)
    * Fix checkpoint JSON deserialization with out-of-order metadata properties (#2962)
    
    * Simplify: propagate AllowOutOfOrderMetadataProperties from incoming JsonSerializerOptions
  • Fix streaming path to include chat history in messages sent to chat client (#3798)
    RunCoreStreamingAsync was passing inputMessagesForProviders (which lacks
    chat history) to GetStreamingResponseAsync instead of
    inputMessagesForChatClient (which includes chat history). This caused
    streaming runs to lose conversation context on subsequent calls.
    
    The non-streaming path (RunCoreAsync) already correctly used
    inputMessagesForChatClient. This aligns the streaming path to match.
    
    Also adds a unit test that validates chat history is included in
    messages sent to the chat client during streaming on subsequent calls.
    
    Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
    Co-authored-by: lokitoth <6936551+lokitoth@users.noreply.github.com>
  • Python: Fix prek runner duplication and add skills (#3791)
    * Python: fix prek runner running fmt/lint in all packages on core change
    
    When a core package file changed, run_tasks_in_changed_packages.py ran
    fmt, lint, and pyright in ALL 22 packages (66 tasks). Only type-checking
    tasks (pyright, mypy) need to propagate to all packages since type
    changes in core affect downstream packages. File-local tasks (fmt, lint)
    only need to run in packages with actual file changes.
    
    This reduces a core-only change from 66 tasks to 24 tasks (2 local +
    22 pyright).
    
    Also adds no-commit-to-branch builtin hook to protect the main branch
    from direct commits.
    
    * Python: add agent skills extracted from AGENTS.md and coding standards
    
    Add 5 skills to python/.github/skills/ following the Agent Skills format:
    - python-development: coding standards, type annotations, docstrings, logging
    - python-testing: test structure, fixtures, running tests, async mode
    - python-code-quality: linting, formatting, type checking, prek hooks, CI
    - python-package-management: monorepo structure, lazy loading, versioning
    - python-samples: sample structure, PEP 723, documentation guidelines
    
    * Python: deduplicate AGENTS.md and instructions with agent skills
    
    * updated skills
    
    * fixes from review
    
    * Python: increase timeout for web search integration test
  • Python: Fix code samples in AGENTS.md files that fail pre-commit checks (#3779)
    * Fix code samples in AGENTS.md files that fail pre-commit checks
    
    * Fixes
  • Python: ADR: Unifying Context Management with ContextMiddleware (Python) (#3609)
    * Add ADR for Python ContextMiddleware unification
    
    * Add session serialization/deserialization design to ADR
    
    * Add Related Issues section mapping to ADR
    
    * Update session management: create_session, get_session_by_id, agent.serialize_session
    
    * ADR: Add hooks alternative, context compaction discussion, and PR feedback
    
    - Add Option 3: ContextHooks with before_run/after_run pattern
    - Add detailed pros/cons for both wrapper and hooks approaches
    - Add Open Discussion section on context compaction strategies
    - Clarify response_messages is read-only (use AgentMiddleware for modifications)
    - Add SimpleRAG examples showing input-only filtering
    - Clarify default storage only added when NO middleware configured
    - Add RAGWithBuffer examples for self-managed history
    - Rename hook methods to before_run/after_run
    
    * ADR: Restructure and add .NET comparison
    
    - Add class hierarchy clarification for both options
    - Merge detailed design sections (side-by-side comparison)
    - Move detailed design before decision outcome
    - Move compaction discussion after decision
    - Add .NET implementation comparison (feature equivalence)
    - Update .NET method names to match actual implementation
    - Rename hook methods to before_run/after_run
    - Fix storage context table for injected context
    
    * tweaks
    
    * fix smart load
    
    * ADR: Add naming discussion note for ContextHooks
    
    - Note that class and method names are open for discussion
    - Add alternative method naming options table
    - Include invoking/invoked as option matching current Python and .NET
    
    * Update context middleware design: remove smart mode, add attribution filtering
    
    - Remove smart mode for load_messages (now explicit bool, default True)
    - Add attribution marker in additional_properties for message filtering
    - Update validation to warn on multiple or zero storage loaders
    - Add note about ChatReducer naming from .NET
    - Note that attribution should not be propagated to storage
    
    * Add Decision 2: Instance Ownership (instances in session vs agent)
    
    - Option A: Instances in Session (current proposal)
    - Option B: Instances in Agent, State in Session
      - B1: Simple dict state with optional return
      - B2: SessionState object with mutable wrapper
    - Updated examples to use Hooks pattern (before_run/after_run)
    - Added open discussion on hook factories in Option B model
    
    * Update ADR: Choose ContextPlugin with before_run/after_run and Option B1
    
    Decision outcomes:
    - Option 3 (Hooks pattern) with ContextPlugin class name
    - Methods: before_run/after_run
    - Option B1: Instances in Agent, State in Session (simple dict)
    - Whole state dict passed to plugins (mutable, no return needed)
    - Added trust note: plugins reason over messages, so they're trusted by default
    
    Status changed from proposed to accepted.
    
    * Add agent and session params to before_run/after_run methods
    
    Signature now: before_run(agent, session, context, state)
    
    * Remove ContextPluginRunner, store plugins directly on agent
    
    Simpler design: agent stores Sequence[ContextPlugin] and calls
    before_run/after_run directly in the run method.
    
    * Update workplan to 2 PRs for simpler review
    
    * updated doc
    
    * Refine ADR: serialization, ownership, decorators, session methods, exports
    
    - Add to_dict()/from_dict() on AgentSession with 'type' discriminator
    - Present serialization as Option A (direct) vs Option B (through agent)
    - Rewrite ownership section as 2x2 matrix (orthogonal decision)
    - Move Instance Ownership Options before Decision Outcome
    - Fix get_session to use service_session_id, split from create_session
    - Add decorator-based provider convenience API (@before_run/@after_run)
    - Add _ prefix naming strategy for all PR1 types (core + external)
    - Constructor compatibility table for existing providers
    - Add load_messages=False skip logic to all agent run loops
    - Clarify abstract vs non-abstract in execution pattern samples
    - Update auto-provision: trigger on conversation_id or store=True
    - Document root package exports (ContextProvider, HistoryProvider, etc.)
    - Rename section heading to 'Key Design Considerations'
    
    * Rename ADR to 0016-python-context-middleware.md
    
    * Fix broken link: #3-unified-storage-middleware → #3-unified-storage
  • Python: Fix workflow not pausing when agent calls declaration-only tool (#3757)
    * Fix workflow not pausing when agent calls declaration-only tool
    
    * Remove comment
  • .NET: Workflow telemetry opt in (#3467)
    * feat(workflows): Make telemetry opt-in via WithOpenTelemetry()
    
    - Add WorkflowTelemetryOptions class with EnableSensitiveData property
    - Add WorkflowTelemetryContext to manage ActivitySource lifecycle
    - Add WithOpenTelemetry() extension method on WorkflowBuilder
    - Update all workflow components to use telemetry context:
      - WorkflowBuilder, Workflow, Executor
      - InProcessRunnerContext, InProcessRunner
      - LockstepRunEventStream, StreamingRunEventStream
      - All edge runners (Direct, FanIn, FanOut, Response)
    - Telemetry is now disabled by default
    - Users must call WithOpenTelemetry() to enable spans/activities
    
    BREAKING CHANGE: Workflow telemetry is now opt-in. Users who relied on
    automatic telemetry must add .WithOpenTelemetry() to their workflow builder.
    
    * refactor: Pass telemetry context as parameter instead of via interface
    
    - Remove IWorkflowContextWithTelemetry interface
    - Add internal ExecuteAsync overload that accepts WorkflowTelemetryContext
    - Public ExecuteAsync delegates with WorkflowTelemetryContext.Disabled
    - InProcessRunner passes TelemetryContext when calling ExecuteAsync
    - BoundContext now implements IWorkflowContext (not the removed interface)
    
    * Add optional ActivitySource parameter to WithOpenTelemetry
    
    Allow users to provide their own ActivitySource when enabling telemetry,
    giving them better control over the ActivitySource lifecycle. When not
    provided, the framework creates one internally (existing behavior).
    
    Changes:
    - Add optional activitySource parameter to WithOpenTelemetry() extension
    - Update WorkflowTelemetryContext to accept external ActivitySource
    - Add unit test for user-provided ActivitySource scenario
    
    * Add component-level telemetry control with disable flags
    
    Allow users to selectively disable specific activity types via
    WorkflowTelemetryOptions. All activities are enabled by default.
    
    New disable flags:
    - DisableWorkflowBuild: Disables workflow.build activities
    - DisableWorkflowRun: Disables workflow_invoke activities
    - DisableExecutorProcess: Disables executor.process activities
    - DisableEdgeGroupProcess: Disables edge_group.process activities
    - DisableMessageSend: Disables message.send activities
    
    Added helper methods to WorkflowTelemetryContext for each activity type
    and updated all activity creation sites to use them.
    
    * Implement EnableSensitiveData to log executor input/output
    
    When EnableSensitiveData is true in WorkflowTelemetryOptions, executor
    input and output are logged as JSON-serialized attributes in the
    executor.process activity.
    
    New activity tags:
    - executor.input: JSON serialized input message
    - executor.output: JSON serialized output result (non-void only)
    
    Added suppression attributes for AOT/trimming warnings since this is
    an opt-in feature for debugging/diagnostics.
    
    * Refactor activity start methods to centralize tagging logic
    
    Move tagging logic into WorkflowTelemetryContext methods:
    - StartExecutorProcessActivity now accepts executorId, executorType,
      messageType, and message; sets all tags including executor.input
      when EnableSensitiveData is true
    - Added SetExecutorOutput method to set executor.output after execution
    - StartMessageSendActivity now accepts sourceId, targetId, and message;
      sets all tags including message.content when EnableSensitiveData is true
    
    Simplified Executor.cs and InProcessRunnerContext.cs by removing
    inline tagging code. Added message.content tag constant.
    
    * Revert Python changes
    
    * Update samples and code cleanup
    
    * Fix file formatting
    
    * Add comment
    
    * Add telemetry configuration to declarative workflow
    
    * Remove delays in tests
    
    * Address comments