如何在调用节点库的twilio函数中获取可用的工作线程数?

如何在调用节点库的twilio函数中获取可用的工作线程数?,twilio,twilio-functions,Twilio,Twilio Functions,我希望调用twilio函数并获得可用工人的数量 我觉得这可能与任务队列和匹配的可用工作人员有关 我想到了以下几点。但是,当用户与任务交互时,他们仍然被列为可用,这意味着这不一定有效 exports.handler = function (context, event, callback) { const client = require('twilio')(context.ACCOUNT_SID, context.AUTH_TOKEN); client.taskrouter .workspace

我希望调用twilio函数并获得可用工人的数量

我觉得这可能与任务队列和匹配的可用工作人员有关

我想到了以下几点。但是,当用户与任务交互时,他们仍然被列为可用,这意味着这不一定有效

exports.handler = function (context, event, callback) {
const client = require('twilio')(context.ACCOUNT_SID, context.AUTH_TOKEN);
client.taskrouter
.workspaces('eee')
.workers.list()
.then(workers => {
    data = {
        availWorkersCount: Object.keys(workers.filter(x=> x.available === true && x.attributes.includes("sales"))).length
    };

    const response = new Twilio.Response();
    response.appendHeader('Access-Control-Allow-Origin', '*');
    response.appendHeader('Access-Control-Allow-Methods', 'OPTIONS POST GET');
    response.appendHeader('Access-Control-Allow-Headers', 'Content-Type');
    response.appendHeader('Content-Type', 'application/json');
    response.setBody(data);

    callback(null, response);
});

})

我知道这有点晚了,但这是我在twilio函数中使用的代码块。我们从studio流调用该函数,并使用结果来决定是将呼叫路由到语音邮件中,还是播放一些IVR选项来选择应该放入的队列。要使用它,您可以输入一项可选技能,进一步过滤代理。我们抓住所有可用的工人,然后筛选出只有那些具备所需技能的工人

然后,您可以使用此选项并检查是否有任何可用的代理也分配了任务,然后将其从计数中删除

const fetch = require("node-fetch");

exports.handler = function(context, event, callback) {
    let response = new Twilio.Response();

    // Set the status code to 200 OK
    response.setStatusCode(200);

    // Set the Content-Type Header
    response.appendHeader('Access-Control-Allow-Origin', '*');
    response.appendHeader('Access-Control-Allow-Methods', 'OPTIONS, POST, GET');
    response.appendHeader('Access-Control-Allow-Headers', 'Content-Type');
    response.appendHeader('Content-Type', 'application/json');

    let body = {
        TotalAvailable: 0
    };
    
    let client = context.getTwilioClient();
    client.taskrouter.workspaces(context.WorkspaceSid)
        .workers
        .list({
            available: 'true',
            limit: 50
        })
        .then((workers) => {
            let agents = [];
            let i = 0;
            if(workers){
                for(i = 0; i < workers.length; i++){
                    let worker = workers[i];
                    let item = {};
                    let attributes = JSON.parse(worker.attributes);

                    if(attributes && attributes.routing && attributes.routing.skills && attributes.routing.skills.length > 0){
                        item.skills = attributes.routing.skills;
                        item.nid = attributes.nid;
                        item.first_name = attributes.first_name;
                        item.last_name = attributes.last_name;
                        
                        if(event.skill){
                            if(item.skills.includes(event.skill)){

                                // TODO: filter here 

                                agents.push(item);
                            }    
                        }else{
                            agents.push(item);
                        }
                    }
                }
            }
            body.TotalAvailable = agents.length;
            body.Agents = agents;

            response.setBody(body);
            callback(null, response);
        })
        .catch((ex) => {
            body.error = true;
            body.message = ex;
            response.setBody(body);
            callback(null, response);
        });
};
const fetch=require(“节点提取”);
exports.handler=函数(上下文、事件、回调){
let response=new Twilio.response();
//将状态代码设置为200 OK
响应。设置状态代码(200);
//设置内容类型标题
appendHeader('Access-Control-Allow-Origin','*');
appendHeader('Access-Control-Allow-Methods','OPTIONS,POST,GET');
appendHeader('Access-Control-Allow-Headers','Content-Type');
appendHeader('Content-Type','application/json');
让主体={
总数:0
};
让client=context.gettwillioclient();
client.taskrouter.workspaces(context.WorkspaceSid)
.工人
.名单({
可用:“true”,
限额:50
})
.然后((工人)=>{
让代理=[];
设i=0;
if(工人){
对于(i=0;i0){
item.skills=attributes.routing.skills;
item.nid=attributes.nid;
item.first\u name=attributes.first\u name;
item.last_name=attributes.last_name;
if(事件技能){
if(项目技能包括(事件技能)){
//TODO:在这里过滤
代理。推送(项目);
}    
}否则{
代理。推送(项目);
}
}
}
}
body.TotalAvailable=agent.length;
主体。代理人=代理人;
回应:主体(主体);
回调(空,响应);
})
.catch((ex)=>{
body.error=true;
body.message=ex;
回应:主体(主体);
回调(空,响应);
});
};

Twilio员工在这里。您是否检查了员工频道的
配置容量是多少()?如果您使用的是Flex,默认值是10个同时进行的短信/聊天对话和1个语音对话。当您说在与任务交互时工作人员仍然可用时,这是否包括语音呼叫的工作人员?此外,使用累积统计端点将允许您获得每个活动状态下的人员总数:@CharlieWeems,也许您可以编写一个答案,说明解决方案如何取决于容量?为简单起见,假设代理最多可以处理每个任务类型的1个任务。此外,我相信,无论任务类型如何,工人在响应任务时仍处于“可用”状态。我在这里的使用案例(更深入一点)是调用Studio中的twilio函数来检查可用工人。其想法是,如果没有可用的工人,则执行XYZ。否则,发送到flex。这使我能够为发起某种入站任务的客户优化结果。例如,WebChat,用户发起WebChat,没有可用的代理,为客户提供使用聊天机器人的能力。另一个例子是,使用initiates入站文本,没有可用的代理,允许聊天机器人回答问题。我不认为这仅限于这些任务类型。我相信所有渠道applyI都会建议使用TaskRouter本身来实现这一点。这正是它的用途,如果没有可用的工作人员,您可以让任务移动到另一个队列,并以不同的方式与它交互。