如何从 AWS lex 中的意图 A 调用意图 B?
How to call Intent B from intent A in AWS lex?
我正在研究 aws lex
我有一个意图-A。我把它命名为welcomeMsg
。我想从 intent-A
呼叫另一个 intent(B)
。欢迎msg(intent-A)
,它会说:
> `"Hi, I am a xxx-BOT. i can help you with following:`
A
B
C
如果我说 B,它应该转到 intent-B。这是我想做的,但我无法实现。 python 代码中的任何帮助将不胜感激。
我找到了这 3 种从 intent-A 调用 intent-B 的方法。
第一种方法(使用 ConfirmIntent):
def confirm_intent(session_attributes, intent_name, slots, message):
return {
'sessionAttributes': session_attributes,
'dialogAction': {
'type': 'ConfirmIntent',
'intentName': intent_name,
'slots': slots,
'message': {
'contentType': 'PlainText',
'content': message
}
}
}
msg = "Hi, I am a xxx-BOT. i can help you with following: A B C"
return confirm_intent(output_session_attributes, 'intent-B', new_slot, msg)
第二种方法(假装是 Lex 并调用 Lambda 方法):
client = boto3.client('lambda')
data = {'messageVersion': '1.0', 'invocationSource': 'FulfillmentCodeHook', 'userId': '###',
'sessionAttributes': {}, 'requestAttributes': None,
'bot': {'name': '###', 'alias': '$LATEST', 'version': '$LATEST'},
'outputDialogMode': 'Text',
'currentIntent': {'name': '###', 'slots': {'###': '###'},
'slotDetails': {'###': {'resolutions': [], 'originalValue': '###'}},
'confirmationStatus': 'None'},
'inputTranscript': '###'}
response = client.invoke(
FunctionName='{intent-B_lambda_function}',
InvocationType='RequestResponse',
Payload=json.dumps(data)
)
output = json.loads(response['Payload'].read())['dialogAction']['message']['content']
第三种方法(使用 ElicitSlot):
def elicitSlot(sessionAttributes, intentName, slots, slotToElicit, message):
return {
sessionAttributes,
dialogAction: {
type: 'ElicitSlot',
intentName,
slots,
slotToElicit,
message,
}
}
intentRequest['currentIntent']['name'] = 'intent-B'
param1 = {
slot-B:null
}
intentRequest['currentIntent']['slots'] = param1
return elicitSlot(outputSessionAttributes, 'intent-B', intentRequest['currentIntent']['slots'], 'slot-B', 'some_message')
一定要检查这些方法,使用它们并根据需要进行调整。我认为方法 1 最适合您的需要,而且最简单。
如果您 运行 遇到一些问题,请发表评论。
希望对您有所帮助。
我正在研究 aws lex
我有一个意图-A。我把它命名为welcomeMsg
。我想从 intent-A
呼叫另一个 intent(B)
。欢迎msg(intent-A)
,它会说:
> `"Hi, I am a xxx-BOT. i can help you with following:`
A
B
C
如果我说 B,它应该转到 intent-B。这是我想做的,但我无法实现。 python 代码中的任何帮助将不胜感激。
我找到了这 3 种从 intent-A 调用 intent-B 的方法。
第一种方法(使用 ConfirmIntent):
def confirm_intent(session_attributes, intent_name, slots, message):
return {
'sessionAttributes': session_attributes,
'dialogAction': {
'type': 'ConfirmIntent',
'intentName': intent_name,
'slots': slots,
'message': {
'contentType': 'PlainText',
'content': message
}
}
}
msg = "Hi, I am a xxx-BOT. i can help you with following: A B C"
return confirm_intent(output_session_attributes, 'intent-B', new_slot, msg)
第二种方法(假装是 Lex 并调用 Lambda 方法):
client = boto3.client('lambda')
data = {'messageVersion': '1.0', 'invocationSource': 'FulfillmentCodeHook', 'userId': '###',
'sessionAttributes': {}, 'requestAttributes': None,
'bot': {'name': '###', 'alias': '$LATEST', 'version': '$LATEST'},
'outputDialogMode': 'Text',
'currentIntent': {'name': '###', 'slots': {'###': '###'},
'slotDetails': {'###': {'resolutions': [], 'originalValue': '###'}},
'confirmationStatus': 'None'},
'inputTranscript': '###'}
response = client.invoke(
FunctionName='{intent-B_lambda_function}',
InvocationType='RequestResponse',
Payload=json.dumps(data)
)
output = json.loads(response['Payload'].read())['dialogAction']['message']['content']
第三种方法(使用 ElicitSlot):
def elicitSlot(sessionAttributes, intentName, slots, slotToElicit, message):
return {
sessionAttributes,
dialogAction: {
type: 'ElicitSlot',
intentName,
slots,
slotToElicit,
message,
}
}
intentRequest['currentIntent']['name'] = 'intent-B'
param1 = {
slot-B:null
}
intentRequest['currentIntent']['slots'] = param1
return elicitSlot(outputSessionAttributes, 'intent-B', intentRequest['currentIntent']['slots'], 'slot-B', 'some_message')
一定要检查这些方法,使用它们并根据需要进行调整。我认为方法 1 最适合您的需要,而且最简单。
如果您 运行 遇到一些问题,请发表评论。
希望对您有所帮助。