You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Botkit Middleware中sendToWatson无法更新对话上下文的问题排查

Botkit Middleware集成Watson时上下文无法更新的解决方案

首先,你的代码里有一个关键错误导致上下文无法更新:checkBalance函数创建了包含新值的contextDelta,但最终返回的却是原始上下文,而非这个增量对象。

步骤1:修正checkBalance函数

把函数里的回调参数从context改成contextDelta,这样才能将需要更新的上下文值传递给中间件:

function checkBalance(context, callback) { 
  var contextDelta = { user_name: 'Henrietta', fname: 'Pewdiepie' }; 
  callback(null, contextDelta); // 传递增量对象而非原始上下文
}

这一步是核心,只有返回正确的上下文增量,Watson才能收到需要更新的字段值。

步骤2:无需在Watson JSON编辑器中使用<?contextDelta.fname?>语法

你提到的这种语法是用于在Watson对话节点内部引用上下文变量的,但在这里并不需要。当你把contextDelta传入watsonMiddleware.sendToWatsonAsync时,中间件会自动将这些增量值合并到Watson现有的对话上下文中,后续对话会直接使用更新后的上下文,不需要在对话节点里额外配置。

步骤3:验证上下文是否更新成功

可以在代码中添加日志,确认Watson返回的上下文已经被更新:

checkBalanceAsync(message.watsonData.context).then(function (contextDelta) {
  console.log("contextDelta: " + JSON.stringify(contextDelta));
  return watsonMiddleware.sendToWatsonAsync(bot, newMessage, contextDelta);
}).then(function(watsonResponse) {
  // 打印Watson返回的更新后上下文
  console.log("更新后的Watson上下文: " + JSON.stringify(watsonResponse.context));
  return processWatsonResponse(bot, newMessage);
}).catch(function (error) {
  newMessage.watsonError = error;
});

通过日志可以直观看到上下文是否已经包含了你设置的user_name和fname值。

额外注意事项

  • 确保Promise.promisify正确处理了checkBalance函数(如果使用Node.js内置工具,需要引入util.promisify;如果是第三方库如Bluebird,要确保已正确初始化)。
  • 克隆message对象时,建议使用深克隆(比如JSON.parse(JSON.stringify(message))或者专门的克隆工具),避免嵌套属性丢失导致上下文传递异常。

内容的提问来源于stack exchange,提问作者Xirb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:20:01