非アクティブ状態のトリガーの構成方法について、構成手順、対応チャネル、制限事項、トラブルシューティングのガイドとともに解説します。
概要
非アクティブ トリガー (OnInactivity またはユーザーの一定時間の非アクティブとも呼ばれる) は、Copilot Studio のシステムトリガーであり、ユーザーが指定された時間メッセージを送信しなかった場合に、自動的にトピックを発生させます。 これはサーバー側で実行されるため、ユーザーのクライアントがアイドル状態であっても、エージェントがタイマーを評価し、トピックを実行します。
一般的なユース ケースは次のとおりです。
- ユーザーに「まだそこにいますか?」を確認するリマインダーの送信
- 非アクティブな会話を自動的に終了させ、エージェントの容量を確保する
- セッションが終了する前に、フィードバック (顧客満足度調査など) を収集する
- 中断された会話のセッション状態をクリーンアップする
非アクティブ トリガーの仕組み
このセクションでは、会話が非アクティブ状態になった際に、Copilot Studio が非アクティブトリガーを評価し、タイマーを設定し、トピックを実行する方法について説明します。
アーキテクチャの概要
ユーザーがメッセージを送信します。
ランタイムでは、すべての OnInactivity トリガーが評価されます。
ランタイムは、トリガーを継続時間ごとにグループ分けし、各継続時間の区分ごとに 1 つずつ選択します。 優先順位が最も低い番号が優先されます。同順位の場合は、作成日が早い方が優先されます。
ランタイムは、選択されたトリガーを継続時間の短い順に並べ替えます。
このランタイムは、Azure Service Bus における次のトリガー用にタイマーを設定します。 同時に有効なタイマーは 1 つだけです。
ユーザーは、構成された期間、非アクティブ状態です。
タイマーが作動し、非アクティブ イベントがランタイムに送信されます。
ランタイムは、非アクティブなトピックを照合して実行します。
ランタイムは、次のトリガーまでの残り時間を計算し、新しいタイマーをセットします。
主要な動作
ユーザーからのメッセージが送信されるたびに、タイマーがリセットされます。
ユーザーがメッセージを送信するたびに、システムはすべての非アクティブトリガーを再評価し、次のトリガー (有効期間が最も短いものから順に) を有効にします。 一度に有効になるタイマーは 1 つだけです。
複数のトリガーに対応しています。
異なる期間 (5 分と 10 分など) で、複数の OnInactivity トリガーを設定することができます。 システムは、それらを継続時間の昇順で処理します。 各持続時間レベルにつき、トリガーは 1 つだけ選択されます。 2 つのトリガーの持続時間が同じ場合、
Priorityの数値が小さい方のトリガーが発動します。 それでも同点の場合は、先に作成されたトリガーが優先されます。 システムは、同じ持続時間の他のトリガーを破棄します。トリガーはキューに入れられ、並列には実行されません。
同時に有効なタイマーは 1 つだけです。 現在のトリガーが実行された後、ランタイムは次のトリガーまでの残り時間を計算し、その差分に応じて新しいタイマーを起動します。 その結果、トリガーは元の非アクティブ状態の時点から正しいオフセットで発動することになりますが、トリガーの実行にかなりの時間がかかる場合は、わずかなずれが生じる可能性があります。
バックグラウンド実行。
非アクティブ イベントはバックグラウンド トリガーです。 発動させるのにユーザーの操作は必要ありません。
トランスクリプト記録。
このシステムは、会話のトランスクリプトに非アクティブのイベントを記録します。 30 分間操作がないと、新しいトランスクリプト記録が作成されます。
タイムラインの例 (複数のトリガー)
| 時間 | イベント |
|---|---|
| 0:00 | ユーザーが最後のメッセージを送信する |
| 5:00 | トリガー A (300 秒) が作動し、警告を送信する |
| 10:00 | トリガー B (600 秒) が作動し、会話が終了する |
ユーザーが 4:30 にメッセージを送信すると、両方のタイマーがリセットされます。 トリガー A は 9:30 に作動し、トリガー B は 14:30 に作動します。
非アクティブのトリガーを構成する
このセクションでは、Copilot Studio が非アクティブ タイマーを起動、リセット、実行する仕組みについて説明します。これにより、会話が非アクティブ状態になった際に何が起こるかを予測できるようになります。
非アクティブ トリガー トピックを作成する
Copilot Studio で、トピック>トピックを追加>空白から にアクセスします。
トリガー フレーズを選択します。 フレーズの代わりに、非アクティブな期間後を選択します。
非アクティブ状態の継続時間プロパティを設定します。 手動入力モードでは、ドロップダウン メニューからプリセット (15 分、30 分、45 分、または 1 時間) を選択します。 秒単位のカスタム値や Power Fx 数式 (
Global.TimeoutSecondsなど) を入力するには、モードセレクターを 数式 に切り替えて、値を直接入力します。トピックの流れを設計する (メッセージを送信する、質問する、会話を終了するなど)。
エージェントを保存して公開します。
期間の参照
| 希望するタイムアウト | 値 (秒) |
|---|---|
| 30 秒 | 30 |
| 2 分 | 120 |
| 5 分 | 300 |
| 10 分 | 600 |
| 1 時間 | 3600 |
重要
このプロパティでは、分やミリ秒ではなく、秒が使用されます。 値 60000 は、60 秒ではなく、およそ 16.7 時間を意味します。
例: 単一の警告トリガー
[OnInactivity - 600 秒]
メッセージ: 「まだいらっしゃいますか? 継続できます。」
トピックを終了
例: 5 分前の警告と 10 分後の自動クローズ
このパターンが最も一般的です。 2 つの「非アクティブ」なトピックを作成します:
トピック 1: 非アクティブの警告 (5 分)
- トリガー: しばらく活動がなかった後
-
durationInSeconds:300 - アクション: メッセージを送信: 「まだいらっしゃいますか? 応答がなければ、この会話は 5 分後に自動的に終了します。」
トピック 2: 自動クローズ (10 分)
- トリガー: しばらく活動がなかった後
-
durationInSeconds:600 - アクション:
-
Global.DeactivateInactivity = trueの設定 (ガード変数 - ベスト プラクティスを参照) - メッセージを送信: 「この会話は無操作のため終了します。」
- 会話の終了
-
例: フィードバックの収集
- トリガー: しばらく活動がなかった後
- durationInSeconds:
120 - アクション:
- 質問: 「クローズする前に、体験を評価していただけますか? (1-5)」
- 応答を保存する
- 会話の終了
トリガーに条件を追加する
特定の状況でのみ実行されるように、トリガーの直後に条件ノードを追加します:
- 特定のチャンネルでのみトリガーされます:
=Activity.ChannelId = "msteams" - ガード変数が設定されていない場合にのみ実行する:
=Global.DeactivateInactivity = false
複数のトリガー (共通のトピック) に推奨されるパターン
Question ノードを含むトリガーが複数ある場合は、ダイアログのスタックアップの問題を回避するために、共有トピックを使用してください:
「
HandleInactivity」という共有トピックを作成する:- グローバル変数
Global.InactivityStage(テキスト型) を追加する - 値を確認する:
-
"warning"→ 質問ノード (「継続」/「終了」) を含む警告メッセージを送信する -
"close"→ 終了のメッセージを送信して会話を終了する
-
- グローバル変数
最初の OnInactivity トリガー (300 秒):
-
Global.InactivityStage = "warning"を設定します -
HandleInactivityにリダイレクトする
-
2回目の OnInactivity トリガー (600 秒):
-
Global.InactivityStage = "close"を設定します -
HandleInactivityにリダイレクトする
-
このアプローチにより、質問ノードが積み重なってプロンプト ループが発生するのを防ぐことができます。
チャネルごとの構成
チャネル対応マトリックス
| チャネル | サポート レベル | メモ |
|---|---|---|
| デモ Web サイト | 完全にサポートされています | 非アクティブのトリガーのテストに最適なチャネル。 |
| カスタム Web サイト (Direct Line) | 完全にサポートされています | デモ Web サイトと同様に動作します。 |
| Microsoft Teams | サポートあり | 動作しますが、次のセクションにある Teams 固有のガイダンスをご確認ください。 長期間操作がない場合、認証トークンの有効期限が切れることがあります。 |
| Dynamics 365 Customer Service | 完全にサポートされています | Dynamics 365 Customer Service の会話終了には、追加の手順が必要です。 詳細については、Dynamics 365 Customer Service の構成を参照してください。 |
| Microsoft 365 Copilot | トリガーは発動しますがメッセージは配信されません | このシナリオは既知の制限事項です。 トリガーはサーバー側で実行されますが、Microsoft 365 Copilot の UI にはエージェントからのプロアクティブなメッセージが表示されません。 回避策はありません。 |
| テスト パネル | サポートしていません | このシナリオは仕様です。 Studio チャンネル ID では、タイマーが無効になっています。 デモ Web サイトまたは公開チャネルでテストしてください。 |
| DirectEngine | サポートしていません | このシナリオは仕様です。 DirectEngine チャンネル ID (設計/テスト環境) では、タイマーが無効になっています。 |
| テレフォニー/IVR | サポートしていません | 音声チャネルの場合は OnSilence トリガーを使用してください。 |
Teams の構成
Teams では、永続的な単一会話モデルが使用されています。 Teams の観点では、会話は決して真の意味で「終わる」ことはありません。 このモデルでは、ユーザーが会話を終了したとみなした後でも、非アクティブ状態になると再発動を継続することになります。
推奨される Teams のパターン:
グローバル変数
Global.IsConversationClosed(ブール値、既定値:false) を作成します。「非アクティブ」トピックの冒頭で、次を確認:
If Global.IsConversationClosed = true→ トピックを終了 (直ちに終了)。会話が論理的に終了したとき (ユーザーが「さようなら」と言った、顧客満足度が完了したなど) 、
Global.IsConversationClosed = trueを設定します。非アクティブのトリガーは発動する可能性はありますが、メッセージを表示することなく直ちに終了します。
Dynamics 365 Customer Service の構成
- 既定では、30 分間操作がないと会話は自動的に閉じられます。
- EndConversation を単独で呼び出しても、Dynamics 365 Customer Service のセッションは終了しません。 エージェントのキャパシティは解放されません。
- 会話を完全に終了させるには、Power Automate フローを使用してコンテキスト変数
CloseOmnichannelConversationをtrueに設定し、その後、エージェントに転送 ノードを使用してください。
既知の制限
クイック リファレンス: 非アクティブ タイマーを中断させる要因
| 機能とアクション | 非アクティブタイマーへの影響 |
|---|---|
| 会話の終了 | すべてのタイマーを完全に消去します |
| ユーザーがメッセージを送信する | すべてのタイマーをゼロにリセットします (仕様) |
| 初期化されていない変数を含むトリガー条件 | タイマーは自動的に除外されます - 作動しません |
| 期間が 7 日 (604,800 秒) を超える場合 | タイマーは通知なしに無視されます |
| 非アクティブ トピックでのグローバル変数の消去 | エージェントが会話のコンテキストを失う |
| 顧客サービス担当者につないでください | タイマーは有効なままとなり、顧客サービス担当者との会話中に作動する可能性があります |
テスト パネルは、非アクティブ時のトリガーに対応していません
Copilot Studio のテスト パネルでは、非アクティブ時のトリガーが発動しません。 この制限は仕様です。 エージェントを公開し、ライブチャネル (デモ web サイト、Teams など) でテストを行ってください。
Microsoft 365 Copilot では非アクティビティのメッセージが表示されません
トリガーはサーバー側で実行されますが、出力 (メッセージやカードなど) は、Microsoft 365 Copilot のユーザー インターフェイスには表示されません。 回避策はありません。 Teams の既知の制限事項 を参照してください。
生成 AI オーケストレーション
非アクティブ状態のトリガーは、従来のオーケストレーション トピック トリガーとして実装されており、独立したタイマーベースのイベントパイプラインを使用します。 生成 AI オーケストレーションが有効になっている場合、トピックのルーティングは従来のトリガー認識に依存しなくなるため、非アクティブなトピックは、すべての構成において確実に作動するとは限りません。 非アクティブ時の処理が必要な場合は、従来のオーケストレーションが推奨され、完全に検証済みの構成となります。
接続されたエージェント: 子エージェントの非アクティブ状態はサポートされていません
接続型エージェントの構成では、子エージェントの非アクティブ状態トリガーが機能せず、「無効な接続型エージェントの応答」が返されます。非アクティブ状態に関するロジックはすべて親エージェントに実装してください。
最大期間: 7 日間 (604,800 秒)
公開されたボットは、継続時間が 604,800 秒を超えるトリガーを自動的に無視します。 エラーは表示されません。 デザイン モードではエラーが発生することがあります。 強制的な最小時間は設定されていません。ただし、短い時間 (約 15 秒未満) の場合、タイマーのインフラの遅延により、予期せぬ動作をする可能性があります。
会話を終了すると、非アクティブ タイマーがリセットされます
トピック内で会話を終了を呼び出すと、その会話に関するすべてのアクティブな非活動タイマーが永久に停止します。 タイマーは完全にクリアされます。リセットされたり一時停止されたりすることはありません。 この操作により、すでにスケジュールされている保留中の非アクティブ イベントはすべて破棄されます。
非アクティブ タイマーを中断することなくトピックの流れを終わらせたい場合は、以下の代替アクションのいずれかを使用します:
| アクション (Copilot Studio で) | 非アクティブタイマーへの影響 |
|---|---|
| 会話の終了 | すべてのタイマーをクリアします: タイマーは永久に停止します |
| 現在のトピックを終了する (EndDialog) | タイマーには影響しません。タイマーは継続して動作します |
| すべてのトピックをキャンセルする (CancelAllDialogs) | タイマーには影響しません。タイマーは継続して動作します |
ヒント
トピックで現在のフローを終了させる必要がありますが、その後も非アクティブタイマーを発動させたい場合 (たとえば、JIRA の検索トピックが完了しても、その会話はタイムアウトになるべき場合など) は、会話を終了ではなく現在のトピックを終了を使用してください。
再発動を防ぐためにガード変数を使用することは、依然として推奨される防御策です。
エージェントのエスカレーション後にトリガーが発動する
システムが会話を顧客サービス担当者に転送した後も、非アクティブ状態のトリガーは有効なままとなります。 人間のエージェントとの会話中に誤作動を起こし、予期せずエージェントへのメッセージを送信してしまう可能性があります。 転送を行う前には、EndConversation を呼び出すか、ガード変数を使用してください。
会話が終了した後、トリガー メッセージがトランスクリプトに表示される場合があります
会話が終了した後でも、トリガーが作動する場合があり、そのメッセージはトランスクリプトに記録されます。 この状態はユーザー エクスペリエンスには影響しませんが、分析データに反映される可能性があります。
電話、音声、IVR チャネル
非アクティブ トリガーは、電話と音声チャネルでは利用できません。 代わりにOnSilenceトリガーを使用してください。
一般的な構成ミス
このセクションでは、非アクティブ トリガーが期待どおりに機能しない原因となる、よくある構成上の問題を特定し、修正する方法について使用します。
非アクティブ トピックでの会話を終了する (ループのリスク)
問題: 「非アクティブ」トピックから 会話を終了 を選択すると、すべての非アクティブ タイマーがリセットされます。 ただし、会話が継続しているチャンネル (特に Teams) では、その会話自体は引き続きアクティブなままとなります。 構成によっては、トリガーが再発動し、その結果、「セッションが終了しました」というメッセージが繰り返し表示される場合があります。
解決策 (防御策として推奨): ガード変数を使用:
Global.DeactivateInactivity(ブール値、既定:false) を作成する。各「非アクティブ」トピックの先頭に、次の条件を追加します:
Global.DeactivateInactivity = falseの場合にのみ処理を進めます。EndConversation を呼び出す前に、
Global.DeactivateInactivity = trueに設定します。
注意
ガード変数パターンは、Teams のチャンネルにおいて特に重要です。Teams のチャンネルでは、会話が継続するモデルを採用しているため、会話が完全に終わることは決してないためです。
持続時間が誤った値に設定されています
問題:durationInSeconds は 秒です。
60000の値は約 16.7 時間で、60 秒ではありません。
解決策: セクション 3 の参照表と照らし合わせて値を再確認します。
複数の非アクティブトピックにおける質問ノード (プロンプトスタック)
問題点: 複数のトリガーにそれぞれ質問ノードが含まれている場合、2 番目のトリガーの質問ノードが 1 番目のトリガーを中断します。 ユーザーが回答すると、最初の 質問 ノードが再開され、リプロンプトされてループが形成されます。
解決策:共有トピックのパターンを使用します。 質問ノードのロジックを単一のトピックに統合するか、または質問ノードを含むトリガーが 1 つだけになるようにしてください。
非アクティブ トピックでのグローバル変数の消去
問題: 非アクティブのトピックによってグローバル変数がクリアされると、エージェントは会話のコンテキストをすべて失い、ユーザーが戻ってきた際に応答しない状態に見えてしまいます。
解決策: 非アクティブ状態固有の変数のみをリセットし、会話の状態全体はリセットしません。
Teams で非アクティブ状態のトリガーを無効にしない
問題: Teams では、永続的な会話モデルを採用しているため、トリガーが無限に発動し続けます。 ユーザーは、数時間あるいは数日後に「まだいらっしゃいますか?」というメッセージを繰り返し受け取ります。
解決策: Teams では、常にゲーティング変数のパターンを使用してください。
closeOmnichannelConversation を呼び出さない
問題: Dynamics 365 Customer Service のエージェントの場合、EndConversation を呼び出すだけでは、Dynamics 365 Customer Service のセッションは終了しません。 エージェントのキューには会話が積みあがっていきます。
解決策: 非アクティブトピック内で、Power Automate を使用してCloseOmnichannelConversation を true に設定します。
初期化されていない変数からの動的持続時間
問題:=Environment.InactivityTimeout などの Power Fx 式を期間として使用すると機能しますが、変数が初期化されていないか null の場合、トリガーは黙って除外されます。
解決策: トリガー条件や期間指定で使用されるすべての変数に既定値が設定されていることを確認してください。
エージェントへのエスカレーション後もトリガーが機能することを想定する
問題: システムが顧客サービス担当者に転送された後、元のエージェントとの会話でトリガーが作動し、エージェントとのセッション中にメッセージが送信されます。
解決策: エスカレーション時にエージェントとの会話を終了するか、ガード変数 Global.IsEscalated = true を使用して、非アクティブなトピックの開始時にそれを確認します。
非アクティブ トリガーが機能しない場合のトラブルシューティング
診断フローチャートを使って問題を特定してください。
どこでテストしていますか?
- テストパネルを使用している場合は、中止してください。 このテスト パネルでは、非アクティブ時のトリガーはサポートされていません。 ライブ チャンネルで公開してテストしてください。
どのチャンネルを使っていますか?
- Microsoft 365 Copilot ですか? このチャンネルには既知の制限があります。 トリガーは動作しますが、メッセージは配信されません。 回避策はありません。
- テレフォニー/IVR ですか? このチャネルはサポートされていません。 代わりにOnSilenceトリガーを使用してください。
生成 AI のオーケストレーションは有効になっていますか?
- 非アクティブ状態のトリガーは、認識ベースのルーティングとは別のタイマー パイプラインを使用します。 しかし、生成 AI のオーケストレーションにおけるこれらの挙動については、まだ完全に検証されていません。 非アクティブ時の処理が重要な場合は、従来のオーケストレーション構成を推奨します。
durationInSecondsの値は 604,800 を超えていますか?- そうであれば、トリガーは何も通知されずに無視されます。 604,800 以下に設定してください。
そのエージェントは、Connected Agent 構成における子エージェントですか?
- もしそうである場合、子エージェントの非アクティブ状態によるトリガーはサポートされていません。 ロジックを親エージェントに移してください。
非アクティブ状態のトリガーが複数ありますか?
- これらは持続時間の短いものから順に発動します。 十分に長い時間待つことを確認してください。 ユーザーからのメッセージがあると、すべてのタイマーがリセットされます。
トリガーには、初期化されていない変数を参照する条件が含まれていますか?
- 条件式で、まだ設定されていない変数が参照されている場合、そのトリガーは自動的に除外されます。 すべての状態変数に既定値が設定されていることを確認してください。
会話が始まった後、エージェントは再公開されましたか?
- 再公開を行うと、アクティブなセッションの非活動タイマーがリセットされる場合があります。 新しい会話を開始して、もう一度テストしてみてください。
それでも非アクティブのトリガーが機能しない場合は、以下の対処法をお試しください:
- 会話のトランスクリプトを確認し、非アクティブなトピックに関する活動がないことを確認してください。 トピックは表示されているものの、ユーザーがメッセージを確認していない場合は、その問題はチャンネル固有の配信に関するものです。
- そのトピックが無効化またはアーカイブされていないことを確認してください。
- トリガーの種類が「一定時間の非アクティブ状態の後」であり、フレーズ トリガーではないことを確認してください。
ベスト プラクティス
必ず公開されたチャネルでテストを行ってください。 デモ Web サイトを利用して簡易テストを行いましょう。 テスト ペインには依存しないでください。
ループを防ぐために、ガード変数を使用してください。
Global.DeactivateInactivity(ブール値、既定値はfalse) を作成します。 EndConversation を呼び出す前に、trueに設定してください。 「非アクティブ」に関するトピックが始まるたびに、これを確認してください。期間は適切な長さに設定してください。 最小 15 秒、最大 604,800 秒 (7 日間)。
単位を確認してください。 このプロパティは秒単位です。 5 分=
300(5ではありません)。Dynamics 365 Customer Service では、 Power Automate を使用して、常に
EndConversationとcloseOmnichannelConversationをペアにしてください。複数のトリガーが存在するシナリオでは、質問 ノードのトリガーを 1 つに制限するか、共有トピックのパターンを使用してください。
非アクティブ状態のトリガーを無効にするには、顧客サービス担当者につなぐ前に
EndConversationを呼び出します。運用環境への展開後、会話のトランスクリプトを確認し、メッセージが想定されたタイミングで表示されることを検証してください。
よくあるご質問
テストパネルでは、非アクティブ時のトリガーが機能しないのはなぜですか?
テスト パネルでは、設計上タイマーは無効になっています。 エージェントを公開し、ライブ チャンネルでテストしてください。
動的な期間 (変数から取得した値など) を使用できますか?
はい 持続時間フィールドは Power Fx 式を受け付けます。 環境変数または計算値を使用できます。 この式は、タイマーがセットされた実行時に評価されます。 変数が初期化されており、有効な数値が格納されていることを確認してください。
会話が進行中の状態で、エージェントの新しいバージョンを公開するとどうなりますか?
ランタイムは新しいバージョンを自動的に読み込みます。 トリガー ID が変更された場合 (トピックが削除され、再作成された場合)、システムは期間による照合に切り替わります。 ID や継続時間によって一致するトリガーがない場合、保留中の非アクティブ イベントは破棄されます。
Teams で非アクティブなトリガーを完全に無効にするにはどうすればよいですか?
プラットフォーム レベルではこれを停止できません。 ゲート制御のパターンを使用します。会話が論理的に終了した時点でブール値を設定し、非アクティブトピックの開始時にその値を確認して、早期に終了させます。
非アクティブなトリガーでは、認証と併用できますか?
はい、しかしセッションのタイムアウト時間が長い場合 (24 時間など)、トリガーが作動する前にユーザーの認証トークンが失効する可能性があります。 エージェントが再認証を適切に処理できるようにしてください。
非アクティブ時の処理で、処理に時間がかかるコネクタを呼び出した場合はどうなりますか?
コネクタの呼び出しにはタイムアウト制限があります (既定は 30 秒、最大 60 秒)。 コネクタを最適化するか、タイムアウトを適切に処理してください。
関連するコンテンツ
- トピックのトリガーを設定する
- システム変数 — InactivityTimer.Continue、InactivityTimer.Count
- Copilot Studio で Power Fx を使用する
- Dynamics 365 Customer Service のハンドオフを構成する
- 音声設定と無音検出
- Teams にエージェントを展開する
- 接続されたエージェント
- Copilot Studio のトランスクリプト
- オムニチャネルの会話を自動的に終了する
- Microsoft 365 Copilot の既知の制限