通过编程创建的任务属性未显示在Twilio Flex中

通过编程创建的任务属性未显示在Twilio Flex中,twilio,twilio-api,twilio-programmable-chat,twilio-functions,Twilio,Twilio Api,Twilio Programmable Chat,Twilio Functions,我正在试验Twilio Flex。我们试图构建的是一个聊天(bot)应用程序,它集成了两个或三个参与者(user+cc-human-agent+chabot与user+cc-human-agent) 我能够加入Twilio聊天频道(来自基于Node.js启动的应用程序的web应用程序和利用npm包Twilio聊天的服务器端代码)。然后,我使用以下代码创建Flex任务: let task = await twilioClient.taskrouter.workspaces(TWILIO_FLEX_

我正在试验Twilio Flex。我们试图构建的是一个聊天(bot)应用程序,它集成了两个或三个参与者(user+cc-human-agent+chabotuser+cc-human-agent

我能够加入Twilio聊天频道(来自基于Node.js启动的应用程序的web应用程序和利用npm包Twilio聊天的服务器端代码)。然后,我使用以下代码创建Flex任务:

let task = await twilioClient.taskrouter.workspaces(TWILIO_FLEX_WORKSPACE)
  .tasks.create({attributes: JSON.stringify({
    type: 'support',
    message: 'some message from chat here'
  }),
  workflowSid: TWILIO_FLEX_CHAT_WORKFLOW,
  taskChannel: 'chat'
})
任务已成功创建并在Twilio Flex agent仪表板中弹出,但当我接受它时:

  • 聊天选项卡完全为空

  • “信息”选项卡仅包含一般信息,例如:

    TASK CONTEXT
    Task type
    chat
    
    Task created on
    Wed Jan 23 2019 16:01:36 GMT+0100 (Central Europe Standard Time)
    
    Task priority
    0
    
    Task queue
    Everyone
    
    CUSTOMER CONTEXT
    Customer name / phone number
    Anonymous
    
    Country
    ADDONS
    No add-ons enabled. To expand your experience, visit Twilio Marketplace
    
  • 我的自定义属性(类型/消息)根本不包括在内

    我找不到任何将flex与twilio chat结合使用的复杂示例,这里只是一个非常通用(并且没有过度解释)的高级概述:

    有人有将聊天(不一定是Twilio聊天)与Twilio Flex集成的经验吗

  • 如何正确创建任务轮转器任务,以便显示消息 在聊天室和自定义属性是否在信息选项卡上可见
  • 如何在Flex聊天窗口中实现该代理的响应将被路由回现有的 聊天
  • 如何实现后续用户消息将路由到现有 弹性任务,而不是创建新任务?换句话说,如何 跟踪chat和Flex之间的对话

  • 有没有人有代码片段显示了在从Twilio控制台中删除并替换为Twilio代理服务集成之前,最初的“Flex Create Chat”Twilio功能的样子


  • 我正在尝试做类似的事情(可编程聊天,Twilio Flex),以下是让我进入工作状态的原因:

  • 我没有手动创建任务,而是选择了初始化Flex时获得的默认Studio流。我从这开始,但它只给出了一个理论上的理解。我通过使用和跟踪webhook创建的通道,找到了实际的webhook
  • 每当web/移动客户端想要聊天时,我都会调用我的自定义端点来执行所需的设置
  • //创建Twilio可编程聊天频道后,设置Studio webhook
    app.post(“/create task”),函数(请求、响应){
    //请参阅下面的完整代码
    聊天服务频道
    .创造({
    //请参阅下面的完整代码
    })
    。然后(频道=>{
    const webhookUrl=channel.links.webhooks;
    常量选项={
    网址:webhookUrl,
    方法:“张贴”,
    认证:{
    用户:accountSid,
    通行证:authToken
    },
    表格:{
    类型:“工作室”,
    “Configuration.FlowSid”:twillioflowsid
    }
    };
    返回新承诺((解决、拒绝)=>{
    post(选项、函数(错误、响应、正文){
    如果(!错误){
    解析(通道);
    }否则{
    拒绝(错误);
    }
    });
    });
    });
    //请参阅下面的完整代码
    });
    
  • 那只会让你半途而废。到现在为止,您应该看到Flex中出现了一个任务,但如果代理接受了它,他就无法回复消息,也看不到来自客户端的消息。我想当你在Twilio小部件上做这件事的时候,会有一些魔力 我发现,对于我作为代理接受任务时手动创建的通道,代理不会加入通道。所以参与者的数量是1而不是2

    这意味着代理基本上无法查看通道数据并向其发送消息。也许我的频道在属性中缺少了一些元数据,但我还没弄清楚

    我所做的是在任务状态更改时使用您得到的,特别是,我使用
    reservation.accepted
    事件手动将代理添加为频道的成员。您可以在底部的TaskRouter设置下添加回调

    app.post(“/accept task callback”),函数(请求、响应){
    const{tasktattributes,WorkerSid,WorkerName,EventType}=request.body;
    const{channelSid}=JSON.parse(TaskAttributes);
    日志(“接收到的事件”,EventType);
    if(EventType!=“预订.已接受”){
    回复。发送(“确定”);
    返回;
    }
    log(“添加成员”、WorkerSid、WorkerName、“事件上”、EventType);
    聊天室
    .channels(channelSid)
    .members.create({identity:WorkerName})
    。然后(成员=>{
    回复.发送({
    指示:“接受”
    });
    })
    .catch(错误=>{
    控制台错误(error);
    回复.发送({
    说明:“拒绝”
    });
    });
    });
    
    这是一个完整的代码

    //这是Express应用程序
    app.post(“/create task”),函数(请求、响应){
    const accountSid=process.env.TWILIO\u ACCOUNT\u SID;
    const authToken=process.env.TWILIO\u AUTH\u令牌;
    const workspaceSid=process.env.TWILIO\u WORKSPACE\u SID;
    const workflowSid=process.env.TWILIO\u工作流\u SID;
    const twillioflowsid=“FW…”
    //启动对话的Twilio可编程聊天用户的身份。您可以通过登录或其他方式获得该身份
    const username=request.body | |“Nancy Drew Support”;
    聊天服务频道
    .创造({
    类型:“私有”,
    friendlyName:用户名,
    属性:JSON.stringify({
    状态:“活动”,
    发件人:用户名,
    频道类型:“网络”
    })
    })
    。然后(频道=>{
    const webhookUrl=channel.links.webhooks;
    常量选项={
    网址:webhookUrl,
    方法:“张贴”,
    认证:{
    用户:accountSid,
    通行证:authToken
    },
    表格:{
    类型:“工作室”,
    “Configuration.FlowSid”:twillioflowsid
    }
    };
    返回新承诺((解决、拒绝)=>{
    post(选项、函数(错误、响应、正文){
    如果(!错误){
    解析(通道);
    }否则
    拒绝(错误);
    }
    }