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

Twilio任务分配回调修改会议友好名及重定向获取TaskSid问题

呼叫流程构建问题与解决方案探讨

场景与需求

我正在构建一套呼叫流程,核心逻辑如下:

  • 来电者通过Flex控制台的Conference功能连接坐席
  • 坐席可将来电者转至其他IVR(包括外部IVR),且自身不退出当前会议
  • 来电者完成IVR交互后,需转回坐席等待的同一会议

当前实现与问题

已编写两个Twilio函数:

  1. assignmentCallback(JS):用于创建会议,当前以TaskSid作为会议的friendlyName
  2. 重定向函数:用于将来电者转回原会议

遇到的问题:

  • 尝试在assignmentCallback中将会议的friendlyName设置为call_sid,但无效果
  • 重定向函数目前仅能获取CallSid参数,无法直接拿到TaskSid,导致无法准确定位原会议

相关代码

assignmentCallback 函数

const client = context.getTwilioClient();
const api_response = await client.taskrouter.v1.workspaces(WorkspaceSid)
.tasks(TaskSid)
.reservations(ReservationSid)
.update({
   instruction: 'conference',
   from: _from,
   friendlyName: call_sid,
   to: assigned_worker_uri,
   endConferenceOnExit: true,
   startConferenceOnEnter: false
   })
.then(reservation => console.log(reservation.workerName))

重定向函数

exports.handler = function(context, event, callback) {

console.log("context: ", context);
console.log("event: ", event);
const { CallSid, TaskSid} = event;
console.log('CallSid: ', CallSid);
console.log('TaskSid: ', TaskSid);
console.log('Executing redirect_conference');
return Response(
    callback,
    `<?xml version="1.0" encoding="UTF-8"?>
      <Response>
        <Say voice="woman">Thank you for your patience. You are now connecting with an agent</Say>
          <Dial>
            <Conference endConferenceOnExit="false">${TaskSid}</Conference>
          </Dial>
      </Response>`
  );
};

解决方案建议

方案1:修复friendlyName设置为CallSid的问题

你在assignmentCallback中设置friendlyName: call_sid无效,是因为TaskRouter的Reservation Update指令里的friendlyName字段仅用于内部标识,不会直接映射到Conference的friendlyName。正确做法是主动创建Conference资源,再将坐席和来电者接入:

const client = context.getTwilioClient();

// 1. 创建以CallSid为friendlyName的会议
const conference = await client.conferences.create({
  friendlyName: call_sid,
  statusCallback: "你的状态回调地址",
  statusCallbackMethod: "POST"
});

// 2. 更新Reservation,接入已创建的会议
const api_response = await client.taskrouter.v1.workspaces(WorkspaceSid)
.tasks(TaskSid)
.reservations(ReservationSid)
.update({
   instruction: 'conference',
   from: _from,
   conferenceSid: conference.sid, // 指定会议SID
   to: assigned_worker_uri,
   endConferenceOnExit: true,
   startConferenceOnEnter: false
})
.then(reservation => console.log(reservation.workerName));

后续重定向函数就可以用CallSid作为会议标识接入。

方案2:在重定向函数中获取TaskSid

如果坚持用TaskSid作为会议标识,有两种方式获取:

  1. 通过CallSid关联查询TaskSid:
    在重定向函数中,查询与当前CallSid绑定的Task(需确保Task的Attributes中包含call_sid字段):
    exports.handler = async function(context, event, callback) {
      const client = context.getTwilioClient();
      const { CallSid } = event;
    
      // 查询关联的Task
      const tasks = await client.taskrouter.v1.workspaces(context.WORKSPACE_SID)
        .tasks.list({
          evaluateTaskAttributes: `call_sid == "${CallSid}"`
        });
    
      const TaskSid = tasks.length > 0 ? tasks[0].sid : null;
    
      // 生成响应XML
      const response = `<?xml version="1.0" encoding="UTF-8"?>
        <Response>
          <Say voice="woman">感谢您的等待,现在为您连接坐席</Say>
            <Dial>
              <Conference endConferenceOnExit="false">${TaskSid || CallSid}</Conference>
            </Dial>
        </Response>`;
    
      callback(null, new Twilio.twiml.VoiceResponse().append(response));
    };
    
  2. 转IVR时主动传递TaskSid:
    坐席转IVR时,在跳转URL中携带TaskSid参数,重定向函数就能直接从event中读取。

总结

  • 将会议friendlyName设为CallSid可行,但需主动创建Conference资源,不能依赖Reservation Update的friendlyName字段
  • 重定向函数可通过CallSid关联查询TaskSid,或转IVR时主动传递参数获取TaskSid

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 04:39:19