a2aproject / a2aproject/a2a-dotnet
Relax v0.3 response deserialization status.message missing 'kind' and 'messageId'
- Langage dominant
- C#
- Étoiles
- 262
- Forks
- 64
- Merge moyen
- 5 j 2 h
- PR mergées (30 j)
- 31
Description
## 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
```
Guide de contribution
Ouvrir le guide de contribution
Piste de recherche
The issue is in the A2A.V0_3 package's AgentMessage deserialization. Look at the A2A.V0_3.AgentMessage type definition and its JSON serialization attributes. The fix involves modifying the model to make the 'kind' and 'messageId' properties optional, likely using [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)] or similar. Check the test suite for v0.3 deserialization to ensure the change doesn't break existing functionality. A good starting point is the file containing the AgentMessage class.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- csharp, json
- Domaine
- api, backend
- Type d'issue
- Bug
- Difficulté
- 3/5
- Temps estimé
- 1-2 jours
- Activité
- Calme
- Clarté
- Clairement spécifiée
- Accessibilité débutants
- 55/100