wit.ai runActions如何处理后续消息中的上下文

时间:2017-04-14 14:46:41

标签: node.js wit.ai

我使用node-wit开发聊天机器人应用程序。 这主要是很好用的,但是我在使用上下文时遇到了问题。

我正在使用runActions api:

       this.witClient.runActions(customer._key, messageText, witContext).then((newContext => {}
)).catch(reject);

我已经定义了许多设置上下文的操作。

这很好,只要上下文发生在一条消息上。 例如,如果我要调用名为addProduct的操作:

addProduct({sessionId, context, text, entities}) {

                return new Promise((resolve, reject) => {

                            context.product = `myNewProduct';
                            resolve(context);

                });
            },

然后会使用'产品'上下文密钥。

然而,当我尝试使用它超过2条消息时,似乎已经丢失了上下文(例如,在询问多项选择问题,然后处理该响应时)。

如果我理解它是如何正常工作的,那么node-wit并不会将上下文保留在消息之外(我最初假设这是因为我传递会话密钥)。

我看到的解决方案是以会话/用户特定的方式存储结果上下文(在这种情况下为newContext),然后在用户发送新消息时将其恢复并再次传递。

含义,如下:

witContext = getContextFromSession();
this.witClient.runActions(customer._key,messageText,witContext).then((newContext => {setContextInSession(newContext)}     ))赶上(拒绝);

这是处理它的正确方法吗?

1 个答案:

答案 0 :(得分:0)

当然,您必须存储上下文状态,然后决定如何存储它。但是,如果你有很多用户,并且你的资源可用,那么考虑一下最有效的方法是什么。

正如您在nodeJs的官方示例中所看到的,https://github.com/wit-ai/node-wit/blob/master/examples/messenger.js上有一个名为findOrCreateSession的方法,它们会在调用机智动作之前获得会话。

在我的特定情况下,我将它存储在数据库中,所以我在调用操作之前得到会话,因此我可以发送上下文,然后在我再次查询会话的操作中修改结果上下文和存储再次,根据您的需求尝试最佳实施。