このガイドでは、エージェント アプリケーション用の新しい Google Telephony Platform(GTP)電話番号を作成して構成する手順について説明します。このすぐに使える機能を使用すると、新しい電話番号をエージェントに割り当てて、わずか数分で受信トラフィックを処理できるようになります。
既存の電話番号を使用する場合は、Session Border Control(SBC)システムを構成して、既存の番号を新しい GTP 番号に自動的にリダイレクトできます。SBC の統合と設定の詳細な手順については、 Dialogflow CX テレフォニーに関するドキュメントをご覧ください。
始める前に
- 設定とクリーンアップの ページの手順に沿って、デプロイに使用する プロジェクトを作成または構成します。
- デプロイで使用するエージェント アプリケーションを 作成して構成します。
- プロジェクトで Dialogflow API を有効にします。
制限事項
次の制限が適用されます。
- 標準 PSTN(公衆交換電話網)の電話番号は、
usマルチリージョンでサポートされています。euマルチリージョンでは、仮想電話番号を使用できます。 usマルチリージョンでは、米国の電話番号のみがサポートされています。- 仮想電話番号は、標準の PSTN 電話からダイヤルできません。
エージェント アプリケーションを GTP 電話番号に接続する
- CX Agent Studio コンソールを開き、エージェント アプリケーションを選択します。
- コンソールの上部にある [デプロイ] タブをクリックし、[プラットフォームに接続] をクリックします。すでにデプロイ済みのチャネルがある場合は、[+ 新しいチャネル] をクリックします。
- チャネルの名前 を入力し、[プラットフォーム] メニューから [Google Telephony Platform(GTP)] を選択します。
- デフォルトでは、ブラウザでエージェント アプリケーションをテストするための仮想電話番号がプロビジョニングされます。標準 PSTN(公衆交換電話網)の電話番号をプロビジョニングするには、[
Connection type] プルダウンからそのオプションを選択します。 - デプロイするバージョン を選択します。既存のバージョンがない場合は、新しいバージョンを作成します。
- (省略可)[チャネル固有の動作] 切り替えをクリックして、追加のオプションを構成します。エージェントのレスポンスの長さを変更したり、DTMF 入力を有効にしたり、ユーザーがレスポンスの途中でエージェントを中断できるようにしたりできます。これらの設定について詳しく は、 エージェント アプリケーションの設定に関するドキュメントをご覧ください。
- [チャンネルを作成] をクリックします。チャネルの電話番号とデプロイ ID が表示されます。
PSTN 電話番号をプロビジョニングした場合は、その番号に電話をかけてエージェント アプリケーションに接続できることを確認し、[完了] をクリックします。新しいチャネルがエージェント アプリケーションの [デプロイ済みチャネル] ページに表示されます。この番号を使用して、お客様がエージェントに電話をかけられるようになりました。仮想電話 番号をWebRTC ウィジェットでテストできます。
WebRTC ウィジェットでエージェント アプリケーションをテストする
標準 PSTN 電話番号と仮想電話番号のどちらをプロビジョニングした場合でも、音声、動画、テキストを使用して WebRTC ウィジェットでエージェント アプリケーションをテストできます。
- コンソールの上部にある [デプロイ] タブをクリックします。
- デプロイされたチャネル名の横にある アイコンをクリックします。右側に WebRTC ウィジェットが開きます。
- WebRTC ウィジェットからメッセージが表示されたら、ブラウザにマイクとカメラへのアクセス権を付与します。
- 音声、動画、テキストを使用してエージェントと対話します。動画を使用する場合は、カメラ アイコンの横にあるプルダウン メニューを使用して画面共有に切り替えることもできます。
エージェント アプリケーションの動作を構成する
通話の終了と転送に関するエージェントの動作をカスタマイズできます。
エージェントの通話終了を構成する
エージェントが通話を終了できるようにするには:
- エージェントの右上にあるプラス記号をクリックし、[ツールを追加] をクリックします。
end_sessionツールをエージェント(およびすべてのサブエージェント)に追加します。この システムツール は、デフォルトですべてのエージェントで使用できます。- 手順に通話終了の動作の説明を追加します。
例:
End the call by executing the end_session tool with arguments reason="customer_query_ended".
人間のエージェントに電話を転送する
人間のエージェントに電話を転送し、通話の仮想エージェント部分を終了するようにエージェントを構成するには:
end_sessionシステムツールをエージェント(およびすべてのサブエージェント)に追加します。- 次の変数を作成します。
escalationMessage: 必要に応じて、エージェントが通話を転送する前にメッセージを伝えるようにする場合は、[デフォルト値] フィールドにテキストを追加します。telephonyTransferCall: [タイプ] を [カスタム スキーマ] に設定します。エージェントが通話を転送する電話番号(E.164 形式)を使用して、次の JSON オブジェクトを [スキーマ] 入力ボックスに入力します。
{
"phoneNumber": "+PHONE_NUMBER"
}- 手順にこの動作の説明を追加します。例:
Escalate the call to a human agent by executing the end_session tool with session_escalated=true
パートナーがサポートする人間のエージェントへの転送
システムに Google 以外のパートナー
が組み込まれている場合は、人間のエージェントへの転送に liveAgentHandoff
変数または telephonyPayload 変数の 2 つのオプションを使用できます。どちらの場合も、JSON ペイロードはパートナーの手順によって異なる場合があります。
ライブ対応のエージェントへのハンドオフによる人間のエージェントへの転送:
end_sessionシステムツールをエージェント(およびすべてのサブエージェント)に追加します。- 次の変数を作成します。
liveAgentHandoff: [タイプ] を [カスタム スキーマ] に設定し、パートナーが必要とする JSON スキーマを追加します。例:
{ "PARTNER_NAME": { "type": "action", "action": "deflection", "deflection_type": "sip", "sip_uri": "SIP_URI", "sip_refer": true, "sip_parameters": { "x-header": "value" } } }
- 手順にこの動作の説明を追加します。例:
Escalate the call to a human agent by executing the end_session tool with session_escalated=true
カスタム ペイロードによる人間のエージェントへの転送:
end_sessionシステムツールをエージェント(およびすべてのサブエージェント)に追加します。- 次の変数を作成します。
telephonyPayload: [タイプ] を [カスタム スキーマ] に設定し、パートナーが必要とする JSON スキーマを追加します。例:
{ "PARTNER_NAME": { "type": "action", "action": "deflection", "deflection_type": "sip", "sip_uri": "SIP_URI", "sip_refer": true, "sip_parameters": { "x-header": "value" } } }
- 手順にこの動作の説明を追加します。例:
Escalate the call to a human agent by executing the end_session tool with session_escalated=true
SIP シグナリングを使用してエージェントとの間でデータを渡す
SBC 統合が完了している場合は、SIP シグナリングを使用して SIP ヘッダーを使用してエージェントにデータを渡すことができます。BYE、REFER、INVITE がエージェントによってトリガーされたときにデータを渡すこともできます。
エージェントに渡されたすべてのデータは、変数を使用してアクセスできます。データを取得するには、まず変数を作成する必要があります。
発信者の電話番号(ANI)は、Text タイプの変数 telephony-caller-id に保存されます。
エージェントがエスカレーションを行う前にメッセージを伝える必要がある場合は、メッセージを Text タイプの変数 escalationMessage に保存する必要があります。
SIP REFER または SIP INVITE を行うには、Custom schema (advanced) タイプの変数 telephonyTransferCall が存在し、変数 phoneNumber と useOriginatingTrunk が指定されている必要があります。
渡す必要のあるデータは、Custom schema (advanced) タイプの変数 liveAgentHandoff に存在する必要があります。
UUI SIP ヘッダー
16 進数でエンコードされた Key-Value ペアのセミコロン区切りのリストを渡すことができます。その後に ;encoding=hex;purpose=Goog-Session-Param を追加します。エージェント内でこれにアクセスするには、名前が uui-headers でタイプが List の変数を作成します。
たとえば、文字列 key1=value1;key2=value2 を渡す必要がある場合は、次の UUI ヘッダーを送信する必要があります。ペイロードは 16 進数でエンコードされた値 key1=value1;key2=value2 です。
User-to-User: 6B6579313D76616C7565313B6B6579323D76616C756532;encoding=hex;purpose=Goog-Session-Param
変数 uui-headers には次のオブジェクトが含まれます。
"uui-headers": ["key1=value1;key2=value2"]
uuiHeaders を end_session ツールを呼び出すときに渡すには、params={"liveAgentHandoff": {"uuiHeaders": [ {uui-headers}[0] ]}} を指定します。
たとえば、渡された UUI ヘッダーを SIP BYE で渡す必要がある場合は、次のような手順になります。
If the user says that they would like to speak to an agent, escalate the call to the agent by executing the end_session tool with session_escalated=true and params={"escalationMessage": "I am transferring you to an agent", "liveAgentHandoff":{"uuiHeaders": [ {uui-headers}[0] ]}}.
SIP x-headers
x- で始まる SIP ヘッダーをエージェントに渡して、変数 x-headers として保存し、タイプを Custom schema (advanced) に設定できます。変数内のヘッダー名から x- 接頭辞が削除されます。
たとえば、SIP INVITE に次のヘッダーが含まれているとします。
x-billing-id: 12345
変数 x-headers には次のオブジェクトが含まれます。
{
"x-headers": {
"billing-id": "12345"
}
}
end_session ツールを呼び出すときに xHeaders を渡すには、params={"liveAgentHandoff": {"xHeaders": {x-headers} }} を指定します。
たとえば、渡された x-headers を SIP BYE で渡す必要がある場合は、次のような手順になります。
If the user says that they would like to speak to an agent, escalate the call to the agent by executing the end_session tool with session_escalated=true and params={"escalationMessage": "I am transferring you to an agent", "liveAgentHandoff":{"xHeaders": {x-headers} }}.
SIP BYE を送信する
エージェントが通話を終了すると、SIP BYE が送信されます。SIP BYE で uuiHeaders と xHeaders を送信するには、次の例のような手順を使用します。
If the user says that they would like to speak to an agent, escalate the call to the agent by executing the end_session tool with session_escalated=true and params={"escalationMessage": "I am transferring you to an agent", "liveAgentHandoff":{"xHeaders": {x-headers}, "uuiHeaders": [{uui-headers[0]}] }}.
SIP REFER を送信する
エージェントが人間のエージェントに電話をエスカレーションして通話を終了する必要がある場合は、SIP REFER を使用する必要があります。SIP REFER は、"sipRefer": true を liveAgentHandoff 変数で指定することでトリガーされます。refer-to 番号は telephonyTransferCall 変数で指定する必要があります。SIP REFER を実行して uuiHeaders と xHeaders を渡す手順の例:
If the user says that they would like to speak to an agent, escalate the call to the agent by executing the end_session tool with session_escalated=true and params={"escalationMessage": "I am transferring you to an agent", "telephonyTransferCall": {"phoneNumber": "+19496855555", "useOriginatingTrunk": true}, "liveAgentHandoff":{"sipRefer": true, "xHeaders": {x-headers}, "uuiHeaders": [{uui-headers[0]}] }}.
SIP INVITE を送信する
エージェントが人間のエージェントに電話をエスカレーションし、Agent Assist 機能を使用できるように通話を維持する必要がある場合は、SIP INVITE を使用する必要があります。SIP INVITE は、telephonyTransferCall 変数の phoneNumber によってトリガーされます。SIP INVITE を実行して uuiHeaders と xHeaders を渡す手順の例:
If the user says that they would like to speak to an agent, escalate the call to the agent by executing the end_session tool with session_escalated=true and params={"escalationMessage": "I am transferring you to an agent", "telephonyTransferCall": {"phoneNumber": "+19496855555", "useOriginatingTrunk": true}, "liveAgentHandoff":{"xHeaders": {x-headers}, "uuiHeaders": [{uui-headers[0]}] }}.
リモート通話の切断のハンドラを作成する
お客様が通話を終了すると、特定のイベント sys.remote-call-disconnected がトリガーされます。このイベントを使用して、CX Agent Studio 内でツール呼び出しをトリガーできます。次の例では、お客様が通話を終了すると、ツール sum が呼び出されます。
ツール sum は Python コードツールとして定義され、次のコードが含まれています。
def sum(x: int, y: int) -> int:
"""
Computes the sum of two numbers.
Args:
x: The first number.
y: The second number.
Returns:
The sum of the two numbers.
"""
return x+y
ルート エージェントで、通話切断イベントを監視するロジックを使用して Before LLM コールバックを作成します。LlmResponse で sum ツール呼び出しを行い、end_session ツールを呼び出します。
def before_model_callback(callback_context: CallbackContext, llm_request: LlmRequest) -> Optional[LlmResponse]:
for part in callback_context.get_last_user_input():
if part.text == "<event>sys.remote-call-disconnected</event>":
return LlmResponse.from_parts(
[Part.from_function_call('sum', {'x': 1, 'y': 2}),
Part.from_end_session(reason='sum tool called after caller disconnected')]
)
return None