a2aproject / a2aproject/a2a-inspector

Message-kind responses with data parts are not rendered in chat

Aperta
#151 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub
Lingua principale
TypeScript
Stelle
490
Fork
152
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Descrizione

## Summary

The chat UI does not render agent responses when the response is a `message`-kind event containing `data` parts (structured JSON). The message is received by the inspector but nothing is displayed.

## Root Cause

In `frontend/src/script.ts`, the `case 'message'` handler inside the `socket.on('agent_response', ...)` listener only looks for `text` parts:

```typescript
const textPart = event.parts?.find(p => p.text);
if (textPart && textPart.text) {
// render text
}
```

If all parts are `data` parts (i.e. `kind: 'data'`, `data: {...}`), `textPart` is `undefined` and nothing is rendered — the message arrives but is silently dropped in the UI.

The `processPart` helper function already handles `data` parts correctly (renders as formatted `

` JSON), but it is only called in the `task`, `status-update`, and `artifact-update` cases — not in the `message` case.

## Steps to Reproduce

1. Connect the inspector to an A2A v1.0 agent that returns an **immediate Message response** (i.e. uses the synchronous workflow — enqueues a `Message` object rather than a `Task` with artifacts)
2. Send any message
3. The agent's response arrives (visible in the Debug Console) but the chat window remains empty

## Expected Behaviour

Structured data returned in a `message`-kind response should be rendered as formatted JSON in the chat window, consistent with how `data` parts are rendered in `artifact-update` responses.

## Proposed Fix

Replace the text-only lookup with a loop over all parts using the existing `processPart` helper:

```typescript
case 'message': {
const allContent: string[] = [];
event.parts?.forEach(p => {
const content = processPart(p);
if (content) allContent.push(content);
});
if (allContent.length > 0) {
const combinedContent = allContent.join('');
const messageHtml = `${event.kind} ${combinedContent}`;
appendMessage('agent', messageHtml, displayMessageId, true, validationErrors);
}
break;
}
```

This renders `text`, `data`, and `file` parts in message responses using the same logic already used for artifacts.

## Context

Discovered while validating a Google Maps A2A v1.0 agent (`a2a-sdk` based) that uses the immediate Message response pattern for synchronous skill calls.

Guida per i contributori

Apri la guida per i contributori

Valutazione

Questa issue non è ancora stata valutata.

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.