概要
このリリースでは、BrowserLiveView コンポーネントで同一ページに複数インスタンスを表示できるようになり、OAuth2 で on-behalf-of トークン交換がサポートされました。また、SSE ストリーミングレスポンス時のエラーハンドリングとヘルスチェックエンドポイントのタイムスタンプ形式に関するバグが修正されています。
リリース: v0.2.3
新機能
BrowserLiveView の複数インスタンスサポート (#97)
この機能でできること:
- 同一ページ上で複数の
BrowserLiveViewコンポーネントを同時に表示できるようになりました。各インスタンスには一意のdivIdが自動的に割り当てられます。
使用例:
import { BrowserLiveView } from 'bedrock-agentcore';
// 複数の BrowserLiveView を同時に表示
function MultiViewerPage() {
return (
<div>
{/* 各インスタンスには自動的に一意の divId が割り当てられる */}
{/* (dcv-display-1, dcv-display-2, etc.) */}
<BrowserLiveView
connectionUrl="wss://stream1.example.com"
httpExtraSearchParams={{ token: 'session1-token' }}
/>
<BrowserLiveView
connectionUrl="wss://stream2.example.com"
httpExtraSearchParams={{ token: 'session2-token' }}
/>
</div>
);
}
ポイント:
- DCV Web Client SDK の DOM 要素 ID がハードコードされていた問題を修正し、各インスタンスが独立して動作するようになりました
- 接続順序に関係なく、両方のセッションが正しくレンダリングされます
on-behalf-of トークン交換と追加パラメータのサポート (#149)
この機能でできること:
ON_BEHALF_OF_TOKEN_EXCHANGE認証フローを使用してトークン交換が可能になりました。また、resourcesとaudiencesパラメータを指定できるようになりました。
使用例:
import { IdentityClient } from 'bedrock-agentcore';
const identityClient = new IdentityClient({
// クライアント設定
});
// on-behalf-of トークン交換
const tokenResponse = await identityClient.getOAuth2Token({
authFlow: 'ON_BEHALF_OF_TOKEN_EXCHANGE',
// オプション: リソースとオーディエンスを指定
resources: ['urn:example:resource:api'],
audiences: ['https://api.example.com']
});
// withAccessToken ラッパーでも使用可能
const wrappedClient = identityClient.withAccessToken({
authFlow: 'ON_BEHALF_OF_TOKEN_EXCHANGE',
resources: ['urn:example:resource:api'],
audiences: ['https://api.example.com']
});
ポイント:
ON_BEHALF_OF_TOKEN_EXCHANGEは即座にトークンを返します(USER_FEDERATION フローのようなポーリングは不要)resourcesとaudiencesは USER_FEDERATION フローのポーリングリクエストにも転送されます
バグ修正
SSE ストリーミングレスポンス時の FST_ERR_REP_INVALID_PAYLOAD_TYPE エラーを修正 (#118)
- 問題: async generator でストリーミングハンドラーから
dataフィールドを持たないオブジェクトを yield すると、@fastify/sseがエラーをスローし、最終的にFST_ERR_REP_INVALID_PAYLOAD_TYPEエラーが発生していました - 原因: SSE ストリーミングでは既に HTTP ヘッダーが送信済みのため、エラーハンドラーで
reply.send()を呼び出すと Fastify がペイロードを拒否していました - 修正後:
dataフィールドを持たないオブジェクトは自動的に{ data: chunk }としてラップされるようになりました
// 修正前: このコードはクラッシュしていた
app.streamHandler(async function* (input, context) {
yield { type: 'meta', sessionId: ctx.sessionId }; // data フィールドなし → クラッシュ
yield { type: 'chunk', content: 'hello world' };
yield { type: 'done' };
});
// 修正後: オブジェクトは自動的にラップされる
// SSE 出力:
// data: {"type":"meta","sessionId":"test"}
// data: {"type":"chunk","content":"hello world"}
// data: {"type":"done"}
time_of_last_update を Unix タイムスタンプ(秒)で返すよう修正 (#129)
- 問題:
/pingエンドポイントがtime_of_last_updateを ISO 8601 文字列(例:"2026-04-09T06:26:53.699Z")で返していましたが、AgentCore ランタイムは Unix タイムスタンプ(秒)を期待していました - 影響: ランタイムが
HealthyBusyステータスを認識できず、バックグラウンドタスクが実行中でもidleRuntimeSessionTimeout後にコンテナが停止されていました - 修正後:
time_of_last_updateは Unix タイムスタンプ(秒)として返されるようになりました
// 修正前
{
"status": "HealthyBusy",
"time_of_last_update": "2026-04-09T06:26:53.699Z" // string
}
// 修正後
{
"status": "HealthyBusy",
"time_of_last_update": 1744177613 // number (Unix timestamp in seconds)
}
まとめ
v0.2.3 では BrowserLiveView の複数インスタンス対応と on-behalf-of トークン交換機能が追加され、SSE ストリーミングとヘルスチェックに関する重要なバグが修正されました。