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

如何验证Bot Framework Composer聊天机器人页面重载后不再重复发送问候语

问题现象

使用Bot Framework Composer创建的聊天机器人已完成QnA Maker对接,本地运行状态正常,嵌入网站后每次刷新页面或执行特定操作时,机器人都会重复运行问候逻辑。期望实现仅首次会话发送一次问候,后续刷新页面或执行其他操作时仅加载会话历史,不重复发送问候。

现有接入代码
<script>
    var ctoken ='xxxxxx';
    var cconversationId ='xxxxx';
    window.WebChat.renderWebChat({
        directLine: window.WebChat.createDirectLine({
            token: ctoken,
            conversationId : cconversationId, 
            watermark: 10
        }),
        styleOptions: {
            hideUploadButton: true
        }
    }, document.getElementById('webchat'));
    document.querySelector('#webchat>*').focus();
</script>
实现与验证步骤
  • 调整前端Web Chat初始化逻辑,新增会话信息持久化
    你当前代码写死了token和conversationId,没有做本地持久化,每次刷新相当于重新创建会话,是触发重复问候的核心原因之一。修改逻辑如下:

    <script>
      // 页面加载先读取本地存储的会话信息
      const savedConv = localStorage.getItem('botConversationInfo') ? JSON.parse(localStorage.getItem('botConversationInfo')) : null;
      let directLine;
    
      if (savedConv && savedConv.token && savedConv.conversationId) {
        // 有历史会话直接用存储的信息初始化
        directLine = window.WebChat.createDirectLine({
          token: savedConv.token,
          conversationId: savedConv.conversationId,
          watermark: savedConv.watermark || 0
        })
      } else {
        // 没有历史会话,调用你后端的DirectLine token接口申请新会话(这里替换成你自己的token获取逻辑)
        const res = await fetch('/api/get-directline-token').then(r => r.json());
        directLine = window.WebChat.createDirectLine({ token: res.token });
        // 监听会话创建事件,保存会话信息到本地
        directLine.connectionStatus$.subscribe(status => {
          if (status === 2) { // 2代表连接成功
            const conv = directLine.conversationId;
            localStorage.setItem('botConversationInfo', JSON.stringify({
              token: res.token,
              conversationId: conv,
              watermark: 0
            }))
          }
        })
      }
      // 监听消息活动,更新最新的watermark到本地
      directLine.activity$?.subscribe(activity => {
        if (activity.id) {
          const saved = JSON.parse(localStorage.getItem('botConversationInfo'));
          saved.watermark = Number(activity.id.split('|')[1] || 0);
          localStorage.setItem('botConversationInfo', JSON.stringify(saved));
        }
      })
    
      window.WebChat.renderWebChat({
          directLine,
          styleOptions: {
              hideUploadButton: true
          }
      }, document.getElementById('webchat'));
      document.querySelector('#webchat>*').focus();
    
      // 会话过期时清除本地存储的旧会话
      directLine.connectionStatus$.subscribe(status => {
        if (status === 4) { // 4代表连接失败、 token过期
          localStorage.removeItem('botConversationInfo');
        }
      })
    </script>
    
  • 修改Bot Framework Composer端的问候触发规则
    默认问候是ConversationUpdate事件触发,即使复用会话也可能重复触发,需要加状态校验:

    • 找到你的问候触发节点,在触发条件里新增判断 !turn.state.user.hasGreeted
    • 问候消息发送完成后,添加「设置属性」动作,配置 turn.state.user.hasGreeted = true,该属性会持久化到对应用户的会话状态中,后续同一会话不会再触发问候逻辑
  • 功能验证操作

    • 首次打开网站页面,确认机器人仅发送1次问候,正常发送几条测试消息后刷新页面,确认仅加载之前的历史会话,没有新的问候消息生成
    • 清除浏览器localStorage后重新打开页面,确认会触发新的问候,会话历史清空,符合新用户首次访问的逻辑
    • 触发你提到的特定操作(如页面模块切换、表单提交等),确认Web Chat组件重渲染时不会触发新的问候,历史会话正常保留
    • 等待DirectLine token过期(默认有效期1小时)后操作,确认会自动清除旧会话,触发新问候,无报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 12:45:04