Google 电话平台

本指南将引导您完成为智能体应用创建和配置新 Google Telephony Platform (GTP) 手机号码的过程。借助这项开箱即用的功能,您只需几分钟即可为代理绑定一个新的手机号码,用于处理来电流量。

如果您想使用现有手机号码,可以将会话边界控制 (SBC) 系统配置为自动将现有号码重定向到新的 GTP 号码或通过 SIP 中继的虚拟手机号码。如需详细了解 SBC 集成和设置,请参阅 Dialogflow CX 电话文档。

准备工作

  1. 按照设置和清理页面上的步骤创建或配置要用于部署的项目。
  2. 创建和配置要在部署中使用的智能体应用。
  3. 在项目中启用 Dialogflow API。

限制

存在以下限制:

将代理应用连接到 GTP 手机号码

  1. 打开 CX Agent Studio 控制台,然后选择您的代理应用。
  2. 在控制台顶部,依次点击部署标签页和连接到平台。如果您已经部署了渠道,请点击 + 新建渠道。
  3. 输入渠道的名称,然后从平台菜单中选择 Google Telephony Platform (GTP)。
  4. 默认选项是预配虚拟手机号码,以便在浏览器中测试代理应用,或通过 SIP 中继路由来自 SBC 的呼入手机。如需预配标准 PSTN(公共交换手机网)手机号码,请从 Connection type 下拉菜单中选择该选项。
  5. 选择要部署的版本。如果您没有现有版本,请创建一个新版本。
  6. (可选)点击渠道专属行为切换开关以配置其他选项。您可以更改代理响应长度、启用 DTMF 输入,并允许用户在代理响应过程中打断代理。如需详细了解这些设置,请参阅代理应用设置文档。
  7. 点击创建频道。现在,您可以看到该渠道的手机号码和部署 ID。
  8. 如果您预配了 PSTN 手机号码,请拨打该号码以测试它是否连接到您的代理应用,然后点击完成。新渠道会显示在代理应用的已部署的渠道页面上。现在,您可以使用此号码让客户致电您的代理。如果您预配了虚拟手机号码,则可以在 WebRTC widget 中对其进行测试,或通过 SIP 中继将其连接到 SBC。

在 WebRTC widget 中测试代理应用

无论您预配的是标准 PSTN 还是虚拟手机号码,都可以使用音频、视频或文本在 WebRTC widget 中测试代理应用。

  1. 点击控制台顶部的部署标签页。
  2. 点击已部署的频道名称旁边的 图标。系统会在右侧打开一个 WebRTC 微件。
  3. 如果 WebRTC widget 提示,请向浏览器授予访问麦克风和摄像头的权限。
  4. 通过音频、视频或文字与代理互动。使用视频时,您还可以使用摄像头图标旁边的下拉菜单切换到屏幕共享。

通过 SIP 中继将虚拟手机号码连接到 SBC

您可以通过安全的 SIP 中继,将来自您自己的会话边界控制器 (SBC) 或运营商的入站 PSTN 或 VoIP 通话路由到 CX Agent Studio 虚拟手机号码。虚拟手机号码是不限国家/地区的标识符(前缀为 +0,后跟 32 个十六进制字符),可让您在任何国家/地区保留现有的运营商手机号码,并将呼入手机转接到您的代理。

SIP 中继连接的前提条件

在将 SIP 流量从 SBC 发送到虚拟手机号码之前,请完成标准 Dialogflow CX SIP 中继设置和 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 部署渠道和虚拟手机号码的 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:如果您希望代理在转接通话之前说出一条消息,则可以选择向默认值字段添加文本。
    • telephonyTransferCall:将类型设置为自定义架构。在架构输入框中输入以下 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:将类型设置为自定义架构,并添加合作伙伴要求的 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 标头

您可以传入以英文分号分隔的键值对列表(采用十六进制编码),后跟 ;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。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