# 技能后处理
在我们通过交互模型拿到用户请求的语义结果后,需要对用户请求进行响应。
比如在查快递的技能中,我们拿到快递公司和单号的信息后,需要调用快递查询的接口,查询快递信息,并将结果反馈给用户。
对于进行信源访问,定制业务流程,与互联网通信等功能,我们都将在技能后处理中完成。
讯飞技能工作室提供云函数和webhook的方式实现技能后处理。
# 技能云函数
云函数是讯飞技能工作室提供的在线代码编辑器,开发者可以通过云函数提供的内置函数存储多轮对话,开发者可以在技能云函数中调用信源,处理业务逻辑,填写技能的回复 answer,通过 HTTP 请求通信。
目前支持的运行环境为 NodeJS ,技能云函数的详细接口设计请参考技能后处理章节。
我们在函数中通过 dialogState
判断填槽对话的状态是否完成,当填槽对话未完成时,开发者不做任何操作,交由系统自动处理,当填槽对话完成时,开发者拼接了一句 answer
回复给开发者。
示例代码如下:
AIUI.create("v2", function(aiui, err){
//打印 request 结构体
requestObject = aiui.getRequest().getObject();
console.log(requestObject);
//获取 response 对象
var response = aiui.getResponse();
// 获取填槽对话状态
dialogState= requestObject.request.dialogState;
if(dialogState!=null&&dialogState!="COMPLETED"){
// 填槽对话未完成时,托管给系统管理
response.addDelegateDirective();
}else{
// 填槽对话完成时,回复用户一句 answer
updatedIntent = aiui.getUpdatedIntent();
companyValue = updatedIntent.getSlotValue("company");
numberValue = updatedIntent.getSlotValue("number");
answer="你的"+companyValue+"快递,快递单号是是:"+numberValue+",已经达到合肥市"
esponse.setOutputSpeech(answer);
}
// 提交
aiui.commit();
})
TIP
如果您不会编写代码,但是想为您的技能增加回复,只需要把以下代码复制进入代码编辑框,修改第12行之后,保存并构建即可。
AIUI.create("v2", function(aiui, err){
requestObject = aiui.getRequest().getObject();
var response = aiui.getResponse();
// 获取当前意图名
intentName = requestObject.request.intents[0].name;
console.log("本次意图来自:"+intentName);
// 获取填槽对话状态
dialogState= requestObject.request.dialogState;
if(dialogState!=null&&dialogState!="COMPLETED"){
response.addDelegateDirective();
}else{
response.setOutputSpeech("这里修改成您想要的回复");
}
aiui.commit();
})
TIP
如果您想根据 intent 回复不同的 answer,可以使用以下代码。
AIUI.create("v2", function(aiui, err){
requestObject = aiui.getRequest().getObject();
var response = aiui.getResponse();
// 获取当前意图名
intentName = requestObject.request.intents[0].name;
console.log("本次意图来自:"+intentName);
// 获取填槽对话状态
dialogState= requestObject.request.dialogState;
if(dialogState!=null&&dialogState!="COMPLETED"){
response.addDelegateDirective();
}else if(intentName==="这里填写intent A 的名称"){
response.setOutputSpeech("这里是是 intent A的回复");
}else if(intentName==="这里填写intent B 的名称"){
response.setOutputSpeech("这里是是 intent B的回复");
}else if(intentName==="这里填写intent C 的名称"){
response.setOutputSpeech("这里是是 intent C的回复");
}else{
response.setOutputSpeech("这里是一个默认回复");
};
aiui.commit();
})