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

如何在刷新页面/关闭窗口时通过AWS Amplify Interactions结束Lex V2会话?

解决方案:刷新/关闭页面时结束Lex V2会话

核心问题原因

Lex V2的会话状态存储在AWS服务端,Amplify Interactions会在本地复用会话ID(sessionId),所以即使页面刷新,只要会话未超时,Lex就会恢复之前的对话。要实现刷新/关闭页面时结束会话,需要主动触发会话销毁操作。

方案一:直接调用Lex V2的DeleteSession API

Amplify Interactions未封装会话删除方法,但可以直接使用AWS SDK调用Lex V2的原生API来销毁会话:

  1. 安装依赖
npm install @aws-sdk/client-lex-runtime-v2
  1. 配置Lex客户端并监听页面卸载事件
    在React组件中添加以下代码:
import { useEffect, useState } from 'react';
import { LexRuntimeV2Client, DeleteSessionCommand } from "@aws-sdk/client-lex-runtime-v2";
import { Amplify, Interactions } from 'aws-amplify';

// 初始化Lex客户端(参数与Amplify配置保持一致)
const lexClient = new LexRuntimeV2Client({
  region: '你的AWS区域',
  credentials: Amplify.Auth.currentCredentials()
});

function ChatbotComponent() {
  const [sessionId, setSessionId] = useState(null);

  // 发送消息时保存sessionId
  const sendMessage = async (message) => {
    const response = await Interactions.send('你的Bot名称', message);
    // 从响应中提取sessionId
    setSessionId(response.sessionId);
  };

  // 监听页面卸载事件,销毁会话
  useEffect(() => {
    const handleUnload = async () => {
      if (!sessionId) return;

      const deleteParams = {
        botId: '你的Lex Bot ID',
        botAliasId: '你的Bot Alias ID',
        localeId: '你的Locale(如zh_CN)',
        sessionId: sessionId
      };

      try {
        await lexClient.send(new DeleteSessionCommand(deleteParams));
      } catch (err) {
        console.error('销毁会话失败:', err);
      }
    };

    window.addEventListener('beforeunload', handleUnload);
    return () => window.removeEventListener('beforeunload', handleUnload);
  }, [sessionId]);

  // 组件其余逻辑...
}
  1. 权限配置
    确保你的IAM角色拥有lex:DeleteSession权限,在IAM策略中添加:
{
  "Effect": "Allow",
  "Action": "lex:DeleteSession",
  "Resource": "arn:aws:lex:你的区域:你的账号ID:bot/你的Bot ID/alias/你的Alias ID"
}

方案二:通过Lex意图主动重置会话

如果不想直接调用API,可以配置Lex意图实现会话重置:

  1. 创建重置会话意图
    在Lex V2控制台创建一个ResetSession意图,开启"关闭会话"选项(在意图的"响应"设置中勾选"关闭会话")。

  2. 页面加载时触发重置
    在React组件挂载时,自动发送触发该意图的消息:

useEffect(() => {
  // 页面加载时发送重置指令
  Interactions.send('你的Bot名称', '重置会话')
    .catch(err => console.error('重置会话失败:', err));
}, []);

这种方式依赖Lex的意图配置,优点是不需要额外配置API权限,但需要确保用户不会误触发该意图。

补充说明

  • 浏览器的beforeunload事件中异步操作可能存在执行限制,若需要更可靠的销毁,可结合后端API(由后端调用DeleteSession),前端在卸载时请求后端接口。
  • 若Amplify Interactions在本地存储了sessionId,也可以在页面加载时清除本地存储的相关数据,强制创建新会话。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 09:33:23