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

AWS SDK v3 Lex Runtime V2客户端无法复用执行多命令问题咨询

AWS SDK v3 Lex Runtime V2 客户端复用问题

问题描述

我正在使用AWS SDK版本3及Lex Runtime V2客户端,无法理解为何无法复用客户端实例发送多条命令。我尝试实现创建会话、识别文本、删除会话的基础流程,单独执行每个命令时均可正常运行,但复用客户端时程序在第一个client.send命令后就停止了。官方示例多为不同服务创建新客户端,未覆盖同一服务复用场景。

相关代码

const {
  LexRuntimeV2Client,
  PutSessionCommand,
  RecognizeTextCommand,
} = require("@aws-sdk/client-lex-runtime-v2");
const AWS = require("aws-sdk");

require("dotenv").config();

const sessionCustomId = "12345678";

const getLexClient = () => {
  return new LexRuntimeV2Client({
    credentials: new AWS.Credentials(
      process.env.AWS_ACCESS_KEY,
      process.env.AWS_SECRET_KEY
    ),
    region: process.env.AWS_REGION,
  });
};

const main = async () => {
  await console.log(
    `******* ENV VARS *********\n\n AWS_REGION : ${process.env.AWS_REGION}\n DEWEY_ALIAS_ID : ${process.env.DEWEY_ALIAS_ID}\n DEWEY_BOT_ID : ${process.env.DEWEY_BOT_ID}\n LOCAL_ID : ${process.env.LOCALE_ID}\n\n`
  );

  /*******************************  PUT SESSION ***********************************/
  // a client can be shared by different commands.
  const client = await getLexClient();

  const putSessionCommand = new PutSessionCommand({
    accept: "text/plain; charset=utf-8",
    botAliasId: process.env.DEWEY_ALIAS_ID,
    botId: process.env.DEWEY_BOT_ID,
    localeId: process.env.LOCALE_ID,
    sessionState: {},
    sessionId: sessionCustomId,
  });

  try {
    const response = await client.send(putSessionCommand);
    console.log("finished putting session\n");
    console.log(response);
    var chatSessionState = response.sessionState;
  } catch (err) {
    console.error(
      "Error sending PutSessionCommand, error message: " + JSON.stringify(err)
    );
  }

  /*******************************  RECOGNIZE TEXT ***********************************/
  //get new client
  //var client = await getLexClient();

  const recognizeTextCommand = new RecognizeTextCommand({
    botAliasId: process.env.DEWEY_ALIAS_ID,
    botId: process.env.DEWEY_BOT_ID,
    localeId: process.env.LOCALE_ID,
    sessionState: {},
    sessionId: sessionCustomId,
    text: "Create a case",
  });

  try {
    const responseTwo = await client.send(recognizeTextCommand);
    console.log("finished posting text input\n");
    console.log(responseTwo);
  } catch (err) {
    console.error(
      "Error sending RecognizeTextCommand, error message: " +
        JSON.stringify(err)
    );
  }

  /*******************************  DELETE SESSION ***********************************/
  const deleteSessionCommand = new DeleteSessionCommand({
    botAliasId: process.env.DEWEY_ALIAS_ID,
    botId: process.env.DEWEY_BOT_ID,
    localeId: process.env.LOCALE_ID,
    sessionId: sessionCustomId,
  });

  try {
    const responseThree = await client.send(deleteSessionCommand);
    console.log("finished deleting session\n");
    console.log(responseThree);
  } catch (err) {
    console.error(
      "Error sending DeletingSession, error message: " + JSON.stringify(err)
    );
  }
};

main();

问题分析与解决建议

AWS SDK v3的客户端实例本身是支持复用的,问题出在代码实现细节上,以下是具体排查和修复方向:

  1. 凭证兼容性问题
    你混用了AWS SDK v2的AWS.Credentials类为v3客户端提供凭证,这种跨版本混用可能导致客户端内部状态异常,进而阻塞后续请求。
    修复方式:使用v3原生的凭证配置方式,直接传入凭证参数或使用v3的凭证提供者:

    // 方式1:直接传入凭证
    const getLexClient = () => {
      return new LexRuntimeV2Client({
        credentials: {
          accessKeyId: process.env.AWS_ACCESS_KEY,
          secretAccessKey: process.env.AWS_SECRET_KEY
        },
        region: process.env.AWS_REGION,
      });
    };
    
    // 方式2:使用v3环境变量凭证提供者(需先安装依赖:npm install @aws-sdk/credential-providers)
    const { fromEnv } = require("@aws-sdk/credential-providers");
    const getLexClient = () => {
      return new LexRuntimeV2Client({
        credentials: fromEnv(),
        region: process.env.AWS_REGION,
      });
    };
    
  2. 未捕获的全局错误
    虽然每个client.send都加了try/catch,但客户端内部可能出现未被捕获的Promise拒绝,导致程序静默退出。建议在main函数末尾添加全局错误捕获:

    main().catch(err => {
      console.error("全局未捕获错误:", err);
      process.exit(1);
    });
    
  3. 冗余异步调用
    getLexClient是同步函数,无需用await调用,直接const client = getLexClient()即可,冗余的await不会导致程序停止,但属于无效代码。

  4. 会话状态逻辑优化
    在RecognizeTextCommand中传入空的sessionState不符合Lex会话逻辑,应该复用PutSession返回的chatSessionState,否则可能无法正确识别会话上下文(此问题不影响程序运行,但属于业务逻辑缺陷)。

验证步骤

  • 替换凭证配置为v3原生方式,移除对AWS SDK v2的依赖(若无需其他v2功能)。
  • 添加全局错误捕获,排查是否有未被捕获的异常。
  • 移除getLexClient()前的await调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 05:54:18