如何借助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
相关产品推荐
相关产品推荐

