AG-UI TOOL_CALL_RESULT metadata is dropped in the live stream reducer

Abierto
#2,068 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

@c446984928 ya está trabajando en esto.

Desde el 6/11/2026.

  • #2069 de @c446984928 — abierto

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
35/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Estancado
Stack tecnológico
typescript
Área
api, backend

Línea de trabajo

Read packages/ai/src/activities/chat/stream/processor.ts and packages/ai/src/activities/chat/stream/message-updaters.ts, then compare with the snapshot conversion in packages/ai/src/activities/chat/messages.ts. Check the existing tests for live tool result events and add coverage for metadata preservation on creation and update; done means live results retain metadata consistently with hydrated snapshots. An open linked pull request already covers this issue.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

Summary

The live AG-UI TOOL_CALL_RESULT handling path drops the event's metadata when constructing the ToolResultPart.

This makes metadata behave inconsistently between live streaming and message snapshot/history hydration: a ToolMessage.metadata received in a MESSAGES_SNAPSHOT can be preserved, but the same metadata delivered on a live TOOL_CALL_RESULT is not available on the resulting UIMessage.parts entry.

Expected behavior

When a TOOL_CALL_RESULT event contains metadata, the resulting ToolResultPart should retain it:

{
  type: 'tool-result',
  toolCallId: 'call-123',
  content: '...',
  state: 'complete',
  metadata: {
    displayType: 'account-assets',
  },
}

Actual behavior

In packages/ai/src/activities/chat/stream/processor.ts, handleToolCallResultEvent() receives the full event, but calls updateToolResultPart() without forwarding chunk.metadata.

In packages/ai/src/activities/chat/stream/message-updaters.ts, updateToolResultPart() constructs a ToolResultPart containing content, state, error, and outcome, but does not set metadata.

The public ToolResultPart type in packages/ai/src/types.ts already declares metadata?: Record<string, unknown>, and the snapshot conversion path in packages/ai/src/activities/chat/messages.ts preserves metadata from tool messages. So the type and snapshot path support this field, but the live event reducer currently drops it.

Reproduction

  1. Stream an AG-UI TOOL_CALL_RESULT event with a metadata object:

    {
      "type": "TOOL_CALL_RESULT",
      "messageId": "assistant-1",
      "toolCallId": "call-123",
      "content": "{\"ok\":true}",
      "metadata": {
        "displayType": "account-assets"
      }
    }
    
  2. Observe the resulting UIMessage.parts entry with type === 'tool-result'.

  3. The content is present, but metadata is missing.

Suggested fix

Forward the event metadata into updateToolResultPart() and persist it on the created ToolResultPart. Please also consider how metadata should be merged when an existing tool-result part is updated, so an update does not accidentally discard previously stored metadata.

Add a regression test covering:

  • Live TOOL_CALL_RESULT.metadata is retained in ToolResultPart.metadata.
  • Snapshot/history hydration and live streaming produce consistent metadata.
  • Updating an existing tool-result part does not unintentionally lose metadata.

Relevant code

Thanks!

Lenguaje dominante
TypeScript
Estrellas
3.3k
Forks
378
Merge medio
1 d 2 h
PR fusionados (30 d)
254

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de TanStack/ai

Todos los issues de TanStack/ai

Issues similares

Más issues de TypeScript

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.