IBM Cloud Docs
与电话和 Twilio Flex 集成

与电话和 Twilio Flex 集成

IBM Cloud

您可以使用电话集成来帮助客户通过电话,并将其传输到 Twilio Flex 中的实时代理。 如果在与助理交谈的过程中,客户要求与某人通话,您可以直接将对话转接给Twilio Flex客服。

准备工作

要使用此集成模式,您需要:

  • watsonx Assistant Plus 或 Enterprise Plan (电话集成所必需)
  • 具有以下产品的 Twilio 帐户:
    • Twilio Flex
    • Twilio 具有可编程语音的语音 API
    • Twilio Studio

添加 watsonx Assistant 电话集成

如果已将电话集成添加到助手,那么可以跳过此部分。

如果需要添加电话集成,请执行以下步骤。

  1. 在助手的主页上的“基本通道”下的 集成 部分中,您将看到 Phone 的磁贴。

  2. 电话 磁贴上,单击 添加

  3. 在弹出窗口上,再次单击 添加

  4. 选择 将现有电话号码与外部提供者配合使用

  5. 完成电话集成设置过程。 (更多信息,请参阅 “与手机整合”。)

目前,这都是你需要做的。 有关配置电话集成的更多信息,请参阅 与电话集成

添加 Twilio Flex 项目

需要新的或现有的 Twilio Flex 项目。

如果需要 Twilio Flex 项目,那么可以使用以下步骤创建一个项目。

  1. 从项目下拉菜单中,单击 创建新项目。 指定项目的名称,并验证您的帐户信息。

  2. 在欢迎页面上,选择 Flex 作为新项目的 Twilio 产品。 完成问卷,然后单击 开始使用 Twilio

    供应 Flex 项目后,返回到 Twilio 控制台。 确保从下拉列表中选择了正确的项目。

  3. 在导航菜单中,单击 所有产品和服务 图标。

  4. 单击 Twilio 可编程语音> 设置> 常规

  5. 增强的可编程 SIP 功能下,切换到 已启用

创建调用流

配置电话集成和 Twilio Flex 项目后,必须使用 Twilio Studio 创建呼叫流,并供应 (或端口) 您希望助手使用的电话号码。

要创建调用流,请执行以下操作:

  1. 在导航菜单中,单击 所有产品和服务 图标。

  2. 单击 Studio

  3. 点击+ 创建新的流程。

  4. 为新流程命名,然后点击 “下一步”。

  5. 选择 从头开始,然后单击 下一步触发器 窗口小部件将显示在流画布中。

  6. 单击 触发器 窗口小部件。

  7. URL 中的值。 在后续步骤中需要用到这个值。

配置电话号码

  1. 在导航菜单中,单击 所有产品和服务 图标。

  2. 单击 电话号码

  3. 管理号码下,配置希望助手使用的电话号码。 选择 购买号码 以购买新号码,或者选择 端口和主机 以移植现有电话号码。

  4. 活动号码 列表中,单击新电话号码。

  5. 语音和传真下,配置这些设置。

    • 对于 CONFIGURE WITH 字段,选择 Webhook,TwiML Bins,Functions,Studio 或 Proxy

    • 对于 调用输入,请选择 Studio 流。 从下拉列表中选择您的流程。

    • 对于 主处理程序失败,请选择 Studio 流。 从下拉列表中选择您的流程。

  6. 转至 watsonx Assistant 用户界面,然后打开助手的电话集成设置。

  7. 电话号码 字段中,输入在 Flex Studio 中配置的电话号码。

  8. 单击保存并退出

测试您的电话号码

现在,您可以通过在 Twilio Flex 流编辑器中触发 说/玩 窗口小部件来测试您的电话号码是否已连接到流。

  1. 说/玩 窗口小部件拖到流画布上。

  2. 使用类似于 I'm alive. 的简单短语配置“说/玩”窗口小部件。

  3. 将“触发器”窗口小部件上的 入局呼叫 节点连接到 说/玩 窗口小部件。

  4. 拨打您的电话号码。 您应该听到 Twilio 流使用测试短语进行响应。

  5. 删除 说/玩 窗口小部件,然后继续执行下一步。

  6. 如果此测试未按预期工作,请仔细检查电话号码配置以确保其连接到流。

创建 Twilio 函数以处理入局呼叫

现在,您需要配置调用流,以使用 Twilio 函数将入站调用定向到助手。 执行以下步骤:

  1. 在导航菜单中,单击 所有产品和服务 图标。

  2. 点击 “服务”。

  3. 单击创建服务。 指定服务名称,然后点击 “下一步”。

  4. 单击 添加 > 添加功能 以向服务添加新功能。 将新函数命名为 /receive-call

  5. /receive-call 函数中的模板替换为以下代码:

    exports.handler = function(context, event, callback) {
      const VoiceResponse = require('twilio').twiml.VoiceResponse;  
      const response = new VoiceResponse();
      const dial = response.dial({
        answerOnBridge: "true",
        referUrl: "/refer-handler"
      });
      const calledPhoneNumber = event.Called;
      dial.sip(`sip:${calledPhoneNumber}@{sip_uri_hostname};secure=true`);  
      return callback(null, response);
    }
    
    • {sip_uri_hostname} 替换为助手电话集成 SIP URI 的主机名部分 ( sips: 之后的所有内容)。 注: Twilio 不支持 SIPS URI,但通过将 ;secure=true 附加到 SIP URI 来支持安全 SIP 中继。
  6. 单击保存

  7. 单击 全部部署

重定向到入局呼叫处理程序

使用 Studio 流编辑器中的 TwiML 重定向 窗口小部件来调用在上一部分中创建的 /receive-call 函数。

  1. TwiML 重定向 窗口小部件添加到 Studio 流画布。

  2. 将“传入调用”触发器连接到 TwiML 重定向 窗口小部件。

  3. 使用您在上一部分创建的 /receive-call 功能URL 配置 TwiML小部件

  4. 现在,在接收入站调用时,您的流应该重定向到 watsonx Assistant。

  5. 如果重定向失败,请确保已部署 /receive-call 函数。

创建 Twilio 函数以处理来自助手的传输

对于客户要求与代理交谈的情况,您还需要配置呼叫流以处理从助手传输回 Twilio Flex 的呼叫。 在“TwiML 重定向”窗口小部件之后使用 说/玩 来显示调用已从 watsonx Assistant传输回流。 此时可以使用许多选项,例如排队调用实时代理程序,并在本节中进行讨论。

  1. 说/玩 窗口小部件添加到画布,并使用诸如 Transfer from Watson complete 之类的短语对其进行配置。

  2. 将“TwiML 重定向”窗口小部件上的 返回 节点连接到 说/玩 窗口小部件。

  3. 单击 触发器 窗口小部件。

  4. 复制 URL 中的值。 在后续步骤中需要用到这个值。

  5. 在“Twilio 函数”页面上,单击 添加 > 添加函数 以向服务添加另一个新功能。 将此新功能命名为 /refer-handler

  6. /refer-handler 函数中的模板替换为以下代码:

    exports.handler = function(context, event, callback) {
      // This function handler will handle the SIP REFER back from the Phone Integration.
      // Before handing the call back to Twilio, it will extract the session history key from the
      // User-to-User header that's part of the SIP REFER Refer-To header. This session history key
      // is a string that is used to load the agent application in order to share the transcripts of the caller
      // with the agent.
      // See https://github.com/watson-developer-cloud/assistant-web-chat-service-desk-starter/blob/main/docs/AGENT_APP.md
      const VoiceResponse = require('twilio').twiml.VoiceResponse;
    
      const STUDIO_WEBHOOK_URL = '{webhook_url}';
    
      let studioWebhookReturnUrl = `${STUDIO_WEBHOOK_URL}?FlowEvent=return`;
    
      const response = new VoiceResponse();
      console.log("ReferTransferTarget: " + event.ReferTransferTarget);
    
      const referToSipUriHeaders = event.ReferTransferTarget.split("?")[1];
      console.log(referToSipUriHeaders);
      if (referToSipUriHeaders) {
        const sanitizedReferToSipUriHeaders = referToSipUriHeaders.replace(">", "");
        console.log("Custom Headers: " + sanitizedReferToSipUriHeaders);
    
        const sipHeadersList = sanitizedReferToSipUriHeaders.split("&");
    
        const sipHeaders = {};
        for (const sipHeaderSet of sipHeadersList) {
          const [name, value] = sipHeaderSet.split('=');
          sipHeaders[name] = value;
        }
    
        const USER_TO_USER_HEADER = 'User-to-User';
    
        // Extracts the User-to-User header value
        const uuiData = sipHeaders[USER_TO_USER_HEADER];
    
        if (uuiData) {
          const decodedUUIData = decodeURIComponent(uuiData);
          const sessionHistoryKey = decodedUUIData.split(';')[0];
          // Passes the session history key back to Twilio Studio through a query parameter.
          studioWebhookReturnUrl = `${studioWebhookReturnUrl}&SessionHistoryKey=${sessionHistoryKey}`;
        }    
      }
    
      response.redirect(
        { method: 'POST' },
        studioWebhookReturnUrl
      );
    
      // This callback is what is returned in response to this function being invoked.
      // It's really important! E.g. you might respond with TWiML here for a voice or SMS response.
      // Or you might return JSON data to a studio flow. Don't forget it!
      return callback(null, response);
    }
    

    {webhook_url} 替换为您从Studio Flow中的触发器小部件复制的 URL

  7. 单击保存

  8. 单击 全部部署

  9. 创建此引用处理程序后,将URL 复制回 /receive-call 处理程序的 referUrl 字段。

配置助手以将调用传输到 Twilio Flex

现在,我们需要配置助手,以便在客户要求与代理交谈时将呼叫转接到 Twilio Flex。 执行以下步骤:

  1. 在 watsonx Assistant 用户界面中,打开助手的对话技能。

  2. 添加具有触发助手将客户转移到代理程序的条件的节点。

  3. 向节点添加文本响应,并指定您希望助手在将客户传输到代理之前说的文本。

  4. 打开响应的 JSON 编辑器。

  5. 在 JSON 编辑器中,添加 connect_to_agent 响应,将您的电话号码指定为 sip.uri (将 {phone_number} 替换为 SIP 干线的电话号码):

{
  "generic": [
    {
        "response_type": "connect_to_agent",
        "transfer_info": {
          "target": {
            "service_desk": {
              "sip": {
                "uri": "sip:+{phone_number}@flex.twilio.com",
                "transfer_headers_send_method": "refer_to_header"
              }
            }
          }
        },
        "agent_available": {
          "message": "Ok, I'm transferring you to an agent"
        },
        "agent_unavailable": {
          "message": ""
        }
    }
  ]
}

此示例不显示如何使用从 watsonx Assistant 传递到 Twilio Flex 的上下文。 您可以从 Twilio Flex 流程中引用“用户到用户”信息:

{
  "context": {
    "widgets": {
      "redirect_1": {
        "User-to-User": "value",
      }
    }
  }
}

其中 redirect_1 是重定向窗口小部件的名称。 例如,如果设置多个队列,那么可能要使用 Twilio 分割窗口小部件根据返回的上下文选取队列。

测试助手

现在,您的助手应该能够接听您的电话号码,并将呼叫转接回 Twilio Flex 流程。 要测试助手,请执行以下操作:

  1. 拨打您的电话号码。 当助手响应时,请求代理程序。

  2. 您应该听到在 “说/播放”小工具中配置的短语(例如,Transfer from Watson complete )。

  3. 如果传输失败,请使用控制台日志在调用从流移动到 /receive-call 处理程序,到 watsonx Assistant,到引用处理程序,然后返回到 Twilio Flex 流时遵循该流。

与服务台代理人共享对话历史记录

要使服务台代理人能够快速查看访问者与助手之间的对话历史记录,请为 Twilio Flex 环境设置 watsonx Assistant Agent App 应用程序。 有关更多信息,请参阅 Twilio Flex watsonx Assistant 代理程序应用程序上的文档。