Files
Evan Mattson 435201b71b Python: Fix A2A input handling in orchestrations (#7761)
* fix(a2a): reject empty invocations explicitly

Key decisions:
- Keep A2A continuation authority explicit; durable session task state only enriches diagnostics.
- Raise AgentInvalidRequestException with participant and available task context instead of inventing input.
- Leave AgentExecutor and Group Chat production contracts unchanged.

Files changed:
- packages/a2a/agent_framework_a2a/_agent.py
- packages/a2a/tests/test_a2a_agent.py
- packages/a2a/tests/test_a2a_group_chat.py

Notes for next iteration:
- No blockers. INPUT_REQUIRED pause/resume remains a separate task.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(a2a): pause group chat for remote input

Key decisions:
- Translate A2A INPUT_REQUIRED task content into the existing Content user-input-request contract.
- Use the remote task ID as stable request correlation for streamed and finalized responses.
- Reuse AgentExecutor request handling so caller input resumes the same task without a workflow-specific A2A path.

Files changed:
- packages/a2a/agent_framework_a2a/_agent.py
- packages/a2a/tests/test_a2a_agent.py
- packages/a2a/tests/test_a2a_group_chat.py

Notes for next iteration:
- Checkpoint restoration of pending A2A input is now unblocked.
- The local issue file could not be moved because repository issue files are restricted by content exclusion policy.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(a2a): restore pending input from checkpoints

Key decisions:
- Keep normalized INPUT_REQUIRED content durable by excluding transport-only protobuf raw representations.
- Restore through the existing AgentExecutor checkpoint and request-response path without a new schema or continuation API.
- Cover file-backed restoration in streaming and non-streaming Group Chat runs, including unrelated-response rejection and exact task resumption.

Files changed:
- packages/a2a/agent_framework_a2a/_agent.py
- packages/a2a/tests/test_a2a_group_chat.py

Notes for next iteration:
- The local issue file could not be moved because repository issue files are restricted by content exclusion policy.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* test(handoff): lock textless target context

Key decisions:
- Exercise the built Handoff workflow in streaming and non-streaming modes instead of bypassing routing, sessions, or termination.
- Keep the slice test-only because current production already carries the initial task to a textless handoff target without synthetic user input.
- Revisit the source to verify its handoff function call retains a matching result and user-turn termination sees only caller messages.

Files changed:
- packages/orchestrations/tests/test_handoff.py

Notes for next iteration:
- No production defect was reproduced.
- The local issue file could not be moved because repository issue files are restricted by content exclusion policy.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* test(handoff): use resolved IDs in event assertions

* fix(workflows): preserve A2A input request semantics

* fix(workflows): preserve input request correlation

* fix(a2a): deduplicate message-less input requests

* fix(workflows): preserve specialized input requests

* test(openai): use current web search model

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-08-19 23:55:01 +00:00
..