Skip to content

Commit 0fdcfd0

Browse files
Python: preserve A2A message context_id (microsoft#4686)
* Python: forward A2A context_id * Avoid duplicating A2A context ids Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 414496d commit 0fdcfd0

2 files changed

Lines changed: 19 additions & 1 deletion

File tree

python/packages/a2a/agent_framework_a2a/_agent.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -486,13 +486,14 @@ def _prepare_message_for_a2a(self, message: Message) -> A2AMessage:
486486
raise ValueError(f"Unknown content type: {content.type}")
487487

488488
# Exclude framework-internal keys (e.g. attribution) from wire metadata
489-
internal_keys = {"_attribution"}
489+
internal_keys = {"_attribution", "context_id"}
490490
metadata = {k: v for k, v in message.additional_properties.items() if k not in internal_keys} or None
491491

492492
return A2AMessage(
493493
role=A2ARole("user"),
494494
parts=parts,
495495
message_id=message.message_id or uuid.uuid4().hex,
496+
context_id=message.additional_properties.get("context_id"),
496497
metadata=metadata,
497498
)
498499

python/packages/a2a/tests/test_a2a_agent.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -507,6 +507,23 @@ def test_prepare_message_for_a2a_with_multiple_contents() -> None:
507507
assert result.parts[3].root.kind == "text" # JSON text remains as text (no parsing)
508508

509509

510+
def test_prepare_message_for_a2a_forwards_context_id() -> None:
511+
"""Test conversion of Message preserves context_id without duplicating it in metadata."""
512+
513+
agent = A2AAgent(client=MagicMock(), _http_client=None)
514+
515+
message = Message(
516+
role="user",
517+
contents=[Content.from_text(text="Continue the task")],
518+
additional_properties={"context_id": "ctx-123", "trace_id": "trace-456"},
519+
)
520+
521+
result = agent._prepare_message_for_a2a(message)
522+
523+
assert result.context_id == "ctx-123"
524+
assert result.metadata == {"trace_id": "trace-456"}
525+
526+
510527
def test_parse_contents_from_a2a_with_data_part() -> None:
511528
"""Test conversion of A2A DataPart."""
512529

0 commit comments

Comments
 (0)