当我在节点js中创建一个post调用时,为什么Watson-conversation正在为任何请求返回相同的默认响应

时间:2017-04-18 06:09:51

标签: javascript node.js ibm-watson watson-conversation watson

我已经在对话服务中创建了一个示例训练数据,现在我正在尝试使用节点js创建一个用于创建聊天应用程序的该服务的帖子调用。我创建了一个帖子调用并且它正在工作但不是预期的。它正在给我任何电话的默认回复。

我开始知道我们需要传递我们在下一次调用的响应中得到的上下文值来继续流程。但不知道如何做到这一点。有人可以帮助我。以下是我的代码

var express = require('express');
var conversationV1 = require('watson-developer-cloud/conversation/v1');
var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
    extended: false
}));
var conversation = new conversationV1({
    username: 'xxxxxx-1a06-4a90-xxxxx-xxxxxxxxxxx',
    password: 'xxxxxxxxxx',
    version_date: conversationV1.VERSION_DATE_2016_09_20
});
const updateMessage = (input, response) => {
    var responseText = null;
    if (!response.output) {
        response.output = {};
    } else {
        return response;
    }
    if (response.intents && response.intents[0]) {
        var intent = response.intents[0];
    if (intent.confidence >= 0.75) {
        responseText = 'I understood your intent was ' + intent.intent;
    } else if (intent.confidence >= 0.5) {
        responseText = 'I think your intent was ' + intent.intent;
    } else {
        responseText = 'I did not understand your intent';
    }
}
response.output.text = responseText;
return response;
};

app.post('/api/message', (req, res, next) => {
    const workspace = '254654de-2bfe-423a-92ec-6aa66620625a'; 
    if (!workspace || workspace === '<workspace-id>') {
        return res.json({
            output: {
                text: 'Please check the workspace'
            }
        });
    }
    const payload = {
        workspace_id: workspace,
        input: req.body.input || {},
        context: req.body.context || {}
    };

    // Send the input to the conversation service
    conversation.message(payload, (error, data) => {
        if (error) {
            return next(error);
        }
        return res.json(updateMessage(payload, data));
    });
});

app.listen(process.env.PORT || 3000);

exports.app = app

有人可以帮助我如何通过上下文使其工作。可以帮助。可以在本地运行代码进行测试。

2 个答案:

答案 0 :(得分:1)

每当您发布到api / message端点时,您都​​需要发送上下文。你第一次没有上下文。上下文将由Watson Conversation创建并返回,然后在此响应中返回:res.json(updateMessage(payload, data))

返回的JSON对象应该具有context属性。调用者需要存储该上下文,然后在下一次调用中将其发布。因此,调用者代码应该看起来像这样(伪代码):

第一次致电:

resp = POST api/message {}

商店背景:

ctxt = resp.context

下一个电话:

resp = POST api/message {context: ctxt}

商店背景(每次):

ctxt = resp.context

始终使用服务器返回的上下文更新调用方中的上下文。每当你有一个新用户时,你就会重新开始。

您没有为来电者显示任何代码,因此我不确定这是否是您的问题。

答案 1 :(得分:0)

我遇到了同样的问题。这就是我所做的:

app.post('/api/message', function (req, res) {
var workspace = process.env.WORKSPACE_ID || '<workspace-id>';
if (!workspace || workspace === '<workspace-id>') {
return res.json({
  'output': {
    'text': 'Config workspace'
  }
});
}

var context;

var payload = {
workspace_id: workspace,
context: {},
input: {}
};

if (req.body) {
if (req.body.input) {
  payload.input = req.body.input;
}
if (req.body.context) {
  // The client must maintain context/state
  payload.context = req.body.context;
}
}

conversation.message(payload, function (err, data) {
 if (err) {
   return res.status(err.code || 500).json(err);
 }
 context = data.context;
 return res.json(updateMessage(payload, data));

});
});

function updateMessage(input, response) {
var responseText = null;
if (!response.output) {
response.output = {};
} else {
return response;
}
if (response.intents && response.intents[0]) {
var intent = response.intents[0];
if (intent.confidence >= 0.75) {
  responseText = 'I understood your intent was ' + intent.intent;
} else if (intent.confidence >= 0.5) {
  responseText = 'I think your intent was ' + intent.intent;
} else {
  responseText = 'I did not understand your intent';
}
}
response.output.text = responseText;
return response;
}
module.exports = app;

如果您使用visual studio进行编码,那么您可以检查相同的上下文是否通过这些函数,只需单击 context 字即可。我不是专业人士,但它对我有用。祝你好运!