概念和疑難排解

本頁詳細說明整合所需的特定設定,以及常見問題的疑難排解方式。

電話網路需求

如果網路會篩選輸出流量,則必須允許 SIP 訊號和媒體串流的輸出流量。

如要使用 SIP 訊號,請允許通訊埠 5672 上整個 IP 範圍 74.125.88.128/25 (TCP)。如要設定更嚴格的防火牆規則集,您可以將 SIP 訊號限制為一或多個區域化 GTP SIP 伺服器:

  • 美國區域:us.telephony.goog (74.125.88.132)
  • 歐盟區域:eu.telephony.goog (74.125.88.133)
  • 亞太地區:ap.telephony.goog (74.125.88.134)
  • 南美洲區域:sa.telephony.goog (74.125.88.135)

如果是 RTP 媒體,您必須設定防火牆規則,允許流量傳送至 CIDR IP 範圍 74.125.39.0/24。媒體通常只需要 16384-32767 (TCP+UDP) 通訊埠,但這個通訊埠範圍日後可能會擴大。

支援的 SBC 供應商或型號

下表列出支援的 SBC 供應商/型號和韌體版本。韌體版本中會連結各供應商的詳細整合說明。

供應商和型號 韌體版本
AudioCodes VE SBC v7.60A.100.022 (SIPRECSIP)
Avaya Session Border Controller for Enterprise v10.2.1.1-104-25336 (SIPRECSIP)
Oracle E-SBC Acme Packet 3900 SCZ9.3.0 正式版 (建構版本 46)
Ribbon Swe Core SBC v11.01.01R005
Cisco Unified Border Element (CUBE) 17.15.4 版 (SIPRECSIP)

支援的 SBC 信號和媒體通訊協定

信號通訊協定 SIP over TLS
媒體 SRTP
媒體加密 SDES
支援媒體加密套件 AES_CM_128_HMAC_SHA1_80、AEAD_AES_256_GCM
支援的媒體轉碼器 G.711 µ-law (PCMU)、G.711 A-law (PCMA)、Opus

SIP 標頭

設定對話設定檔和電話號碼時,您建立的 CCAI 對話設定檔會將 sipConfig.createConversationOnTheFly 設為 true。在 SIP INVITE 期間,應使用 Call-InfoUUI 的 SIP 標頭值,動態產生對話 ID。

SIP 標頭值會定義Google Cloud 專案 ID 和對話 ID,指向 Dialogflow 端點:

  1. Google Cloud 專案 ID 是您設定 Google Cloud 專案時使用的專案。
  2. 對話 ID 應由 SBC 動態產生。對話 ID 必須符合規則運算式公式 [a-zA-Z][a-zA-Z0-9_-]*,且字元長度介於 [3,64] 之間。如要動態產生對話 ID,常見的做法是使用 SIP INVITE 中的 Call-ID 值,並加上字母前置字元,使其符合先前指定的規則運算式。舉例來說,如果 Call-ID 值為 297363723_79131759_799783510,在前置字串加上 "CID-",即可符合規則運算式 [a-zA-Z][a-zA-Z0-9_-]*

Call-Info SIP 標頭

在 SIP INVITE 中插入名為 Call-Info 的自訂 SIP 標頭,以專屬方式設定對話 ID:

Call-Info: <http://dialogflow.googleapis.com/v2beta1/projects/$PROJECT_ID/conversations/$CONVERSATION_ID>;purpose=Goog-ContactCenter-Conversation

範例:

Call-Info: <http://dialogflow.googleapis.com/v2beta1/projects/gcp-project-id-12345/conversations/CID-297363723_79131759_799783510>;purpose=Goog-ContactCenter-Conversation

UUI SIP 標頭

如果系統不支援設定自訂 SIP 標頭 Call-Info,您可以在 SIP INVITE 中設定 UUI (使用者對使用者) SIP 標頭,傳遞對話 ID。

使用 Call-Info 中要求的相同資料,並將網址編碼為十六進位,且將用途設為 Goog-ContactCenter-Conversation。以下是標頭範例,其中解碼後的十六進位字串為 http://dialogflow.googleapis.com/v2beta1/projects/gcp-project-id-12345/conversations/CID-297363723_79131759_799783510

User-to-User: 687474703a2f2f6469616c6f67666c6f772e676f6f676c65617069732e636f6d2f763262657461312f70726f6a656374732f6763702d70726f6a6563742d69642d31323334352f636f6e766572736174696f6e732f4349442d3239373336333732335f37393133313735395f373939373833353130;encoding=hex;purpose=Goog-ContactCenter-Conversation

如要將額外資料傳遞至對話式代理程式,並設為工作階段參數,請傳遞以半形分號分隔的鍵值配對清單 (以十六進位編碼),然後加上 ;encoding=hex;purpose=Goog-Session-Param。這樣一來,系統就會建立名為「uui-headers」的會期參數,其中包含已解碼的酬載字串清單。

舉例來說,如果需要傳入字串 key1=value1;key2=value2,系統會傳送下列 UUI 標頭,其中酬載是 key1=value1;key2=value2 的十六進位編碼值。

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

這會建立下列工作階段參數。

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

如果 SBC 支援傳送多個 UUI 標頭,您可以為每個 UUI 標頭傳送個別的鍵值字串,這些字串會以個別值的形式顯示在 uui-headers 工作階段參數中。

以下程式碼片段會取得參數值,然後多次分割參數,以存取字串中 key2 變數的適當值。

$sys.func.GET($sys.func.SPLIT($sys.func.GET($sys.func.SPLIT($session.params.uui-headers,";"),1),"="),1)

以下範例顯示從 Playbook 程式碼區塊中的觸發程序呼叫的函式,例如 @PlaybookStartHandler,會在進入應對手冊時呼叫。其他函式會呼叫這個函式,從 uui-headers 參數取得值。

def _get_fromuui(attribute):
    try:
        uui_headers_src = history.playbook_input.action_parameters['uui-headers']
        # If uui_headers_src is a string, split by ';'
        if isinstance(uui_headers_src, str):
            headers = uui_headers_src.split(';')
        else:
            # If it's a list, join and split
            headers = ';'.join(uui_headers_src).split(';')
        for header in headers:
            header = header.strip()
            if header.lower().startswith(f"{attribute.lower()}="):
                return header[len(attribute) + 1:]
        return ""
    except Exception:
        return ""

如要傳送其他資料,可以使用具有不同「purpose」值的個別 UUI 標頭。這些值會新增至 Conversation.telephonyConnectionInfo 物件。請注意,Conversational Agents (Dialogflow CX) 虛擬服務專員在執行階段無法存取這項資料。

傳遞真人服務專員資訊

如要傳遞專屬的人工服務專員資訊,可以將 Session Description Protocol (SDP) 媒體標籤屬性、人工服務專員、Real-time Transport Protocol (RTP) 串流設為所需資料值。範例: none a=label:7382373482 這項資料會填入 sip_recording_media_label 欄位,並顯示在含有轉錄稿的 New message notification pubsub 主題中。在 pubsub Message.attributes 訊息中尋找 sip_recording_media_label 欄位。

設定參與者角色和媒體串流順序

根據預設,第一個媒體串流會與 END_USER 參與者角色建立關聯,後續的媒體串流則會與 HUMAN_AGENT 參與者角色建立關聯。

如需不同行為 (例如在撥出電話系統中),則標頭中傳遞的網址應附加 roles 參數。

例如: none http://dialogflow.googleapis.com/v2beta1/projects/gcp-project-id-12345/conversations/CID-297363723_79131759_799783510?roles=HUMAN_AGENT,END_USER

網址指定第一個媒體串流應具有 HUMAN_AGENT 角色,第二個媒體串流則應具有 END_USER 角色。您可以使用 Call-InfoUUI SIP 標頭套用 roles 參數

在特定對話中設定其他參數

如要在特定對話中設定其他參數,請使用 MatchIntentRequest RPC 呼叫。您可以將 query_params.parameters 設為必要鍵/值組合,並將 query_input.text 設為「設定參數」等內容。

在初始 SIP INVITE 的 200 OK 回應後進行 API 呼叫,此時對話已建立。MatchIntentRequest 的工作階段 ID 與 INVITE 中 Call-Info 標頭提供的對話 ID 相同。

使用 SIP REFER 將通話轉接至 SIP 端點

如要將通話從虛擬代理人轉接至 SIP 端點,請使用 SIP REFER 方法。在 Live agent handoff 欄位中加入酬載,並將 Telephony transfer call 欄位設為在輸出 SIP REFER Refer-To 欄位中設定的號碼。您的酬載應類似下列程式碼範例。

{
    "sip-refer": true
}

如要將資料傳出 Conversational Agents (Dialogflow CX),可以使用 UUI 標頭傳出資料字串。如果您想執行 SIP REFER 並傳遞 2 個鍵/值組合,可以使用類似下列程式碼範例的酬載。

{
    "sip-refer": true,
    "uui-headers": [
        "key1=value1;key2=value2"
    ]
}

這會產生包含下列 UUI 標頭的 SIP REFER。

User-to-User: <hex encoded "key1=value1;key2=value2">;encoding=hex;purpose=Goog-Session-Param

在 SIP BYE 中傳遞資料

前往 End Session 會觸發 SIP BYE。如要將資料傳出 Conversational Agents (Dialogflow CX),可以使用 UUI 標頭傳出資料字串。您會將呼叫路徑導向至定義 Live agent handoff 酬載的網頁,類似於下列程式碼範例,然後轉換至 End Session

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

這會產生 SIP BYE,並包含下列 UUI 標頭。

User-to-User: <hex encoded "key1=value1;key2=value2">;encoding=hex;purpose=Goog-Session-Param

在遠端來電者掛斷電話時觸發動作

新的 BiDi API (ConversationProfile 中的 use_bidi_streaming=True) 支援在遠端來電者掛斷電話時,觸發劇本中的工具呼叫或流程中的 Webhook 呼叫。

遠端來電者掛斷電話,且 Conversational Agents (Dialogflow CX) 收到 SIP BYE 訊息時,就會觸發自訂事件 sys.remote-call-disconnected。如果您使用這個特定事件名稱建立處理常式,就能在流程中透過 Playbook 或 Webhook 呼叫,使用該處理常式觸發工具呼叫。

疑難排解

Google 團隊可能會要求您提供下列構件,協助排解 SIP OPTIONS Ping 和測試通話的問題:

  1. 擷取網路封包
  2. SIP 偵錯追蹤記錄,顯示完整標頭和 SIP SDP:
    • 通話 ID 值
    • Call-Info 值 (如有)

網路封包擷取

網路封包擷取畫面應顯示下列內容:

  1. SBC 與 GTP SIP 伺服器之間完成 3 向 TCP 交握 (SYN、SYN-ACK、ACK),並透過 TCP 通訊埠 5672 通訊。如果無法建立 TCP 連線,可能的原因如下:

    • 網路封鎖了輸出流量。
    • 通訊內容未傳送至其中一個區域化 GTP SIP 伺服器。 請參閱「電話連線網路需求」。
    • 通訊未透過 TCP 通訊埠 5672 傳送。
  2. 完成傳輸層安全標準 (TLS) 連線握手程序,並符合下列條件:

    • 由 SBC 啟動的 TLS v1.2 以上版本。
    • SBC 啟動「Client Hello」,而 GTP 則以「Server Hello」回應。
    • 雙向傳輸層安全標準 (TLS) 驗證程序。
      • GTP 會回覆自己的伺服器 TLS 憑證,並由 SBC 進行驗證。
      • SBC 會傳送自己的用戶端 TLS 憑證,並由 GTP 進行驗證。
    • 已建立加密管道,如「加密握手訊息」所示。
    • 透過 TLS 管道傳輸「應用程式資料」的證據。

    如果無法建立 TLS 連線,可能的原因如下:

    • GTP 端尚未建立 SIP 中繼。
    • 設定的 SIP 中繼線 FQDN 與 SBC 的 TLS 憑證 (CN 或 SAN 屬性) 中顯示的 FQDN 不符。
    • 不支援的傳輸層安全標準 (TLS) 版本,系統僅支援傳輸層安全標準 (TLS) 1.2 以上版本。
    • 不支援要求的加密套件,請參閱「SBC 的 TLS 設定」。
    • 不受信任的 TLS 憑證供應商,請參閱「SBC 的 TLS 設定」。
  3. SIP 偵錯追蹤記錄應顯示下列內容:

    • 以這個格式插入客戶 Call-Info SIP 標頭: none Call-Info: <http://dialogflow.googleapis.com/v2beta1/projects/$PROJECT_ID/conversations/$CONVERSATION_ID>;purpose=Goog-ContactCenter-Conversation

      例如: none Call-Info: <http://dialogflow.googleapis.com/v2beta1/projects/gcp-project-id-12345/conversations/CID-297363723_79131759_799783510>;purpose=Goog-ContactCenter-Conversation

    • SIP 標頭會以 E.164 格式顯示電話號碼 (+16501234567)。

    • SIP 標頭會顯示要求 URI 和其他 SIP 標頭欄位 (例如 To、From、Via) 中使用的公開 IP 位址。系統會拒絕私人 IP 位址。

    • SIP SDP 連線資訊 (c= ... ) 是以公開 IP 位址指定。系統會拒絕私人 IP 位址。

    • 請確保媒體優先順序會先傳送給使用者,再傳送給真人服務專員,因為 GTP 預設會將第一個媒體串流視為使用者。

    如果收到 SIP 錯誤回應代碼:

    • SIP 400 的錯誤 (例如 488 Not Acceptable Here) 回應代碼可能表示 GTP 拒絕了 SIP 標頭或 SIP 媒體 SDP 設定。
    • SIP 600 錯誤 (SIP 603 拒絕錯誤) 回應代碼可能表示配額相關問題。如要瞭解如何申請增加配額,請參閱「配額與限制」頁面。