Skip to content

Python: preserve response update metadata in WorkflowAgent forwarding - #7999

Open
HeZzz (HeZ2z) wants to merge 4 commits into
microsoft:mainfrom
HeZ2z:fix/workflow-agent-metadata-7952
Open

Python: preserve response update metadata in WorkflowAgent forwarding#7999
HeZzz (HeZ2z) wants to merge 4 commits into
microsoft:mainfrom
HeZ2z:fix/workflow-agent-metadata-7952

Conversation

@HeZ2z

Copy link
Copy Markdown

Motivation & Context

WorkflowAgent wraps a workflow and forwards executor emissions through _convert_workflow_event_to_agent_response_updates(). The method documentation promises that output and intermediate events are forwarded as-is, but when reconstructing an AgentResponseUpdate the code only copied contents, role, author_name, IDs, created_at and raw_representation — silently dropping several response metadata fields.

Consumers streaming through WorkflowAgent.run(stream=True) therefore saw None for fields that were present on the executor's original update. This differs from running the same agent directly, breaks AgentResponse.from_updates() reconstruction for those fields, and can make long-running operations unresumable (lost continuation_token).

Description & Review Guide

  • What are the major changes?

    • _convert_workflow_event_to_agent_response_updates() now forwards finish_reason, continuation_token, agent_id, and additional_properties (as a shallow copy, so the forwarded update cannot alias the payload still referenced by the executor) when reconstructing an AgentResponseUpdate.
    • Added a streaming regression test that emits an AgentResponseUpdate with all metadata populated and asserts each field survives the wrapping.
  • What is the impact of these changes?

    • Purely additive: fields that are None continue to behave exactly as before. No breaking change.
  • What do you want reviewers to focus on?

    • Whether the shallow copy of additional_properties matches the project's preferred convention (vs. copy.copy).
    • Whether the other reconstruction branches (AgentResponse, Message, list[Message]) should receive the same treatment in this PR or a follow-up.

Related Issue

Fixes #7952

Contribution Checklist

  • The code builds clean without any errors or warnings
  • All unit tests pass, and I have added new tests where possible
  • The PR follows the Contribution Guidelines
  • This PR is linked to an issue and there is no other open PR for this issue (see Related Issue above).
  • This is not a breaking change. If it is a breaking change, add the breaking change label (or add "[BREAKING]" to the title prefix, before or after any language prefix) — a workflow keeps the label and title prefix in sync automatically.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Preserves metadata when WorkflowAgent forwards streaming response updates.

Changes:

  • Forwards response metadata, including continuation tokens.
  • Adds streaming regression coverage.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.

File Description
_workflows/_agent.py Copies metadata into forwarded updates.
test_workflow_agent.py Tests metadata preservation.

💡 Add a code-review agent skill for context-aware, tailored reviews. Learn more in the docs.

Comment thread python/packages/core/agent_framework/_workflows/_agent.py Outdated
@HeZ2z

Copy link
Copy Markdown
Author

@microsoft-github-policy-service agree

@moonbox3

Copy link
Copy Markdown
Contributor

HeZzz (@HeZ2z) please fix the failing CI/CD checks

Forward finish_reason, continuation_token, agent_id and a shallow copy
of additional_properties when WorkflowAgent reconstructs
AgentResponseUpdate objects from workflow events, matching the
documented as-is forwarding contract.
Use an explicit None check instead of a truthiness check so an
explicitly empty additional_properties dict is not converted to None,
preserving the forwarding contract.
…test

Fix type checker failures by constructing continuation_token as an
opaque dict per the ContinuationToken TypedDict instead of a bare
string, and resolve lint/typing nits in the new tests.
@HeZ2z
HeZzz (HeZ2z) force-pushed the fix/workflow-agent-metadata-7952 branch from ce711ed to eaa0131 Compare September 3, 2026 08:47
@HeZ2z

Copy link
Copy Markdown
Author

Hi Evan Mattson (@moonbox3), I’ve merged the latest main and verified the previously failing typing/lint issues are resolved. The focused workflow tests and Ruff checks pass locally. Could you please re-review when convenient? It also looks like the full Python CI checks have not been triggered for the latest commit.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

python Usage: [Issues, PRs], Target: Python

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Python: [Bug]: WorkflowAgent drops response metadata when forwarding AgentResponseUpdate

3 participants