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

オープン
#2,068 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

@c446984928 がすでに取り組んでいます。

2026年11月6日 から。

  • #2069 @c446984928 による — オープン

評価

難易度
2/5
見積もり時間
1〜3時間
初心者へのやさしさ
35/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
停滞
技術スタック
typescript
領域
api, backend

調査の方向性

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.

索引モデルが issue の本文から書いたものです。

説明

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!

主要言語
TypeScript
スター
3.3k
フォーク
378
平均マージ
1日 2時間
マージ済み PR(30日)
254

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

TanStack/ai のほかの issue

TanStack/ai の issue をすべて見る

似ている issue

TypeScript の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。