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

如何保留挂断客户在Task Router队列中的位置并实现回呼?

解决方案:实现客户挂断后保留队列位置并自动回呼

这个需求完全可行,核心思路是拆分「客户来电会话」和「排队任务」的绑定关系,不再依赖TaskRouter默认的来电与Task绑定逻辑,而是手动管理任务生命周期和回呼流程。以下是具体实现步骤:

核心逻辑调整

原逻辑:来电→<Enqueue>创建Task→客户挂断→Task自动取消
新逻辑:来电→手动创建独立Task→客户挂断→保留Task→Task分配→自动回呼客户+呼叫员工


1. 初始化排队任务

当客户首次来电时,不要直接用<Enqueue>标签绑定TaskRouter队列,而是:

  • 先通过TaskRouter API创建一个独立的Task,属性中包含客户手机号、排队优先级、业务类型等关键信息
  • 给客户播放等待音(用Twiml的<Play>或<Say>),同时在来电的Attributes中记录这个Task的Sid,方便后续关联

示例:创建Task的API调用

curl -X POST 'https://taskrouter.twilio.com/v1/Workspaces/{WorkspaceSid}/Tasks' \
--data-urlencode 'Attributes={"customer_phone": "+1234567890", "queue_status": "waiting", "service_type": "support"}' \
--data-urlencode 'WorkflowSid={WorkflowSid}' \
-u '{AccountSid}:{AuthToken}'

2. 处理客户挂断事件

通过Twilio的Call Status Webhook监听来电状态,当检测到来电状态为completed(客户挂断)时:

  • 不要取消Task,而是更新Task的Attributes,标记其状态为「等待回呼」
  • 保留Task在队列中继续排队,TaskRouter会正常处理其优先级和分配逻辑

示例:Node.js处理Call Status的Webhook

app.post('/call-status-webhook', (req, res) => {
  const callStatus = req.body.CallStatus;
  const taskSid = req.body.TaskSid; // 来电时将TaskSid存入Call的Attributes

  if (callStatus === 'completed') {
    // 更新Task属性,标记客户已挂断等待回呼
    twilio.taskrouter.workspaces('{WorkspaceSid}')
      .tasks(taskSid)
      .update({
        Attributes: JSON.stringify({
          customer_phone: "+1234567890",
          queue_status: "waiting_callback",
          service_type: "support"
        })
      })
      .catch(err => console.error('Update task failed:', err));
  }
  res.sendStatus(200);
});

3. Task分配时触发回呼与员工呼叫

当Task排到队首并分配给Worker时,通过Task Assignment Webhook触发两个并行动作:

  • 调用Twilio Call API回呼客户手机号,回呼接通后返回Twiml用于桥接员工
  • 同时呼叫目标Worker的电话/软终端,同样返回Twiml用于桥接客户

示例:Task分配Webhook处理逻辑

app.post('/task-assignment-webhook', (req, res) => {
  const taskAttrs = JSON.parse(req.body.TaskAttributes);
  const customerPhone = taskAttrs.customer_phone;
  const workerPhone = req.body.WorkerAttributes.phone; // 假设Worker属性中存了手机号

  // 1. 回呼客户
  twilio.calls.create({
    to: customerPhone,
    from: '{YourTwilioNumber}',
    url: 'https://your-server.com/bridge-to-worker' // 该URL返回桥接员工的Twiml
  });

  // 2. 呼叫员工
  twilio.calls.create({
    to: workerPhone,
    from: '{YourTwilioNumber}',
    url: 'https://your-server.com/bridge-to-customer' // 该URL返回桥接客户的Twiml
  });

  // 告知TaskRouter接受分配
  res.json({ instruction: 'accept' });
});

4. 通话桥接与异常处理

  • 桥接Twiml示例(bridge-to-worker端点返回):
<Response>
  <Say>您好,现在为您转接客服,请稍候</Say>
  <Dial>{WorkerCallSid}</Dial> <!-- 这里可以用Call Control API获取员工通话的Sid,或直接转员工号码 -->
</Response>
  • 异常处理:如果回呼客户失败(无人接听、占线),可设置重试机制(比如间隔5分钟重试2次),重试失败后将Task重新放回队列末尾,或标记为待人工处理

关键注意事项

  • 确保Task的优先级配置正确,避免回呼顺序混乱
  • 回呼时可添加去电显示标识,让客户识别是官方回呼
  • 做好日志监控,跟踪Task状态、回呼结果和通话桥接情况,方便排查问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 06:53:24