Skip to content

Python: [Bug]: Streamed updates from different authors are merged into one message #9352

Closed

Description

Observed Behavior

When streamed updates are combined into a response (ChatResponse.from_updates, AgentResponse.from_updates, or get_final_response() on a stream), updates from different authors are merged into one message when they carry no message_id. The merged message keeps the last author's author_name and contains the text of every author.

Most chat clients do not set message_id on streaming updates, so this happens in multi-agent streams. For example, with a sequential workflow used as an agent:

workflow_agent = SequentialBuilder(participants=[writer, reviewer], output_from="all").build().as_agent()
  • await workflow_agent.run("hi") returns two messages: ("writer", "Draft text.") and ("reviewer", "Looks good.").
  • run("hi", stream=True) followed by get_final_response() returns one message: ("reviewer", "Draft text. Looks good. ").

The author_name docstrings of ChatResponseUpdate and AgentResponseUpdate say it identifies which agent generated the update and is propagated to the resulting messages.

Expected Behavior

An update with a different, non-empty author_name starts a new message, the same way a different non-empty message_id already does. Streaming and non-streaming runs give the same messages.

Steps to Reproduce

  1. Create updates from two authors, without message_id.
  2. Combine them with AgentResponse.from_updates (or ChatResponse.from_updates).
  3. Look at the resulting messages.

Minimal Reproduction

from agent_framework import AgentResponse, AgentResponseUpdate, Content

updates = [
    AgentResponseUpdate(contents=[Content.from_text("Draft text.")], role="assistant", author_name="writer"),
    AgentResponseUpdate(contents=[Content.from_text("Looks good.")], role="assistant", author_name="reviewer"),
]
response = AgentResponse.from_updates(updates)
print([(message.author_name, message.text) for message in response.messages])
# [('reviewer', 'Draft text.Looks good.')]
# expected [('writer', 'Draft text.'), ('reviewer', 'Looks good.')]

The cause is in _process_update in agent_framework/_types.py: a new message starts only when the role or a non-empty message_id changes; a change of author_name is ignored.

Error Messages and Stack Traces

No error. The writer's text is attributed to the reviewer, and one message is lost.

Package Versions

agent-framework-core: 1.21.0 (main at b5e5521), agent-framework-orchestrations (same main)

Python Version

Python 3.12

Additional Context

I'd like to fix this. The change is one extra condition in _process_update (start a new message when both the update and the last message have an author_name and they differ), plus regression tests. Updates without an author_name, and a message that has no author yet, keep today's behavior.

AI assistance: I used an AI coding assistant for the analysis and to draft this report. I reproduced and verified the behavior myself.

Metadata

Metadata

Assignees

No one assigned

    Labels

    pythonUsage: [Issues, PRs], Target: PythontriageUsage: [Issues], Target: All issues that still need to be triaged

    Type

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions