You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何借助Twilio Task Router实现音视频呼叫统一分配及代码示例

当然可以用同一个Twilio Task Router实例来同时处理语音和视频呼叫!核心思路是通过任务属性来区分呼叫类型,再结合工作流规则和坐席能力进行精准分配。下面我一步步给你拆解,还附上实用的代码示例:

1. 核心逻辑:用任务属性区分呼叫类型

在创建Task Router任务时,给语音和视频呼叫分别添加唯一标识的属性(比如call_type),这样系统就能识别不同的呼叫类型,后续的分配规则也能基于这个属性来配置。

2. 可选优化:给坐席配置能力标签

如果你的团队里有只能处理语音、只能处理视频,或者两者都能处理的坐席,可以给坐席的attributes字段添加能力标识,比如:

  • 全能坐席:{"can_handle_voice": true, "can_handle_video": true}
  • 仅语音坐席:{"can_handle_voice": true, "can_handle_video": false}
    这样工作流可以精准匹配任务和坐席能力。
3. 工作流规则配置

在Task Router的工作流里,你可以设置分层规则:

  • 优先将call_type: video的任务分配给有视频处理能力的坐席
  • 再将call_type: voice的任务分配给语音坐席(或所有坐席)
    如果不需要区分坐席能力,也可以直接将两种任务都路由到同一个队列,让所有坐席都能接取。
4. 代码示例

创建语音呼叫任务(Node.js)

const twilio = require('twilio');
const client = twilio('YOUR_ACCOUNT_SID', 'YOUR_AUTH_TOKEN');

async function createVoiceTask() {
  try {
    const task = await client.taskrouter.v1.workspaces('YOUR_WORKSPACE_SID')
      .tasks.create({
        attributes: JSON.stringify({
          call_type: "voice",
          from: "+1234567890",
          call_sid: "CAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" // 语音呼叫的SID
        }),
        workflowSid: "YOUR_WORKFLOW_SID"
      });
    console.log('语音任务创建成功:', task.sid);
  } catch (err) {
    console.error('创建任务失败:', err);
  }
}

createVoiceTask();

创建视频呼叫任务(Node.js)

视频任务需要额外携带视频房间相关的属性,方便后续坐席接入:

async function createVideoTask() {
  try {
    const task = await client.taskrouter.v1.workspaces('YOUR_WORKSPACE_SID')
      .tasks.create({
        attributes: JSON.stringify({
          call_type: "video",
          from: "+10987654321",
          room_sid: "RMXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" // Twilio视频房间SID
        }),
        workflowSid: "YOUR_WORKFLOW_SID"
      });
    console.log('视频任务创建成功:', task.sid);
  } catch (err) {
    console.error('创建任务失败:', err);
  }
}

createVideoTask();

工作流规则配置示例(JSON)

这个配置会优先分配视频任务给具备视频能力的坐席,再处理语音任务:

{
  "task_routing": {
    "filters": [
      {
        "filter_friendly_name": "视频呼叫路由",
        "expression": "call_type == 'video' AND worker.attributes.can_handle_video == true",
        "targets": [
          {
            "queue": "YOUR_VIDEO_QUEUE_SID",
            "priority": 5
          }
        ]
      },
      {
        "filter_friendly_name": "语音呼叫路由",
        "expression": "call_type == 'voice' AND worker.attributes.can_handle_voice == true",
        "targets": [
          {
            "queue": "YOUR_VOICE_QUEUE_SID",
            "priority": 3
          }
        ]
      }
    ],
    "default_filter": {
      "queue": "YOUR_DEFAULT_QUEUE_SID" // 兜底队列
    }
  }
}

任务分配回调处理(Node.js)

当坐席接到任务时,通过call_type属性判断呼叫类型,返回对应的处理指令:

const express = require('express');
const app = express();
app.use(express.urlencoded({ extended: true }));

app.post('/assignment-callback', (req, res) => {
  const taskAttributes = JSON.parse(req.body.TaskAttributes);
  let assignmentInstruction;

  if (taskAttributes.call_type === 'video') {
    // 视频呼叫:返回接入视频房间的指令
    assignmentInstruction = {
      "instruction": "dequeue",
      "post_work_activity_sid": "WAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", // 后处理活动SID
      "video": {
        "room_name": `video-session-${taskAttributes.room_sid}`
      }
    };
  } else {
    // 语音呼叫:返回连接坐席电话的指令
    assignmentInstruction = {
      "instruction": "dequeue",
      "post_work_activity_sid": "WAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
      "to": "+1234567890" // 坐席的电话号码
    };
  }

  res.json(assignmentInstruction);
});

app.listen(3000, () => console.log('分配回调服务启动在3000端口'));

内容的提问来源于stack exchange,提问作者Balvant parmar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:49:20