如何在不提示 Lex 中的用户的情况下调用另一个意图?
How to call another intent without prompting to user in Lex?
是否可以在不提示用户的情况下从 intent-A 的 lambda 函数触发 intent-B?
假设用户输入了一些东西并且一个 intent-A 被触发,经过一些处理我想触发一些其他的 intent 即 intent-B.
用户也可以通过特定的话语直接触发intent-B。
感谢您的帮助。
是的,这是可能的。从 Intent-A 的 lambda 中,您可以编写以下代码:
intentRequest.currentIntent.name='Intent-B';
var param1={
slot-B:null
};
intentRequest.currentIntent.slots=param1;
callback(elicitSlot(outputSessionAttributes, 'Intent-B', intentRequest.currentIntent.slots, 'slot-B'));
下面是 elicitSlot 的函数
function elicitSlot(sessionAttributes, intentName, slots, slotToElicit, message) {
return {
sessionAttributes,
dialogAction: {
type: 'ElicitSlot',
intentName,
slots,
slotToElicit,
message,
},
};
}
我最终执行了以下操作,从 intent-A 调用 intent-B 而没有向用户提示任何内容:
- 向您的调用 lambda 函数授予调用 lambda 函数的权限,即 intent-A 的 lambda 函数
- 获取intent-B的后端lambda函数名
- 使用 boto3
使用所有输入调用该 lambda 函数
- 响应将在响应对象的'Payload'键中
- 使用 read() 方法获取响应
- 在 ['dialogAction']['message']['content']
中获取实际输出
- return 使用默认的 close() 方法
导入 boto3
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']
是否可以在不提示用户的情况下从 intent-A 的 lambda 函数触发 intent-B?
假设用户输入了一些东西并且一个 intent-A 被触发,经过一些处理我想触发一些其他的 intent 即 intent-B.
用户也可以通过特定的话语直接触发intent-B。
感谢您的帮助。
是的,这是可能的。从 Intent-A 的 lambda 中,您可以编写以下代码:
intentRequest.currentIntent.name='Intent-B';
var param1={
slot-B:null
};
intentRequest.currentIntent.slots=param1;
callback(elicitSlot(outputSessionAttributes, 'Intent-B', intentRequest.currentIntent.slots, 'slot-B'));
下面是 elicitSlot 的函数
function elicitSlot(sessionAttributes, intentName, slots, slotToElicit, message) {
return {
sessionAttributes,
dialogAction: {
type: 'ElicitSlot',
intentName,
slots,
slotToElicit,
message,
},
};
}
我最终执行了以下操作,从 intent-A 调用 intent-B 而没有向用户提示任何内容:
- 向您的调用 lambda 函数授予调用 lambda 函数的权限,即 intent-A 的 lambda 函数
- 获取intent-B的后端lambda函数名
- 使用 boto3 使用所有输入调用该 lambda 函数
- 响应将在响应对象的'Payload'键中
- 使用 read() 方法获取响应
- 在 ['dialogAction']['message']['content'] 中获取实际输出
- return 使用默认的 close() 方法
导入 boto3
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']