asgard.message.delta
asgard.message.delta のイベントは、メッセージの内容をストリーミングで送るためのものです。各イベントには短いテキストが入っており、idx フィールドで正しい順序を保ちます。
イベントの性質
- 発火のタイミング: AI が内容を生成しながら、テキストの断片を小分けに送るとき
- 役割: リアルタイムのタイプライター風の表示を実現し、体験を良くする
- 頻度: ひとつのメッセージに複数の delta イベントが出ることがあります
重要なフィールド
| フィールド | 説明 |
|---|---|
| messageDelta.message.text | 追加分のテキスト。新しく加わった断片(文字、語句、文のいずれか) |
| messageDelta.message.idx | 順序のインデックス。0 から始まって増えます |
| messageDelta.message.template | 通常は null で、complete のイベントで値が入ります |
完全な例
次の例は、ひとつのメッセージが完成するまでのタイプライター風の流れです。AI が返す一文は複数の delta イベントに分かれて送られます(文字、語句、文のいずれかの単位)。
Delta 1 (idx: 0) - 1 つ目の断片
{
"eventType": "asgard.message.delta",
"requestId": "6939c5a6c590d90c401e3850a1ff44f3",
"namespace": "qa-7e301310-a594-4a7b-aa2a-xxxxxxxxxxxx",
"botProviderName": "bpapi-d97c512f-f8dc-46f6-82f0-xxxxxxxxxxxx",
"customChannelId": "ch-6xxxxxxxxxxxx",
"fact": {
"runInit": null,
"runDone": null,
"runError": null,
"messageStart": null,
"messageDelta": {
"message": {
"messageId": "1834828082242916352",
"replyToCustomMessageId": "",
"text": "目前", // <- 追加分のテキストだけ
"payload": null,
"isDebug": false,
"idx": 0, // <- 1 つ目の断片
"template": null // <- 通常は null
}
},
"messageComplete": null
}
}
Delta 2 (idx: 1) - 2 つ目の断片
{
"eventType": "asgard.message.delta",
"requestId": "6939c5a6c590d90c401e3850a1ff44f3",
"namespace": "qa-7e301310-a594-4a7b-aa2a-xxxxxxxxxxxx",
"botProviderName": "bpapi-d97c512f-f8dc-46f6-82f0-xxxxxxxxxxxx",
"customChannelId": "ch-6xxxxxxxxxxxx",
"fact": {
"runInit": null,
"runDone": null,
"runError": null,
"messageStart": null,
"messageDelta": {
"message": {
"messageId": "1834828082242916352",
"replyToCustomMessageId": "",
"text": "台", // <- 追加分のテキストだけ
"payload": null,
"isDebug": false,
"idx": 1, // <- 2 つ目の断片
"template": null
}
},
"messageComplete": null
}
}
Delta 3 (idx: 2) - 3 つ目の断片
{
"eventType": "asgard.message.delta",
"requestId": "6939c5a6c590d90c401e3850a1ff44f3",
"namespace": "qa-7e301310-a594-4a7b-aa2a-xxxxxxxxxxxx",
"botProviderName": "bpapi-d97c512f-f8dc-46f6-82f0-xxxxxxxxxxxx",
"customChannelId": "ch-6xxxxxxxxxxxx",
"fact": {
"runInit": null,
"runDone": null,
"runError": null,
"messageStart": null,
"messageDelta": {
"message": {
"messageId": "1834828082242916352",
"replyToCustomMessageId": "",
"text": "北", // <- 追加分のテキストだけ
"payload": null,
"isDebug": false,
"idx": 2, // <- 3 つ目の断片
"template": null
}
},
"messageComplete": null
}
}
例の読み方
積み上がり方
delta のイベントが届くにつれて、フロントエンドは次のようにテキストを積み上げます。
- Delta 1 のあと:
"目前"(語句のことがあります) - Delta 2 のあと:
"目前台"(積み上げが続きます) - Delta 3 のあと:
"目前台北"(積み上げが続きます)
注目する点
messageIdが同じ: どの delta イベントも同じメッセージに属しますidxが増える: 正しい順序で処理するための手がかりですtextは追加分: 毎回、新しく加わった断片(文字、語句、文のいずれか)が入ります
注意点
- 順序が大切: 必ず
idxの順に処理してください - テキストを積み上げる: すべての delta の text をつなぎ、タイプライター風に見せます
- 性能への配慮: UI の更新が頻繁になるため、最適化に注意してください