メインコンテンツまでスキップ

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 のあと: "目前台北"(積み上げが続きます)

注目する点​

  1. messageId が同じ: どの delta イベントも同じメッセージに属します
  2. idx が増える: 正しい順序で処理するための手がかりです
  3. text は追加分: 毎回、新しく加わった断片(文字、語句、文のいずれか)が入ります

注意点​

  • 順序が大切: 必ず idx の順に処理してください
  • テキストを積み上げる: すべての delta の text をつなぎ、タイプライター風に見せます
  • 性能への配慮: UI の更新が頻繁になるため、最適化に注意してください