a2aproject / a2aproject/a2a-dotnet
Relax v0.3 response deserialization status.message missing 'kind' and 'messageId'
- Lenguaje dominante
- C#
- Estrellas
- 262
- Forks
- 64
- Merge medio
- 5 d 2 h
- PR fusionados (30 d)
- 31
Descripción
## 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
```
Guía de contribución
Evaluación
Este issue todavía no se ha evaluado.