Lex chat bot error: Reached second execution of fulfillment lambda on the same utterance

Lex chat bot error: Reached second execution of fulfillment lambda on the same utterance

我已阅读 Lex Docs on Responses
我搜索并发现:
- 未答复 question on same error.
- 未回复 similar question but in Python.
- 未回答 similar question in Amazon Dev Forum.

所以我的问题仍然存在。导致什么/如何修复 Lex 聊天机器人中的此错误:

An error has occurred: Invalid Lambda Response:
Reached second execution of fulfillment lambda on the same utterance

错误仅在尝试使用 Delegate 响应时发生。这是我的代表响应的 AWS lambda (node.js 6.10) 代码:

exports.handler = (event, context, callback) => {
    try {
        intentProcessor(event,
            (response) => {
                callback(null, response);
            });
    } catch (err) {
        callback(err);
    }
};

function intentProcessor(intentRequest, callback) {
     respond = delegate(sessionAttributes,intentRequest['currentIntent']['slots']);
     callback(respond);
}

function delegate(sessionAttributes, slots){
    return {
        sessionAttributes,
        dialogAction: {
            type: "Delegate",
            slots
        }
    };
}

我已确认响应按文档的最低要求按预期返回,即 sessionAttributes 和 DialogAction:类型和插槽。插槽按预期返回 null。

其他可能相关的信息:
- 意图有多个表达。
- 意图有多个插槽。
- None 个插槽是必需的。

非常感谢任何关于可能导致此错误的建议或信息!

我猜你是在 FulfillmentCodeHook 中调用 delegate()。当调用委托时,这意味着

Lambda function directs Amazon Lex to choose the next course of action

现在,Lambda 函数中有两个动作,DialogCodeHookFulfillmentCodeHook。如果你在 DialogCodeHook 中,那么 delegate 会调用 FulfillmentCodeHook。但是如果你在 FulfillmentCodeHook 中,那么它会抛出一个错误。

但是,如果您在 FulfillmentCodeHook 中,并且由于某种原因您想修改任何 slot 的值,那么您可以将 slot 的值设置为 null 然后调用传递新插槽集的委托。这样,delegate 就会再次调用 DialogCodeHook。

来自 AWS 文档:

If the value of the field is unknown, you must set it to null. You will get a DependencyFailedException exception if your fufillment function returns the Delegate dialog action without removing any slots.

希望对您有所帮助。