a2aproject / a2aproject/a2a-dotnet

Relax v0.3 response deserialization status.message missing 'kind' and 'messageId'

未關閉
#396 0 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視
主要語言
C#
星號
262
分支
64
平均合併
5 天 2 小時
30 天內合併 PR
31

描述

## Summary

When deserializing v0.3 task responses, `A2A.V0_3.AgentMessage` requires `kind` and `messageId` properties to be present. However, real-world v0.3 agents return `status.message` without these fields, causing `System.Text.Json` to throw "missing required properties including: 'kind', 'messageId'".

## Root Cause

The v0.3.0 specification was inconsistent in its requirements due to discrepancies between the `.proto` schema and the JSON Schema. Some agents implemented against one schema and not the other, resulting in `status.message` payloads like:

```json
{
"role": "agent",
"parts": [{"kind": "text", "text": "..."}]
}
```

which omit the `kind: "message"` discriminator and `messageId` that the .NET SDK's `AgentMessage` type requires.

## Failing Payload

```json
{
"jsonrpc": "2.0",
"id": "1",
"result": {
"id": "63b2861e-...",
"contextId": "2c727c41-...",
"kind": "task",
"status": {
"state": "completed",
"message": {
"role": "agent",
"parts": [{"kind": "text", "text": "Skill completed."}]
},
"timestamp": "2026-05-17T15:59:43.401Z"
},
"artifacts": [...]
}
}
```

The `"kind": "task"` discriminator on the outer response is handled correctly (deserialized as `AgentTask`). The failure is deeper `AgentTask.Status.Message` tries to deserialize into `AgentMessage` which requires `kind` and `messageId`.

## Suggested Fix

Relax the `AgentMessage` deserialization in the v0.3 models to:
1. Make `kind` optional (default to `"message"` if absent)
2. Make `messageId` optional (generate a UUID if absent)

This would allow the SDK to handle payloads from agents that implemented against either the `.proto` or JSON Schema definition of v0.3, without breaking agents that do include these fields.

## Affected Packages

- `A2A.V0_3` (1.0.0-preview2)
- `A2A.V0_3Compat` (1.0.0-preview2) conversion to v1 types never runs because deserialization fails first

## Reproduction

Use `a2a-ask` v1.3.0 with `--a2a-version 0.3` against any v0.3 agent that returns `status.message` without `kind`/`messageId`:

```bash
a2a-ask send -m "test" --a2a-version 0.3
```

貢獻指南

開啟貢獻指南

評估

這個 Issue 還沒有評估資料。

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。