如何重置Twilio Autopilot流程?收集响应时取消流程问询
解决Twilio Autopilot Collect环节输入CANCEL直接跳转主任务的问题
我明白你遇到的痛点:本来想让用户输入CANCEL直接跳回主任务,但用onCollectAttempt的Webhook函数没生效,流程还是死磕收集操作。核心原因是Twilio Autopilot的Collect组件会优先执行输入验证逻辑,只有验证通过的输入才会触发on_collect_attempt——如果你的CANCEL不在允许的输入列表里,验证阶段就会直接拦截,根本轮不到你的函数执行。
下面给你两个可行的解决方案,按步骤来就能搞定:
方案1:调整Collect配置+优化Webhook函数
先把CANCEL加入Collect的允许输入列表,让它能通过验证触发Webhook,再在函数里判断并跳转:
第一步:修改Collect的JSON配置
在你的Collect组件里,给目标问题的validation添加allowed_inputs,把CANCEL包含进去:
{ "actions": [ { "collect": { "name": "your_collect_name", "questions": [ { "question": "请选择你的选项(1/2/3),输入CANCEL可取消操作", "name": "selected_option", "type": "Twilio.NUMBER", "validation": { "allowed_inputs": { "values": ["1", "2", "3", "CANCEL"] // 把CANCEL加入合法输入 }, "on_failure": { "messages": [ { "say": "抱歉,我没听懂,请输入1、2、3或者输入CANCEL取消操作" } ], "max_attempts": 3, "redirect": "task://greetings" } } } ], "on_complete": { "redirect": "task://next_task" }, "on_collect_attempt": { "webhook": { "url": "你的函数部署URL", "method": "POST" } } } } ] }
第二步:优化你的Webhook函数
把原来的if(true)改成判断输入是否为CANCEL,同时处理大小写问题:
exports.handler = function(context, event, callback) { // 统一转大写,避免大小写不匹配 const userInput = event.CurrentInput.trim().toUpperCase(); if (userInput === "CANCEL") { const responseObject = { "actions": [ { "redirect": "task://greetings" } ] }; callback(null, responseObject); } else { // 非CANCEL输入,让流程继续执行原有逻辑 callback(null, {}); } };
方案2:用自定义验证函数直接控制流程
如果想更灵活,直接把验证逻辑全放到自定义函数里,跳过Collect自带的验证规则,完全自定义输入处理:
第一步:修改Collect的validation为Webhook
{ "actions": [ { "collect": { "name": "your_collect_name", "questions": [ { "question": "请选择你的选项(1/2/3),输入CANCEL可取消操作", "name": "selected_option", "type": "Twilio.NUMBER", "validation": { "webhook": { "url": "你的验证函数URL", "method": "POST" }, "on_failure": { "messages": [ { "say": "抱歉,我没听懂,请输入1、2、3或者输入CANCEL取消操作" } ], "max_attempts": 3, "redirect": "task://greetings" } } } ], "on_complete": { "redirect": "task://next_task" } } } ] }
第二步:编写验证函数
这个函数可以直接判断输入,要么跳转主任务,要么验证正常选项:
exports.handler = function(context, event, callback) { const userInput = event.CurrentInput.trim().toUpperCase(); const questionName = event.QuestionName; // 优先判断CANCEL,直接跳转 if (userInput === "CANCEL") { callback(null, { "actions": [ { "redirect": "task://greetings" } ] }); return; } // 处理正常选项的验证 const validOptions = ["1", "2", "3"]; if (validOptions.includes(userInput)) { // 输入有效,返回验证成功 callback(null, { "valid": true, "value": userInput, "key": questionName }); } else { // 输入无效,返回验证失败提示 callback(null, { "valid": false, "message": "抱歉,我没听懂,请输入1、2、3或者输入CANCEL取消操作" }); } };
关键提醒
- 一定要注意验证顺序:Autopilot先执行Collect的
validation,再触发on_collect_attempt,所以CANCEL必须能通过验证,你的Webhook才有机会执行。 - 处理输入时统一转成大写/小写,避免用户输入
cancel或Cancel导致识别失败。
内容的提问来源于stack exchange,提问作者adventure_galley
相关产品推荐
相关产品推荐

