a2aproject / a2aproject/a2a-dotnet

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

Abierto
#396 0 comentarios 0 reacciones 0 asignados Ver en GitHub
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

Abrir la guía de contribución

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.