# 技能后处理

在我们通过交互模型拿到用户请求的语义结果后,需要对用户请求进行响应。

比如在查快递的技能中,我们拿到快递公司和单号的信息后,需要调用快递查询的接口,查询快递信息,并将结果反馈给用户。

对于进行信源访问,定制业务流程,与互联网通信等功能,我们都将在技能后处理中完成。

讯飞技能工作室提供云函数和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();
 })