a2aproject / a2aproject/a2a-dotnet

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

Đang mở
#396 0 bình luận 0 reaction 0 người được giao Xem trên GitHub
Ngôn ngữ chính
C#
Star
262
Fork
64
Merge trung bình
5 ngày 2 giờ
Pull request đã merge (30 ngày)
31

Mô tả

## 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
```

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Đánh giá

Issue này chưa được đánh giá.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.