a2aproject / a2aproject/a2a-dotnet

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

Ouverte
#396 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub
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

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.