自定义编程
更新时间:2020-03-25
考虑到业务的复杂需求,TaskFlow还为大家提供了节点编程机制,编程语言为Python,目前支持2.7.3版本。 支持节点编程机制的包括:
- 连线
- 对话答复节点
- 资源调用节点
- 自定义节点
编程变量
TaskFlow为大家预置了编程变量,方便大家的使用。
-
获取机器人请求参数的变量。
- 变量名称:svc_request
- 该变量支持获取session_id和本轮的用户query。
-
包含如下操作:
操作 类型 说明 svc_request.request.query string 本轮的用户输入query svc_request.session_id string 当前session的id -
使用示例
#判断是否为首轮 if svc_request.session_id == '': return True #根据用户输入进行判断 if svc_request.request.query == '你好': pass elif '你好' in svc_request.request.query: pass
-
获取技能的解析结果
- 变量名称:slu_results
- 该变量支持获取技能的意图和词槽结果。
-
包含如下操作:
操作 类型 含义 slu_results[skill_id] dict 根据技能id获取技能解析结果 slu_results[skill_id].intent string 技能的意图解析结果,无结果时为空字符串 slu_results[skill_id].slots list 技能词槽结果 slu_results[skill_id].slots[i].name string 技能词槽结果中的词槽名 slu_results[skill_id].slots[i].original_word string 技能词槽结果中的原始值 slu_results[skill_id].slots[i].normalized_word string 技能词槽结果中的归一化值 slu_results[skill_id].has_slots(slot_name) bool 判断是否存在某个词槽,slot_name为具体的词槽名 slu_results[skill_id].get_slots(slot_name) list 根据词槽名获取词槽结果,不存在返回空list slu_results[skill_id].get_slots(slot_name)[i] object 获取同一词槽名下的某一个词槽,结构和用法与slu_results[skill_id].slots[i]相同 - 使用示例
#获取单个技能结果并对意图词槽进行判断 skill_id = '12345' slu_res = slu_results[skill_id] if slu_res.intent == 'ROUTE': pass if slu_res.has_slots('user_arrival'): target_slots = slu_res.get_slots('user_arrival') if target_slots and target_slots[0].original_word in ['北京', '上海']: pass for slot in slu_res.slots: if slot.name == 'user_arrival': pass if slot.name == 'user_start' and slot.original_word == '北京': pass #判断是否所有技能结果均为空 for skill_id, skill_res in slu_results.items(): if skill_res.intent != '': return False return True
-
机器人当前包含的词槽列表
- 变量名称:svc_slots
- 该变量支持获取机器人的词槽结果。
- 包含如下操作:
操作 类型 说明 svc_slots.has_slots(slot_name, original_word='', normalized_word='') bool 判断机器人词槽结果中是否包含特定词槽 svc_slots.get_slots(slot_name) list 根据词槽名获取机器人词槽结果,不存在返回空list svc_slots.add(slot_name, original_word, normalized_word='') object 新增一个机器人词槽 svc_slots.remove(slot_name) object 删除一个机器人词槽 - 使用示例
#对机器人词槽进行判断 if svc_slots.has_slots('user_arrival', '北京'): pass target_slots = svc_slots.get('user_arrival') if target_slots and len(target_slots[0].normalized_word) >= 8: pass #新增一个机器人词槽 new_slot = svc_slots.add('user_arrival', '北京', '北京') new_slot.normalized_word = '北平' #删除机器人词槽 svc_slots.remove('user_arrival')
-
机器人的应答动作
- 变量名称:action_list
- 该变量支持处理机器人的应答动作。
-
包含如下操作:
操作 类型 说明 action_list.add(action_id='', say='') object 新增一个机器人应答动作,返回值为新增的对象实例 - 使用示例
#新增一个应答动作 new_action = action_list.add('route_satisfy', '为您导航') #新增一个应答动作 new_action = action_list.add() new_action.action_id = 'route_satisfy' new_action.say = '呵呵'
-
全局变量
- 变量名称:svc_vars
- 该变量为字典(dict)类型,控制全局变量的增删改查。
- 参考Python字典类型的操作语法。
- 使用示例
#新增一个全局变量 if 'test_var' not in svc_vars: svc_vars['test_var'] = 0 #查看一个变量的值 svc_vars.get('test_var') #删除一个全局变量 svc_vars.pop('test_var')
节点示例
我们将示例项目中,取快递的流程用编程方式新增了一条流程。 注:编程节点流程因为优先级最低,对话流程会被优先级为1的流程处理,仅供开发者参考,也可以自己修改入口连线的条件。
- 取快递入口连线
def condition():
if '1010204' in slu_results and slu_results['1010204'].intent == 'EXPRESS_DELIVERY':
return True
return False
- 资源调用
def process():
requrl = 'http://api.k780.com/?app=life.time&appkey=47834&sign=5f4452a33ef126dcfe324f26dfbd2321&format=json'
req_data = ''
try:
res_data = requests.get(requrl, data = req_data, verify = False)
res_str = res_data.text.strip()
res_json = json.loads(res_str)
svc_vars['datetime'] = res_json['result']['datetime_2']
except:
pass
- 对话答复节点
def process():
if 'datetime' in svc_vars:
say = '好的,您可以先放到收发室,我会通知主人' + str(svc_vars['datetime']) + '有个快递来电,让他看下这通电话。'
else:
say = '好的,您可以先放到收发室,我会通知主人有个快递来电,让他看下这通电话。'
action_list.add('express_delivery_satisfy', say)
- 获取个人信息连线
def condition():
if '1010204' in slu_results and slu_results['1010204'].intent == 'GET_USER_INFO':
return True
return False