PAYATHON 2026

嵌入式 Watson Virtual Agent 缺少第二段响应

支付老李

结论

“Accessing your account information…” 和付款信息并不是同一条响应中的两个文本字段,而是前后发送的两条消息。Preview mode 会自动等待并显示后续消息。如果嵌入页面使用了过期的 IBMChat 客户端,没有持续接收后续事件,或者浏览器阻止了第二个请求,页面就可能只显示第一条状态消息。

这通常不表示 "pay bill" 意图识别失败,因为第一条响应已经表明相关能力被触发。排查时应重点查看浏览器网络请求、控制台错误、客户端组件版本和账户数据调用。

排查步骤

1. 检查浏览器控制台和网络请求

打开开发者工具,清空记录,再次输入 "pay bill",重点检查:

  • Console 中是否有 JavaScript、CORS、认证或 JSON 解析错误。
  • Network 中是否在第一条消息后发出了其他请求。
  • 后续请求是否一直处于 Pending 状态,或者返回 401、403、404、5xx。
  • 响应正文中是否已经包含第二条消息,只是页面没有显示。
  • 页面是否加载了旧版、缓存版或多个不同版本的 IBMChat 脚本。

不同结果通常对应以下问题:

  • 响应中有付款信息,但界面没有显示:前端组件或消息渲染存在问题。
  • 没有发出后续请求:客户端没有继续监听,或者脚本在第一条消息后报错。
  • 后续请求认证失败:检查机器人配置和调用凭据。
  • 请求成功,但服务端没有返回第二条消息:检查账户信息能力所依赖的数据源和运行环境配置。

2. 使用与当前服务匹配的嵌入代码

不要只复制旧示例中的初始化片段。应从当前 Watson Virtual Agent 管理界面重新获取完整的 Web 嵌入代码,包括对应版本的 JavaScript、CSS、baseURL 和机器人标识。

初始化结构可以是:

<div id="ibm_chat_root"></div>

<script>
  IBMChat.init({
    el: 'ibm_chat_root',
    baseURL: 'https://api.ibm.com/virtualagent/run/api/v1',
    botID: 'YOUR_BOT_ID',
    XIBMClientID: 'YOUR_CLIENT_ID',
    XIBMClientSecret: 'YOUR_CLIENT_SECRET'
  });
</script>

这些字段是否仍适用于实际部署,取决于所使用的 WVA 版本和租户配置。如果管理界面生成的代码与上述示例不同,应以管理界面的部署代码为准,不要混用不同版本的 SDK 和 API 地址。

更新脚本后,清除浏览器缓存,或者使用无痕窗口重新测试。

3. 对比 Preview 和已部署环境

Preview mode 与公开 API 调用使用的执行上下文不一定完全相同。Preview 中可能已经有测试账户数据、会话状态或内部授权,而嵌入页面需要另行配置这些条件。

确认以下内容在部署环境中也能正常使用:

  • Core capability 已经发布,而不是仅保存在 Preview 中。
  • “pay bill” 所需的账户查询或业务数据集成可以从运行环境访问。
  • 嵌入页面获得了正确的会话或用户上下文。
  • 机器人 ID、运行区域和 baseURL 属于同一个环境。
  • 修改能力后已经重新发布机器人。

如果第一条消息之后还要调用外部账户系统,“正在访问账户信息” 只能说明流程已经开始,不能证明后端查询成功。

4. 直接检查 API 的原始响应

如果项目没有使用官方聊天组件,而是自行封装 API,收到第一条消息后不能立即结束本轮处理。客户端需要支持一个用户输入对应多条机器人消息,并按照实际协议继续监听、轮询或处理返回的消息集合。

下面的代码只说明处理思路。具体字段和传输方式应以实际 API 响应为准:

async function handleBotResponse(response) {
  const payload = await response.json();

  const messages = Array.isArray(payload.messages)
    ? payload.messages
    : [payload];

  for (const message of messages) {
    renderMessage(message);
  }

  // 如果 API 通过轮询、回调、WebSocket 或 SSE 返回后续消息,
  // 此处还必须继续使用相应机制接收,不能把第一条消息视为完成标志。
}

不要自行假设存在 messages、complete 或 next 等字段。先在 Network 面板中查看真实的响应格式,再根据实际协议实现。

安全注意事项

不要把有效的 XIBMClientSecret 直接写入公开 HTML。任何能查看页面源码或开发者工具的人都可能获取该值。更安全的做法是把凭据保存在自己的服务端,并通过服务端代理请求:

Browser -> Your backend -> Watson Virtual Agent API

服务端还应限制请求来源、验证用户,并避免在日志中记录密钥。

建议的解决顺序

先从管理界面重新生成完整的嵌入代码并替换现有代码,然后用无痕窗口测试。如果问题仍然存在,对比 Preview 和嵌入页面的 Network 记录,确认第二条消息是没有生成、传输失败,还是已经返回但未被显示。

如果官方组件发出的请求全部成功,但响应中始终没有第二条消息,应将 botID、请求时间、HTTP 状态码和脱敏后的响应内容提交给 IBM 支持。不要在工单、论坛或截图中公开 XIBMClientID、XIBMClientSecret。

备注:内容仅供参考。