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

如何通过Node.js为IBM Watson设置上下文变量并传递至前端

如何在Node.js中传递IBM Watson上下文变量到前端?

先看你贴的代码片段,有个致命的拼写错误:JSON.stringfy应该是JSON.stringify——这个小失误很可能就是导致上下文没正确传递的核心原因。除此之外,还要确保你传递上下文的方式符合Watson Assistant的响应格式,前端也能正确解析。

下面是一步步的解决方案:

1. 修正JSON序列化的拼写错误

手动序列化上下文时一定要注意拼写,不过其实大多数情况下,Node.js的res.send()会自动把JavaScript对象序列化为JSON,所以你甚至不需要手动调用JSON.stringify。

2. 正确更新并返回上下文对象

这里给你两种常见场景的正确代码示例:

场景1:直接自定义上下文并返回给前端

如果是你自己维护上下文(不通过Watson SDK调用),代码应该这样写:

// 假设这是你的Node.js路由处理函数
app.post('/watson/chat', (req, res) => {
  // 从请求中获取现有上下文(如果前端之前传过来的话),没有则初始化空对象
  let context = req.body.context || {};
  const user_name = "MJ";

  // 将自定义值添加到上下文对象
  context.user_name = user_name;

  // 模拟Watson返回的输出内容
  const output = {
    text: ["Hey there! Let's keep chatting."]
  };

  // 正确返回响应:直接传递对象,res.send会自动处理JSON序列化
  res.send({
    output: output,
    context: context // 这里不要手动stringify,除非前端明确需要字符串格式
  });
});

场景2:使用IBM Watson SDK调用并更新上下文

如果是通过Watson Assistant的Node.js SDK对话,需要确保在SDK返回的响应中更新上下文,再返回给前端:

const AssistantV2 = require('ibm-watson/assistant/v2');
const { IamAuthenticator } = require('ibm-watson/auth');

// 初始化Watson Assistant客户端
const assistant = new AssistantV2({
  version: '2021-06-14',
  authenticator: new IamAuthenticator({
    apikey: 'YOUR_WATSON_API_KEY',
  }),
  serviceUrl: 'YOUR_WATSON_SERVICE_URL',
});

app.post('/watson/chat', async (req, res) => {
  const { sessionId, input, context } = req.body;

  try {
    // 调用Watson Assistant的message接口
    const watsonResponse = await assistant.message({
      assistantId: 'YOUR_ASSISTANT_ID',
      sessionId: sessionId,
      input: input,
      context: context // 传递前端传来的现有上下文
    });

    // 将自定义变量添加到Watson返回的上下文里
    watsonResponse.result.context.user_name = "MJ";

    // 返回完整的Watson响应给前端,包含更新后的上下文
    res.send(watsonResponse.result);
  } catch (error) {
    console.error('Watson API Error:', error);
    res.status(500).send('Failed to connect to Watson Assistant');
  }
});

3. 前端如何接收并使用上下文变量

前端请求接口后,解析JSON响应就能拿到上下文里的变量了,比如用fetch的示例:

// 假设之前保存的上下文对象
let existingContext = {};

fetch('/watson/chat', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    input: { text: "Hi" },
    context: existingContext
  })
})
.then(response => response.json())
.then(data => {
  // 更新本地保存的上下文
  existingContext = data.context;
  // 获取自定义的user_name变量
  const userName = data.context.user_name;
  // 渲染到页面上
  document.getElementById('user-display').textContent = `Welcome back, ${userName}!`;
});

额外注意事项

  • 确保Watson Assistant的对话流程中没有重置你添加的上下文变量(比如某些节点的配置会清空上下文)。
  • 如果前端拿到的上下文是字符串格式(比如你手动stringify了),记得用JSON.parse()解析后再使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:27:16