当与Twitter API结合使用时,如何在Watson对话API中传递response.context?
我的想法是,我将使用Twitter的流媒体api获取我账户的最新信息,将这些数据提供给watson Conva api,并让watson给出回复;然后我会再次回复推特,回复提到我的人。为了让watson Conva api正常工作,我必须将response.context传递回watson 我把所有的东西都记下来了,除了传递回response.context部分。有人知道怎么做吗当与Twitter API结合使用时,如何在Watson对话API中传递response.context?,twitter,ibm-cloud,ibm-watson,watson-conversation,Twitter,Ibm Cloud,Ibm Watson,Watson Conversation,我的想法是,我将使用Twitter的流媒体api获取我账户的最新信息,将这些数据提供给watson Conva api,并让watson给出回复;然后我会再次回复推特,回复提到我的人。为了让watson Conva api正常工作,我必须将response.context传递回watson 我把所有的东西都记下来了,除了传递回response.context部分。有人知道怎么做吗 var twitter = require('../statics/twitterAPI_KEY_Dev'); va
var twitter = require('../statics/twitterAPI_KEY_Dev');
var watson = require('../statics/watsonAPI_KEY_Dev');
function botReplyInit() {
var stream = twitter.stream('statuses/filter', { track: '@Felicia_Bot' });
stream.on('tweet', function(tweet) {
var dataProcessed = false;
var data;
if (!dataProcessed) {
var data = tweet.text.replace(/@(\w+)/g, '').replace(/#(\w+)/g, '');
//cleans up the tweet so the @ and # are deleted
}
var username = tweet.user.screen_name;
var statusID = tweet.id_str;
var endConversation = false;
var error = {};
var res = { output: {}, intents: [] };
processWatson(error, res);
//how do we move this intialization outside of the stream.on function so it only
//get called once in the entire lifetime of the app??
function processWatson(err, response) {
if (err) {
console.log(err);
}
if (response.output.action === 'end_conversation') {
endConversation = true;
}
if (response.intents.length > 0) {
var result = '@' + username + ' ' + response.output.text[0];
twitter.post('statuses/update', {
status: result,
in_reply_to_status_id: tweet.id_str
},
function(err, response) {
if (err) {
console.log(err);
return;
}
else {
console.log('I posted ' + result);
}
});
}
if(!endConversation && !dataProcessed) {
watson.message({
input: { text: data },
context: response.context
},
processWatson);
dataProcessed = true;
}
}
})
}
botReplyInit();
有关Watson对话服务的消息方法,请参阅API文档- 来自消息的响应包含上下文对象,这是在后续调用消息API时返回服务所需的对象。会话初始化时不需要上下文对象
您的应用程序需要跟踪上下文对象,如果要允许多个同时对话,则需要能够将上下文对象映射到对话。我同意您的说法。我重写了代码,以便返回response.context。其思想是,一旦沃森回调函数初始化一次,它就再也不会初始化;api调用在回调函数中,因此当有应答时,它将循环返回。但是,这不起作用,因为我的watson初始化调用在stream.on的回调函数中,所以每次有新的tweet,即使上下文被传回,再次调用watson的初始化调用,以便清除传递回的上下文。如果我将watson初始化函数调用留在stream.on之外,我将无法调用它,因为它是在stream.on内部定义的。如果我将stream.on包装在watson回调函数中,它将创建一个无限循环的stream.on调用,该调用不会停止。创建一个对象以将上下文保存在stream.on之外,并将其初始化为null对象。然后将对象传递给每个对话调用,包括对话开始,允许响应更新它。Ohhhh然后每次我都会将第二个(真实)对话调用的上下文引用到该对象?真是天才!!