Google 電話平台

本指南將逐步說明如何為代理應用程式建立及設定新的 Google Telephony Platform (GTP) 電話號碼。這項現成功能可讓您為代理配置一組可在數分鐘內處理來電的全新號碼。

如要使用現有電話號碼,可以設定會話邊界控制 (SBC) 系統,自動將現有號碼重新導向至新的 GTP 號碼,或透過 SIP Trunk 導向至虛擬電話號碼。如需 SBC 整合和設定的詳細操作說明,請參閱 Dialogflow CX 電話說明文件。

事前準備

  1. 請按照設定和清理頁面上的步驟,建立或設定要用於部署作業的專案。
  2. 建立及設定要在部署作業中使用的代理應用程式。
  3. 在專案中啟用 Dialogflow API。

限制

限制如下:

將代理應用程式連結至 GTP 電話號碼

  1. 開啟 CX Agent Studio 控制台,然後選取代理應用程式。
  2. 在控制台頂端,依序按一下「Deploy」(部署) 分頁標籤和「Connect to a platform」(連結至平台)。如果您已部署管道,請按一下「+New channel」(+ 新增管道)。
  3. 輸入管道名稱,然後在「Platform」(平台) 選單中選取「Google Telephony Platform (GTP)」。
  4. 預設選項是佈建虛擬電話號碼,以便在瀏覽器中測試代理應用程式,或透過 SIP Trunk 轉送來自 SBC 的來電。如要佈建標準公用交換電話網路 (PSTN) 電話號碼,請從「Connection type」下拉式選單中選取該選項。
  5. 選取要部署的「Version」(版本)。如果沒有現有版本,請建立新版本。
  6. (選用) 按一下「Channel-specific behavior」(管道專屬行為) 切換鈕,設定其他選項。您可以變更代理回覆長度、啟用 DTMF 輸入,以及允許使用者在代理回覆時中斷。如要進一步瞭解這些設定,請參閱代理程式應用程式設定說明文件。
  7. 點按「建立頻道」,現在可以看到該管道的電話號碼和部署作業 ID。
  8. 如果您已佈建 PSTN 電話號碼,請撥打該號碼,測試是否能連線至服務專員應用程式,然後按一下「Done」(完成)。新管道會顯示在代理應用程式的「Deployed channels」(已部署的管道) 頁面。現在,顧客可以撥打這個號碼與虛擬服務專員通話。如果您佈建了虛擬電話號碼,可以在 WebRTC 小工具中測試,或透過 SIP Trunk 連線至 SBC。

在 WebRTC 小工具中測試服務專員應用程式

無論您佈建的是標準 PSTN 還是虛擬電話號碼,都可以在 WebRTC 小工具中,使用音訊、影片或文字測試代理程式應用程式。

  1. 按一下控制台頂端的「Deploy」(部署) 分頁標籤。
  2. 按一下已部署管道名稱旁的 圖示。右側會開啟 WebRTC 小工具。
  3. 如果 WebRTC 小工具顯示提示,請授予瀏覽器麥克風和攝影機存取權。
  4. 透過音訊、影片或文字與代理互動。使用視訊時,您也可以透過攝影機圖示旁的下拉式選單,切換至分享螢幕畫面。

透過 SIP Trunk 將虛擬電話號碼連結至 SBC

您可以透過安全的 SIP Trunk,將來自自有會話邊界控制器 (SBC) 或電信業者的 PSTN 或 VoIP 來電,轉接至 CX Agent Studio 虛擬電話號碼。虛擬電話號碼是不限國家/地區的 ID (開頭為 +0,後面接著 32 個十六進位字元),可讓您保留任何國家/地區的現有電信業者電話號碼,並將來電轉接給代理。

SIP Trunk 連線的必要條件

將 SIP 流量從 SBC 傳送至虛擬電話號碼之前,請先完成標準 Dialogflow CX SIP Trunk 設定和 SBC 設定。

設定虛擬電話號碼的 SIP URI 格式

由於虛擬電話號碼 (+0...) 不是 PSTN E.164 號碼,Google 電話平台會根據 INVITE Request-URI 和 To 標頭中的 SIP 網域轉接。

請在 INVITE Request-URI 和 To 標頭中,同時設定目的地 SIP URI 的格式,如下所示:

sip:VIRTUAL_NUMBER@ccai.prod-LOCATION.telephony.goog:5672;transport=tls

更改下列內容:

  • VIRTUAL_NUMBER:從控制台複製的完整 34 個字元虛擬電話號碼,開頭為 +0,後面接著 32 個大寫十六進位字元,不含空格 (例如 +01BCE14D51A354F8E84E142E7E1E3B4E5)。
  • LOCATION:建立 GTP Deployment 管道和虛擬電話號碼的 Google Cloud 地區 ID (例如 us、eu)。
頻道 Google Cloud 位置 SIP 網域 (ccai.prod-LOCATION.telephony.goog) SIP URI 範例
global ccai.prod-global.telephony.goog sip:+01BCE14D51A354F8E84E142E7E1E3B4E5@ccai.prod-global.telephony.goog
us ccai.prod-us.telephony.goog sip:+01BCE14D51A354F8E84E142E7E1E3B4E5@ccai.prod-us.telephony.goog
eu ccai.prod-eu.telephony.goog sip:+01BCE14D51A354F8E84E142E7E1E3B4E5@ccai.prod-eu.telephony.goog
其他支援的地區 (REGION) ccai.prod-REGION.telephony.goog sip:+01BCE14D51A354F8E84E142E7E1E3B4E5@ccai.prod-REGION.telephony.goog

虛擬電話號碼的 SIP INVITE 範例

以下範例顯示透過 mTLS 傳送至 us.telephony.goog:5672 (74.125.88.132:5672) 的有效 SIP INVITE,目標是 us 位置的虛擬電話號碼 +01BCE14D51A354F8E84E142E7E1E3B4E5:

INVITE sip:+01BCE14D51A354F8E84E142E7E1E3B4E5@ccai.prod-us.telephony.goog:5672;transport=tls SIP/2.0
Via: SIP/2.0/TLS sbc.example.com:5672;branch=z9hG4bK74bf9;rport
Max-Forwards: 70
From: "Caller" <sip:+16502530000@sbc.example.com>;tag=9fxced76sl
To: <sip:+01BCE14D51A354F8E84E142E7E1E3B4E5@ccai.prod-us.telephony.goog:5672;transport=tls>
Call-ID: 3848276298220188511@sbc.example.com
CSeq: 1 INVITE
Contact: <sip:+16502530000@sbc.example.com:5672;transport=tls>
Content-Type: application/sdp
Content-Length: ...

設定代理應用程式行為

您可以自訂代理結束和轉接通話的行為。

設定代理通話終止

如要允許服務專員結束通話,請按照下列步驟操作:

  1. 按一下代理右上方的加號,然後點選「新增工具」。
  2. 將 end_session 工具新增至代理 (以及所有子代理,如有)。根據預設,每個代理都會自動取得這項系統工具。
  3. 在操作說明中,新增通話終止行為的說明。例如:End the call by executing the end_session tool with arguments reason="customer_query_ended".

將通話轉接給真人服務專員

如要設定代理,將通話轉接給真人服務專員,並結束虛擬服務專員的通話:

  • 將 end_session 系統工具新增至代理 (以及所有子代理,如有)。
  • 建立下列變數:
    • escalationMessage:如要讓代理在轉接來電前說出訊息,請在「Default value」(預設值) 欄位中新增文字。
    • telephonyTransferCall:將「Type」設為「Custom schema」。在「Schema」(結構定義) 輸入方塊中輸入下列 JSON 物件,並填入要讓代理轉接來電的電話號碼 (須採用 E.164 格式)。
{
  "phoneNumber": "+PHONE_NUMBER"
}
  • 請在指令中加入這項行為的說明。例如:Escalate the call to a human agent by executing the end_session tool with session_escalated=true

合作夥伴支援的真人服務專員轉接

如果系統整合了非 Google 合作夥伴,則有兩種真人服務專員轉接選項:liveAgentHandoff 變數或 telephonyPayload 變數。無論是哪種情況,JSON 酬載都可能因合作夥伴的指示而異。

轉接真人服務專員:

  • 將 end_session 系統工具新增至代理 (以及所有子代理,如有)。
  • 建立下列變數:
    • liveAgentHandoff:將「Type」(類型) 設為「Custom schema」(自訂結構定義),並新增合作夥伴要求的 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:將「Type」(類型) 設為「Custom schema」(自訂結構定義),並新增合作夥伴要求的 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 標頭

您可以傳入以分號分隔的鍵/值組合清單 (採用十六進位編碼),後方加上 ;encoding=hex;purpose=Goog-Session-Param。如要在代理中存取這項資訊,請建立名為 uui-headers、類型為 List 的變數。

舉例來說,如要傳遞字串 key1=value1;key2=value2,應傳送下列 UUI 標頭,其中酬載是十六進位編碼值 key1=value1;key2=value2。

User-to-User: 6B6579313D76616C7565313B6B6579323D76616C756532;encoding=hex;purpose=Goog-Session-Param

變數 uui-headers 將包含下列物件:

"uui-headers": ["key1=value1;key2=value2"]

如要在呼叫 end_session 工具時傳遞 uuiHeaders,請指定 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-header 必須在 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。在 liveAgentHandoff 變數中指定 "sipRefer": true,即可觸發 SIP REFER,並在 telephonyTransferCall 變數中提供 refer-to 號碼。以下是執行 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。telephonyTransferCall 變數中的 phoneNumber 會觸發 SIP INVITE。以下是執行 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