トークンストリームからエージェントストリームへ
LangChain Blog は、従来のトークンストリーミングを超え、Deep Agents や LangGraph を活用した次世代のストリーミング原語法により、型安全なイベント処理やマルチモーダル出力を可能にする技術的進展を発表しました。
キーポイント
ストリーミングパラダイムの転換
単純なトークンの連続的な配信から脱却し、構造化された「エージェントストリーム」への移行を提唱しています。
型安全なイベント処理の実現
Typed events(型付きイベント)とスコープ限定のサブスクリプション機能により、複雑なフロントエンド体験を堅牢に構築可能になります。
マルチモーダルと可視性の向上
サブエージェントの可視性を確保し、テキストだけでなく画像や音声などのマルチモーダル出力もシームレスに扱えるようになります。
影響分析・編集コメントを表示
影響分析
この技術的進展は、LLM エージェントが実験段階から実社会での本番利用へと移行する上で不可欠な基盤技術を提供します。特に複雑なマルチステップ処理や非同期タスクを伴うアプリケーションにおいて、ユーザー体験の向上と開発者のデバッグ負荷軽減に大きく寄与し、エージェントエコシステムの成熟を加速させるでしょう。
編集コメント
単なるテキストの流し込みから、構造化されたデータフローへ移行するこのアプローチは、複雑なエージェントシステムの開発において極めて重要なマイルストーンです。

重要なポイント
- ストリーミングはトークンを超えて進化する必要がある:現代のエージェント(Agent)はメッセージ、ツール呼び出し、サブエージェントの活動、状態変更、承認要求、メディアなどを生成するため、平坦なテキスト出力ではなく構造化されたイベントストリームが必要となります。
- タイプ付きイベントとプロジェクションがフロントエンド開発を簡素化:アプリケーションは直接メッセージ、ツール呼び出し、状態、サブエージェント、またはカスタムチャンネルに購読し、ランタイム(実行環境)がアセンブリ、順序付け、再接続を担当します。
- スコープ限定の購読により複雑なエージェント UI がスケーラブルに:フロントエンドはレンダリングするエージェントツリーの一部分のみをストリーミングするため、効率的なサブエージェントインスペクター、ダッシュボード、および長時間実行される本番ワークロードが可能になります。
- 1 つのストリーミングモデルがランタイムとモダリティ全体で機能:同じアーキテクチャがローカルおよびリモート実行、React/Vue/Svelte/Angular SDK を支え、テキスト、ツール、画像、音声、動画、カスタムアプリケーションイベントをサポートします。
現在人々が構築しているエージェントは多くのことを行います。1 つの Deep Agents の実行では、計画立案、サブエージェントへの委任、ツールの呼び出し、人間の承認待ち、そしてその過程でテキスト、構造化データ、またはメディアの生成が行われます。これらのステップすべてが、ユーザーは発生するままに見たいと考えるものです。
1 つのモデル呼び出しと 1 つのトークンストリームを想定して設計されたストリーミング API では、そのような要件は満たせません。エージェントがグラフ全体に展開されると、フロントエンドでは単なるトークンの差分だけでは不十分です。各イベントを生成したステップがどこか、画面に表示されているサブエージェントにのみどのように購読するか、ブラウザのリフレッシュ後に再接続する際にどうすれば全データを再生成せずに済むかなどを知る必要があります。
最新の Deep Agents、LangChain、および LangGraph のストリーミング機能は、生断片ではなくアプリケーションイベントを中心に設計されています。各イベントには型が定義され、エージェントツリーのどこから発生したかがタグ付けされます。アプリケーションはメッセージ、ツール呼び出し、サブエージェントの状態などの投影を反復処理します。同じモデルは、ローカル実行からリモートスレッド、そして React、Vue、Svelte、Angular の SDK まで一貫して引き継がれます。今回のリリースに併せて、実行可能な Python および TypeScript の例を含む ストリーミングクックブック も公開しています。
The Requirements
3 つのサブエージェントに委任し、それぞれがツールを呼び出し、状態を更新し、中間結果をストリーミングする研究用エージェントを想定してください。有用な製品 UI では、メインの回答をトークン単位でレンダリングし、各サブエージェントの状態を表示し、組み立てられる過程でのツール呼び出しを示し、エージェントが生成したメディアも表示したいと考えるかもしれません。
これらすべてを 1 つのストリームに平坦化すると、アプリケーション開発者に過度な負担がかかります。ストリーミング層がこの複雑さを吸収すれば、問うべき質問は「トークンを表示できるか」から以下のようなものへと移ります:
- エージェントの作業をライブツリーとしてレンダリングできますか?
- 他のすべてのサブエージェントの出力をダウンロードすることなく、特定の 1 つのサブエージェントにのみ購読できますか?
- 連結されたチャンクではなく、明示的な構造を持って推論、ツール呼び出し、状態、メディアをストリームできますか?
- 人間の承認リクエストをファーストクラスのイベントとして表面化できますか?
- 実行中のスレッドに再接続し、中断した場所から再開できますか?
- ランタイムをフォークすることなく、独自のカスタムドメイン固有ストリームを追加できますか?
- 同じ概念をローカル環境、リモート環境、およびフロントエンドフレームワークで共通して使用できますか?

型付きストリーム(Typed streams)は、エージェントの実行を構造化されたアプリケーションイベントに変換します。これにより、テキスト、ツール、メディア、推論、コード、サブエージェントがそれぞれ独立してストリームできるようになります。チャット完了や単一モデル呼び出しのためのストリーミングは既に解決済みの課題です。次に目指すべき層は、バックエンドとフロントエンドを跨いで実行される、グラフ状の構造を持ち、ツールを使用し、状態を保持し、中断可能で、マルチモーダルなエージェント向けのストリーミングです。
解決策
新しいストリーミングプリミティブ(streaming primitives)は、以下の 4 つのアイデアを中心に構築されています:
- 生チャンクではなく、型付きイベント。各イベントには、それが記述する作業の種類(メッセージ、ツール呼び出し、状態変更、サブエージェントの状態など)と、エージェントツリー内のどこから来たかがラベル付けされて到着します。
- パースではなく投影。アプリケーションはレンダリングしたいビュー(メッセージ、ツール呼び出し、サブエージェントの状態、カスタムチャンネルなど)を反復処理します。ランタイムがアセンブリ、再順序付け、再接続を担当します。
- スコープ付き購読。クライアントは、自分がレンダリングしているチャンネルとエージェントツリーの一部のみを要求するため、サブエージェントインスペクターがすべてのサブエージェントのトークンを取得することはありません。
- 同一モデルによるランタイム間での利用。ローカルグラフ実行、リモートスレッド、React/Vue/Svelte/Angular コンポーネントはすべて同じプロトコルを話し、底部には投影があり、上部にはフックがあります。
型付きイベントプロトコル
新しい ストリーミング基盤 は、共通のイベントエンベロープから始まります。非構造化なストリームタプルではなく、記述する作業の種類とエージェントツリー内の発生源がラベル付けされた構造化イベントが得られます。
チャンネルは、ストリーミングされる関心事を記述します:
- トランスクリプトおよびコンテンツブロックの差分用のメッセージ
- グラフ状態の値と更新情報
- ツール実行ライフサイクル用のツール
- ラン、サブグラフ、サブエージェントのライフサイクル
- 分岐やタイムトラベル用のチェックポイント
- アプリケーション定義のプロジェクション用 custom:*
名前空間は、イベントがエージェントツリーのどこで発生したかを記述します。ルートグラフ、ネストされたサブグラフ、および Deep Agents のサブエージェントはすべて、同じチャンネルタイプをエミットしてもそのアイデンティティを失うことはありません。
この分離こそが重要な設計選択です:チャンネルは再利用可能な関心事であり、一方名前空間はそれらを生成するランの実行中のどの部分を特定します。
プロジェクション:実際に API 開発者が望むもの
ほとんどのアプリケーションコードは、生のプロトコルイベントを反復処理すべきではありません。レンダリングしたいものを要求すべきです。
Runs はまさにその役割を果たし、イベントストリーム上に型付きのプロジェクションを公開します:
run = await graph.astream_events(
{"messages": [{"role": "user", "content": "Research LangChain streaming"}]},
version="v3",
)
async for message in run.messages:
async for delta in message.text:
sys.stdout.write(delta)
final_state = await run.output()
各メッセージは、アプリケーションが結合して再構築する必要がある文字列のストリームではなく、テキスト、推論、ツール呼び出し引数、使用量データなどの型付きコンテンツブロックとして到着します。
これは現代のモデル出力において重要です。推論プロセスは最終回答テキストとは異なる形式でレンダリングされるべきです。ツール呼び出し引数は構造化データとして組み立てられる必要があります。使用状況や出力メタデータはストリーミング経路を通過しても保持されなければなりません。マルチモーダルデータはテキストのみのインターフェースに無理やり通すべきではありません。
サブエージェントとサブグラフ
同じ投影パターンはメッセージ以外にも適用されます。LangGraph は、開発者がノードのグラフとしてエージェントを構造化できるランタイム層であり、ネストされたサブグラフを含みます。Deep Agents はその上に位置し、エージェントが作業をサブエージェントに委譲するより高レベルな委譲モデルを追加します。ストリーミングでは、これらを単一の平坦なトランスクリプトに圧縮することなく、両方を可視化する必要があります。
新しいプリミティブは、サブグラフとサブエージェントを区別します:
- サブグラフは、ネストされたグラフ実行が発生する際に表面化します。
- サブエージェントは、Deep Agents のタスク呼び出しを通じてエージェントが委譲を行う場合に今日表面化します。
async for subagent in run.subagents:
print(f"{subagent.name}: {subagent.status}")
async for message in subagent.messages:
async for delta in message.text:
sys.stdout.write(delta)
これらはどちらも、ID、位置、ステータスを読み取ることができる軽量なハンドルとして到着します。詳細なメッセージ、ツール呼び出し、状態変更は、UI 内の何かがそれらを要求した場合のみストリーミングされます。
これにより、エージェントの複雑さに応じてスケールする UI を実現できます。Deep Agents を基盤としたダッシュボードでは、実行中のサブエージェントの一覧を無料で表示し、選択されたもののみに対してメッセージやツールのストリームを開くことが可能です。研究製品においても、各ワーカーが生成したすべてのトークンに対するワイヤーコストを支払うことなく、作業のツリー全体にわたる高レベルの進捗状況を表示できます。
開発者にとって、これは実用的な転換点です:ストリーミングは、各アプリが解析しなければならない低レベルの輸送詳細ではなく、アプリケーション API となりました。
カスタムチャンネル
有用なストリームがすべて組み込みチャンネルであるわけではありません。アプリケーションには、ドメイン固有のプロジェクション(投影)が必要になることがよくあります:引用、進捗イベント、構造化された計画、UI 記述、メディアハンドル、ワークフローメトリクス、またはプロダクトが生でレンダリングしたいその他のあらゆる要素です。
ストリーミングトランスフォーマーは、プロトコルイベントをフィルタリングして派生項目を名前付きチャンネルにプッシュする小さなクラスです。ここでは ToolActivityTransformer がメッセージチャンネルを監視し、ツール呼び出しの開始を検知して、その結果を toolActivity 拡張として公開します。完全なパターンについては Build your own projection を参照してください。
run = await graph.astream_events(
input,
version="v3",
transformers=[ToolActivityTransformer],
)
async for activity in run.extensions["toolActivity"]:
print(activity)
フロントエンドにおいても、同じ考え方が拡張子セレクターとして現れます:
const stream = useStream({
assistantId: "agent",
apiUrl: "<http://localhost:2024>",
});
const uiEvent = useExtension(stream, "a2ui");
cookbook には、エージェントが custom:a2ui チャンネルを通じて宣言的な A2UI メッセージを出力するジェネレーティブ UI の例が含まれています。React アプリはこの拡張機能を購読し、エージェントが生成するたびにライブのインターフェース表面をレンダリングします。これは、単なるアシスタントのテキストではなく、製品固有の状態をストリーミングするエージェントというパターンが一般的になると予想されるものです。
1 つのイベントログ、複数のビュー
エージェント UI では、同じ実行に対して複数のライブビューが必要になることがよくあります。チャットパネルは主要な回答をレンダリングし、サイドパネルはサブエージェントのアクティビティをレンダリングします。デバッガは生イベントをレンダリングし、プログレスバーは状態を監視し、分析レイヤーはツールの使用状況を記録します。
これらのビューが同じストリームを奪い合うべきではありません。
新しいランタイムモデルでは、同じ基盤となるイベントログに対して複数の投影(プロジェクション)をサポートしています。メッセージ、値、ツール呼び出し、サブグラフ、カスタム拡張機能を独立して消費できます。プログレスビューを追加してもチャットストリームを書き換える必要はありませんし、サブエージェントインスペクタを追加しても、すべてのサブエージェントトークンをすべてのコンポーネントに送信する必要はありません。
リモートストリーミングも同じ考え方を採用しています。クライアントは必要なチャンネルと名前空間だけを正確に購読できます:
const thread = client.threads.stream({
assistantId: "research-agent",
});
await thread.subscribe({
channels: ["messages", "tools", "values", "lifecycle"],
namespaces: [["researcher"]],
depth: 2,
});
イベントには順序付けメタデータが含まれているため、クライアントは再接続して最後に確認したポイントから再生することができます。エージェントが実行中にブラウザがリフレッシュされた場合、UI はスレッドに再接続し、バッファリングされたイベントをキャッチアップして、実行の再起動やコンテンツの重複なしにライブ更新を続けることができます。
これは特に本番環境のエージェントアプリケーションにおいて重要です。長時間実行されるエージェントはもはや例外ケースではなく、開発者が構築しようとしているワークロードそのものです。
多モーダルストリーム
このプロトコルはプレーンな文字列ではなくコンテンツブロックを中心に設計されており、これにより多モーダルストリーミングが同じモデルの自然な拡張となっています。

各ページは必要なメディアのみを購読し、テキスト、画像、オーディオが利用可能になった時点でレンダリングされます。cookbook の多モーダルストーリーブックデモ では、グラフが就寝前の物語、ページ用の画像、音声ナレーション、およびビデオを生成します。UI はメディアセレクタを各ページの責任を負うグラフノードにスコープ限定しているため、各ページはアセットが到着した時点で即座にレンダリングできます。
const visualizer = useNodeRun(visualizer_${index});
const images = useImages(stream, visualizer?.namespace);
const imageURL = useMediaURL(images[0]);
重要なのはデモそのものではなく、テキスト、推論、ツール活動、画像、オーディオ、ビデオ、カスタムデータがすべて同じストリーミングアーキテクチャ(型付きブロック、名前付きチャンネル、ネームスペース、プロジェクション)に収まるという点です。
実用的なアプリケーション向けのフレームワーク SDK
今回のリリースでは、ストリーミングエージェントアプリケーションを構築するための v1 フレームワークパッケージも提供されます:
- @langchain/react
- @langchain/vue
- @langchain/svelte
- @langchain/angular
各パッケージは、それぞれのフレームワークの慣習(イディオム)において同じストリーミング概念を公開します。React ではフックを使用し、Vue ではコンポザブル、Svelte ではリアクティブヘルパー、Angular ではインジェクターとシグナルを使用します。
共有される核心的なメンタルモデルは以下の通りです:
- 1 つのルートフック: useStream または Angular の injectStream
- トップレベルのプロジェクション: メッセージ、値、ツール呼び出し、割り込みは、セットアップなしで利用可能です。
- コンポーネントレベルのセレクター: useMessages, useToolCalls, useExtension など。これらは何かマウントされた場合にのみスコープ付きサブスクリプションとして使用されます。
- サブエージェントとサブグラフは即座に表示されます:詳細なストリームは、それらにアクセスした際にのみ開かれます。
- 同じスレッドでの再マウントでは、実行中のランに対して再接続され、再生や重複はありません。
React では、基本的なストリーミングチャットを小さく保つことができます:
const stream = useStream({
assistantId: "agent",
apiUrl: "<http://localhost:2024>",
threadId,
});
const messages = useMessages(stream);
サブエージェントを意識したコンポーネントは、自身がレンダリングするデータのみを購読できます:
function SubagentCard({ stream, subagent }) {
const messages = useMessages(stream, subagent);
const toolCalls = useToolCalls(stream, subagent);
return <AgentTrace messages={messages} toolCalls={toolCalls} />;
}
これが、コールバック中心のストリーミングとレンダリング駆動型のストリーミングの違いです。コンポーネントは必要な投影(プロジェクション)をマウントし、SDK が購読のライフサイクル、再接続、およびアセンブリを担当します。
次に何が起こるか
今回のリリースで確立された基盤とは、型付きイベント、コンテンツブロック、投影、スコープ限定の購読、再接続セマンティクス、フレームワーク SDK、カスタムチャンネルのことです。
すでにプロトコルのさらなる拡張を進めています。近未来的な方向性の一つは、より豊富なファイルストリーミングの実装です。これは、サンドボックスや他の管理された実行環境などのバックエンドに接続し、エージェントが任意のファイルをストリームできるモジュールを指します。エージェントが生成・修正するアーティファクトが増えるにつれ、それらのアーティファクトもメッセージ、ツール、状態、メディアと同じストリーミングモデルを通じて流れるべきです。
目標はシンプルです。アプリケーションは、画面上のエージェントの作業のみを購読し、適切な抽象化でレンダリングし、実行時間が長くなり出力が豊かになっても接続を維持することです。
エージェントによるストリーミングは、ログを解析するものではなく、アプリケーションを構築しているような感覚であるべきです。
関連コンテンツ

Deep Agents
Agent Architecture
Open Source
エージェントにインタプリタを与えよう

ハンター・ロベル
2026 年 5 月 20 日
11 分

ディープエージェント
LangGraph
デルタチャンネル:長期実行型エージェント向けランタイムの進化

シドニー・ランクル
2026 年 5 月 12 日
7 分

ディープエージェント
エージェントアーキテクチャ
オープンソース
異なるモデルと良好に動作するようにディープエージェントを調整する


V. トリヴェディ、
M. ダーガーティ
2026 年 4 月 29 日
5 分
あなたのエージェントが実際に何をしているかを確認する
LangSmith は、私たちが提供するエージェントエンジニアリングプラットフォームであり、開発者がすべてのエージェントの意思決定をデバッグし、変更の評価を行い、ワンクリックでデプロイできるように支援します。
原文を表示

Key Takeaways
- Streaming needs to evolve beyond tokensModern agents generate messages, tool calls, subagent activity, state changes, approvals, and media, requiring structured event streams instead of flat text output.
- Typed events and projections simplify frontend developmentApplications subscribe directly to messages, tool calls, state, subagents, or custom channels while the runtime handles assembly, ordering, and reconnection.
- Scoped subscriptions make complex agent UIs scalableFrontends only stream the parts of the agent tree they render, enabling efficient subagent inspectors, dashboards, and long-running production workloads.
- One streaming model works across runtimes and modalitiesThe same architecture powers local and remote runs, React/Vue/Svelte/Angular SDKs, and supports text, tools, images, audio, video, and custom application events.
The agents people are building now do a lot. A single Deep Agents run can plan, delegate to subagents, call tools, pause for human approval, and produce text, structured data, or media along the way. Every one of those steps is something a user might want to see as it happens.
Streaming APIs designed for one model call and one stream of tokens can't carry that. Once an agent fans out across a graph, the frontend needs more than token deltas. It needs to know which step produced each event, how to subscribe to just the subagent on screen, and how to reconnect after a browser refresh without replaying everything.
The latest Deep Agents, LangChain, and LangGraph streaming work is designed around application events instead of raw chunks. Each event is typed and tagged by where in the agent tree it came from; applications iterate projections like messages, tool calls, or subagent statuses; the same model carries from local runs to remote threads to React, Vue, Svelte, and Angular SDKs. Alongside the release, we're publishing a streaming cookbook with runnable Python and TypeScript examples.
The Requirements
Consider a research agent that delegates to three subagents, each calling tools, updating state, and streaming intermediate findings. A useful product UI might want to render the main answer token-by-token, each subagent's status, tool calls as they assemble, and any media the agent generates.
Flattening all of that into one stream pushes too much work onto application developers. If the streaming layer absorbs that complexity, the questions worth asking move past "can I show tokens?" to:
- Can I render a live tree of agent work?
- Can I subscribe to one subagent without downloading every other subagent's output?
- Can I stream reasoning, tool calls, state, and media with explicit structure rather than concatenated chunks?
- Can I surface human approval requests as first-class events?
- Can I reconnect to a running thread and pick up where it left off?
- Can I add custom domain-specific streams without forking the runtime?
- Can I use the same concepts locally, remotely, and in a frontend framework?

Streaming for chat completions and single model calls is a solved problem. The next layer is streaming for graph-shaped, tool-using, stateful, interruptible, multimodal agents that run across backends and frontends.
The Solution
The new streaming primitives are built around four ideas:
- Typed events instead of raw chunks.Each event arrives labelled with what kind of work it describes (a message, a tool call, a state change, a subagent status) and where in the agent tree it came from.
- Projections instead of parsing.Applications iterate the views they want to render: messages, tool calls, subagent statuses, custom channels. The runtime handles assembly, reordering, and reconnection.
- Scoped subscriptions.Clients ask only for the channels and parts of the agent tree they're rendering, so a subagent inspector doesn't pull every subagent's tokens.
- The same model across runtimes.Local graph runs, remote threads, and React/Vue/Svelte/Angular components all speak the same protocol, with projections at the bottom and hooks at the top.
A Typed Event Protocol
The new streaming foundation starts with a common event envelope. Instead of opaque stream tuples, you get structured events labelled with what kind of work they describe and where in the agent tree they came from.
Channels describe the concern being streamed:
- messages for transcript and content-block deltas
- values and updates for graph state
- tools for tool execution lifecycle
- lifecycle for runs, subgraphs, and subagents
- checkpoints for branching and time travel
- custom:* for application-defined projections
Namespaces describe where the event happened in the agent tree. The root graph, a nested subgraph, and a Deep Agents subagent can all emit the same channel type without losing their identity.
That separation is the key design choice: channels are reusable concerns, while namespaces identify the part of the run producing them.
Projections: The API Developers Actually Want
Most application code should not iterate over raw protocol events. It should ask for the thing it wants to render.
Runs do exactly that, exposing typed projections on top of the event stream:
run = await graph.astream_events(
{"messages": [{"role": "user", "content": "Research LangChain streaming"}]},
version="v3",
)
async for message in run.messages:
async for delta in message.text:
sys.stdout.write(delta)
final_state = await run.output()
Each message arrives as typed content blocks such as text, reasoning, tool-call arguments, and usage data, instead of a stream of strings that applications need to stitch back together.
That matters for modern model output. Reasoning should be rendered differently from final answer text. Tool-call arguments need to be assembled as structured data. Usage and output metadata should survive the streaming path. Multimodal data should not be forced through a text-only interface.
Subagents and Subgraphs
The same projection pattern applies beyond messages. LangGraph is the runtime layer that lets developers structure agents as graphs of nodes, including nested subgraphs. Deep Agents sits on top of it and adds a higher-level delegation model where an agent can hand work off to a subagent. Streaming needs to make both visible without collapsing them into one flat transcript.
The new primitives distinguish subgraphs from subagents:
- Subgraphs surface for any nested graph execution.
- Subagents surface today when an agent delegates via the Deep Agents task call.
async for subagent in run.subagents:
print(f"{subagent.name}: {subagent.status}")
async for message in subagent.messages:
async for delta in message.text:
sys.stdout.write(delta)
Both arrive as lightweight handles you can read identity, position, and status off of. The detailed messages, tool calls, and state changes only stream when something in your UI asks for them.
This enables UIs that scale with agent complexity. A dashboard built on Deep Agents can show a list of running subagents for free, then open message and tool streams only for the selected one. A research product can show high-level progress across a tree of work without paying the wire cost for every token produced by every worker.
For developers, this is the practical shift: streaming is no longer a low-level transport detail that each app has to parse. It is an application API.
Custom Channels
Not every useful stream is a built-in channel. Applications often need domain-specific projections: citations, progress events, structured plans, UI descriptions, media handles, workflow metrics, or anything else the product wants to render live.
Streaming transformers are small classes that filter protocol events and push derived items into a named channel. The ToolActivityTransformer here watches the messages channel for tool-call starts and exposes the result as a toolActivity extension. See Build your own projection for the full pattern.
run = await graph.astream_events(
input,
version="v3",
transformers=[ToolActivityTransformer],
)
async for activity in run.extensions["toolActivity"]:
print(activity)
On the frontend, the same idea appears as extension selectors:
const stream = useStream({
assistantId: "agent",
apiUrl: "",
});
const uiEvent = useExtension(stream, "a2ui");
The cookbook includes a generative UI example where an agent emits declarative A2UI messages over a custom:a2ui channel. The React app subscribes to that extension and renders live interface surfaces as the agent produces them. This is the pattern we expect to become common: agents streaming product-specific state, not just assistant text.
One Event Log, Many Views
Agent UIs often need multiple live views of the same run. A chat panel renders the main answer. A side panel renders subagent activity. A debugger renders raw events. A progress bar watches state. An analytics layer records tool usage.
Those views should not compete to drain the same stream.
The new runtime model supports multiple projections over the same underlying event log. You can consume messages, values, tool calls, subgraphs, and custom extensions independently. Adding a progress view does not require rewriting the chat stream. Adding a subagent inspector does not mean shipping every subagent token to every component.
Remote streaming uses the same idea. A client can subscribe to exactly the channels and namespaces it needs:
const thread = client.threads.stream({
assistantId: "research-agent",
});
await thread.subscribe({
channels: ["messages", "tools", "values", "lifecycle"],
namespaces: [["researcher"]],
depth: 2,
});
Events carry ordering metadata so clients can reconnect and replay from the last seen point. If a browser refreshes while an agent is still running, the UI can reattach to the thread, catch up on buffered events, and continue with live updates instead of restarting the run or duplicating content.
This is especially important for production agent applications. Long-running agents are not edge cases anymore; they are the workloads developers are building toward.
Multimodal Streams
The protocol is designed around content blocks rather than plain strings, which makes multimodal streaming a natural extension of the same model.

In the cookbook's multimodal storybook demo, a graph generates a bedtime story, page images, audio narration, and video. The UI scopes media selectors to the graph nodes responsible for each page, so each page can render as soon as its assets arrive.
const visualizer = useNodeRun(visualizer_${index});
const images = useImages(stream, visualizer?.namespace);
const imageURL = useMediaURL(images[0]);
The important part is not the demo itself. It is that text, reasoning, tool activity, images, audio, video, and custom data all fit into the same streaming architecture: typed blocks, named channels, namespaces, and projections.
Framework SDKs for Real Applications
The release also brings v1 framework packages for building streamed agent applications:
- @langchain/react
- @langchain/vue
- @langchain/svelte
- @langchain/angular
Each package exposes the same streaming concepts in the idioms of the framework. React uses hooks, Vue uses composables, Svelte uses reactive helpers, and Angular uses injectors and signals.
The core mental model is shared:
- One root hook: useStream or injectStream in Angular
- Top-level projections: messages, values, tool calls, interrupts, are available without setup.
- Component-level selectors: useMessages, useToolCalls, useExtension, and friends for scoped subscriptions only when something mounts.
- Subagents and subgraphs show up immediately: their detailed streams open only when you reach for them.
- Remounting on the same thread reattaches to the in-flight run without replay or duplication.
In React, a basic streamed chat can stay small:
const stream = useStream({
assistantId: "agent",
apiUrl: "",
threadId,
});
const messages = useMessages(stream);
And a subagent-aware component can subscribe only to the data it renders:
function SubagentCard({ stream, subagent }) {
const messages = useMessages(stream, subagent);
const toolCalls = useToolCalls(stream, subagent);
return ;
}
That is the difference between callback-heavy streaming and render-driven streaming. Components mount the projections they need; the SDK handles subscription lifetimes, reconnection, and assembly.
What Comes Next
This release establishes the foundation: typed events, content blocks, projections, scoped subscriptions, reconnect semantics, framework SDKs, and custom channels.
We are already extending the protocol further. One near-term direction is richer file streaming: modules that let agents stream arbitrary files connected to a backend, such as a sandbox or other managed execution environment. As agents generate and modify more artifacts, those artifacts should flow through the same streaming model as messages, tools, state, and media.
The goal is simple: your application should subscribe only to the agent work on the screen, render it with the right abstraction, and stay connected as runs grow longer and outputs get richer.
Streaming agents should feel like building applications, not parsing logs.
Related content

Deep Agents
Agent Architecture
Open Source
Give Your Agents an Interpreter

Hunter Lovell
May 20, 2026
11
min

Deep Agents
LangGraph
Delta Channels: Evolving our Runtime for Long-Running Agents

Sydney Runkle
May 12, 2026
7
min

Deep Agents
Agent Architecture
Open Source
Tuning Deep Agents to Work Well with Different Models


V. Trivedy,
M. Daugherty
April 29, 2026
5
min
See what your agent is really doing
LangSmith, our agent engineering platform, helps developers debug every agent decision, eval changes, and deploy in one click.
関連記事
今日のまとめ
AI日報で今日の重要ニュースをまとめ読み