资讯动态

AWS Lambda 中部署 Multi-Agent Orchestrator(Node.js 实战指南)

发布时间:2026/9/16 21:39:30 来源:尧图企业网站定制
AWS Lambda 中部署 Multi-Agent OrchestratorNode.js 实战指南【免费下载链接】agent-squadFlexible and powerful framework for managing multiple AI agents and handling complex conversations项目地址: https://gitcode.com/GitHub_Trending/mu/agent-squadMulti-Agent Orchestrator 是一个用于管理多个 AI Agent、处理复杂对话编排的框架它和普通库一样可以被嵌入 AWS Lambda 函数中使用。本文以 aws-lambda-nodejs.md 为核心指南完整讲解在 Lambda 中基于 JavaScript/TypeScript 搭建多 Agent 编排系统所需的安装步骤、Lambda 函数结构与 handler 写法、部署方式与 IAM 权限配置并结合仓库源码深入剖析MultiAgentOrchestrator、BedrockLLMAgent等核心类的工作原理与可调参数。读完本文你将能够独立把一个基于 Amazon Bedrock 的多 Agent 对话服务部署到 Lambda 上并具备排查权限与配置问题的能力。前置条件Prerequisites在开始之前需要准备好以下环境与资源一个具备适当权限的AWS 账户后续需要创建 Lambda 函数、配置 IAM 角色并访问 Amazon Bedrock 模型本地安装Node.js 与 npm框架以 npm 包形式分发Node.js 版本需支持 Async/Await 与 Async Iterable建议使用当前 Node 18 的 LTS 版本对AWS Lambda 与 JavaScript/TypeScript有基本了解包括 handler 的签名、事件对象与返回值的约定目标区域已开通Amazon Bedrock 模型访问权限例如 Claude 3 系列模型因为默认分类器与 BedrockLLMAgent 都会调用 Bedrock 的 Converse API。安装与初始化Installation and Setup在项目目录中依次执行以下命令完成框架的引入# 1. 创建新项目目录 mkdir multi-agent-lambda cd multi-agent-lambda # 2. 初始化 Node.js 项目 npm init -y # 3. 安装 Multi-Agent Orchestrator 框架 npm install multi-agent-orchestrator安装完成后multi-agent-orchestrator包会在node_modules中提供编译后的dist产物包入口为dist/index.js类型声明为dist/index.d.ts。从包的主入口 typescript/src/index.ts 可以看到框架对外统一导出了以下能力AgentsBedrockLLMAgent、AmazonBedrockAgent、BedrockInlineAgent、LambdaAgent、LexBotAgent、OpenAIAgent、AnthropicAgent、ChainAgent、BedrockFlowsAgent、SupervisorAgent以及抽象基类AgentClassifierBedrockClassifier、AnthropicClassifier、OpenAIClassifier与抽象基类ClassifierRetrieverAmazonKnowledgeBasesRetriever与RetrieverStorageInMemoryChatStorage默认、DynamoDbChatStorage、SqlChatStorage与ChatStorage基类编排核心MultiAgentOrchestrator、AgentOverlapAnalyzer、Logger以及ConversationMessage、ParticipantRole等类型。这意味着在一个 Lambda 函数中你既可以只使用一个BedrockLLMAgent作为后端也可以自由组合 Lex Bot、Lambda Agent、知识库检索器等多种类型的 Agent。Lambda 函数结构Lambda Function Structure在项目目录中新建lambda.js一个最小可运行的 handler 结构如下const { MultiAgentOrchestrator, BedrockLLMAgent } require(multi-agent-orchestrator); // 初始化 orchestrator const orchestrator new MultiAgentOrchestrator({ // 配置选项 }); // 向 orchestrator 添加 agent orchestrator.addAgent(new BedrockLLMAgent({ // Agent 配置 })); // Lambda handler 函数 exports.handler async (event, context) { try { const { query, userId, sessionId } event; const response await orchestrator.routeRequest(query, userId, sessionId); return response; } catch (error) { console.error(Error:, error); return { statusCode: 500, body: JSON.stringify({ error: Internal Server Error }) }; } };请根据你的具体业务需求定制 orchestrator 配置和 Agent 设置。以下几点是让这个骨架真正可运行的关键细节1. 事件体与返回值约定上述示例假设通过 API Gateway 或同步调用传入的事件对象直接包含query、userId、sessionId三个字段。如果接入 API Gateway REST/HTTP API事件结构通常是event.body中的 JSON 字符串需要先JSON.parse(event.body)再解构返回时也应包装为{ statusCode, headers, body }的网关标准结构。仓库中的 chat-demo-app 实战示例 正是采用这种方式解析event.body后调用orchestrator.routeRequest(userBody.query, userId, sessionId)再根据response.streaming决定按流式块还是整体响应回写。2.routeRequest的调用链routeRequest是编排器对外的主要入口其定义位于 typescript/src/orchestrator.ts内部依次执行classifyRequest先通过storage.fetchAllChats(userId, sessionId)取出会话历史再调用分类器对用户意图进行分类得到ClassifierResult包含selectedAgent与confidenceagentProcessRequest若成功选中 Agent则dispatchToAgent取出该 Agent 的会话历史调用其processRequest生成响应返回结构为AgentResponse包含metadatauserInput、agentId、agentName、userId、sessionId、additionalParams、output字符串或可异步迭代的流以及streaming布尔标记。分类器基于 Bedrock 的 Tool Use 能力工作详见 typescript/src/classifiers/bedrockClassifier.ts它通过analyzePrompt工具让模型输出结构化的{ userinput, selected_agent, confidence }从而确定该把请求路由给哪个 Agent。默认分类器模型为BEDROCK_MODEL_ID_CLAUDE_3_5_SONNET在构造时通过new BedrockClassifier({ modelId: anthropic.claude-3-sonnet-20240229-v1:0 })可以覆盖。3.userId与sessionId的语义这两个参数不是可选项userId唯一标识发起请求的用户sessionId标识当前会话二者组合再加上 agentId作为聊天历史存储的键。默认情况下编排器使用内存存储InMemoryChatStorage见 typescript/src/storage/memoryChatStorage.tsLambda 实例的冷启动会丢失历史因此生产环境通常显式传入DynamoDbChatStorage见下文“会话历史持久化”。深入配置 OrchestratorMultiAgentOrchestrator的构造函数接受OrchestratorOptions其中config字段的类型与全部默认值定义在 typescript/src/orchestrator.ts常用配置项如下配置项默认值说明LOG_AGENT_CHATfalse是否打印与 Agent 的对话交互日志LOG_CLASSIFIER_CHATfalse是否打印与分类器的对话交互日志LOG_CLASSIFIER_RAW_OUTPUTfalse是否打印分类器的原始未处理输出LOG_CLASSIFIER_OUTPUTfalse是否打印分类器处理后的输出LOG_EXECUTION_TIMESfalse是否打印各操作执行耗时含首包时间MAX_RETRIES3分类器收到错误 XML 响应时的最大重试次数USE_DEFAULT_AGENT_IF_NONE_IDENTIFIEDtrue意图分类未选中任何 Agent 时是否回退到默认 Agentfalse时向用户返回提示重述请求的错误消息CLASSIFICATION_ERROR_MESSAGE未定义分类过程发生内部错误时展示给用户的消息NO_SELECTED_AGENT_MESSAGEIm sorry, I couldnt determine how to handle your request. Could you please rephrase it?未选中 Agent 且回退关闭时展示的消息GENERAL_ROUTING_ERROR_MSG_MESSAGE未定义路由过程中出现意外错误时展示的消息MAX_MESSAGE_PAIRS_PER_AGENT100每个 Agent 保留的最大对话轮数每轮为一条用户消息 一条助手消息实际存储消息数为该值的两倍示例用法const orchestrator new MultiAgentOrchestrator({ config: { LOG_AGENT_CHAT: true, LOG_CLASSIFIER_CHAT: true, LOG_EXECUTION_TIMES: true, USE_DEFAULT_AGENT_IF_NONE_IDENTIFIED: true, MAX_MESSAGE_PAIRS_PER_AGENT: 50, }, });routeRequest中正是依据USE_DEFAULT_AGENT_IF_NONE_IDENTIFIED与defaultAgent决定是否回退见 typescript/src/orchestrator.ts而分类失败时返回的 metadata 中会带有errorType: classification_failed与agentId: no_agent_selectedtypescript/src/orchestrator.ts。配置 BedrockLLMAgentBedrockLLMAgent是最常用的内置 Agent其BedrockLLMAgentOptions定义在 typescript/src/agents/bedrockLLMAgent.ts继承自 typescript/src/agents/agent.ts 的基础选项name、description、saveChat、LOG_AGENT_DEBUG_TRACE。常用配置const agent new BedrockLLMAgent({ name: Travel Agent, description: Specialized agent for travel planning and itinerary suggestions., modelId: anthropic.claude-3-5-sonnet-20240620-v1:0, // 默认 anthropic.claude-3-haiku-20240307-v1:0 region: us-east-1, // 不传则使用默认凭证链的区域 streaming: true, // 默认 false inferenceConfig: { maxTokens: 1024, temperature: 0.7, topP: 0.9, stopSequences: [\n\n], }, saveChat: true, // 默认 true });各参数说明name/description必填。description是分类器选择 Agent 的核心依据应准确描述该 Agent 的职责边界例如“只处理天气查询”意图分类越精准路由越可靠modelId指定 Bedrock 模型 ID。仓库在 typescript/src/types/index.ts 中预置了常用模型常量如anthropic.claude-3-haiku-20240307-v1:0默认、anthropic.claude-3-sonnet-20240229-v1:0、anthropic.claude-3-5-sonnet-20240620-v1:0、meta.llama3-70b-instruct-v1:0可直接引用或填写已开通的其他模型 IDstreamingtrue时返回 AsyncIterable 流式响应内部使用ConverseStreamCommand逐块产出文本便于 Lambda 配合awslambda.streamifyResponse实现响应式流输出false时返回完整文本inferenceConfig透传给 Bedrock Converse API 的maxTokens、temperature、topP、stopSequencescustomSystemPrompt可传入{ template, variables }覆盖默认系统提示词模板中的{{变量名}}占位符会被替换typescript/src/agents/bedrockLLMAgent.tstoolConfig{ tool, useToolHandler, toolMaxRecursions }用于给 Agent 挂载工具调用能力toolMaxRecursions默认上限为 20 次递归当模型返回toolUse块时会循环调用工具处理器并把结果回填进对话直到模型end_turn或达到递归上限typescript/src/agents/bedrockLLMAgent.tsretriever接入知识库检索器后Agent 会把检索结果拼入 system prompt 再回答guardrailConfig可配置 Bedrock Guardrails 的guardrailIdentifier与guardrailVersion。id由name自动生成去掉非字母数字字符、空格转连字符并转小写typescript/src/agents/agent.ts。addAgent时会校验 id 唯一性重复添加会抛出An agent with ID xxx already exists.错误typescript/src/orchestrator.ts。多 Agent 组合与实战示例Lambda 中并不局限于单个 Agent。参考 chat-demo-app 的多 Agent Lambda 入口一个完整的组合示例包含一个MultiAgentOrchestrator并注入DynamoDbChatStorage从环境变量读取表名、区域与 TTL 配置作为会话历史存储多个职责各异的BedrockLLMAgent如 Health Agent、Weather Agent、Math Agent、Tech Agent部分开启streaming: true与toolConfig工具调用通过环境变量按需启用LexBotAgent与LambdaAgent后者把请求转发给其他 Lambda 函数通过AmazonKnowledgeBasesRetriever为 Tech Agent 挂载 Bedrock Knowledge Base 检索一个saveChat: false的 Greeting Agent 作为默认兜底 AgentsetDefaultAgent后确保分类器无法命中时也能给出友好响应。该示例还演示了 Lambda 的流式响应处理handler 用awslambda.streamifyResponse(eventHandler)包装先把metadata写回响应流再根据response.streaming逐块转发response.output见 examples/chat-demo-app/lambda/multi-agent/index.ts前端即可实现打字机效果。该项目的完整部署方式CDK 构造、API Gateway 与 UI可参考 chat-demo-app README。会话历史持久化默认的InMemoryChatStorage把对话存放在 Lambda 实例的内存 Map 中适合演示但实例重启后历史即丢失。生产环境推荐在构造编排器时注入DynamoDbChatStorageconst { DynamoDbChatStorage } require(multi-agent-orchestrator); const storage new DynamoDbChatStorage( process.env.HISTORY_TABLE_NAME, process.env.AWS_REGION, process.env.HISTORY_TABLE_TTL_KEY_NAME, // TTL 属性名可选 Number(process.env.HISTORY_TABLE_TTL_DURATION) // TTL 时长秒可选 ); const orchestrator new MultiAgentOrchestrator({ storage });存储实现位于 typescript/src/storage/dynamoDbChatStorage.ts此外还提供 SQL 存储实现。routeRequest在每次请求中会先fetchAllChats聚合历史用于意图分类随后按MAX_MESSAGE_PAIRS_PER_AGENT裁剪并保存本次会话typescript/src/orchestrator.ts。部署DeploymentLambda 函数的部署方式非常灵活文档建议使用你偏好的任一方式AWS CDK把 handler 打包为 Lambda 函数资源并可同时创建 Bedrock 所需资源与 API Gateway仓库中的 chat-demo-app 即采用 CDK其栈定义在 lib/chat-demo-app-stack.tsTerraform以 IaC 方式管理函数、角色与触发器Serverless Framework通过serverless.yml声明函数、事件与 IAMAWS SAM使用template.yaml本地调试并部署AWS 控制台手动部署上传打包后的 ZIP需包含node_modules中的multi-agent-orchestrator及其依赖或使用控制台内联编辑仅适合极简示例。打包时注意Lambda 运行在 Amazon Linux 环境multi-agent-orchestrator及其 AWS SDK 依赖均为纯 JavaScript/TypeScript 编译产物无需特殊处理原生模块但建议将node_modules与代码一并压缩上传或使用 CDK/SAM 的构建容器以保证依赖完整。IAM 权限配置必须确保 Lambda 函数的执行角色具备以下最小权限调用 Amazon Bedrock 模型分类器与BedrockLLMAgent都通过aws-sdk/client-bedrock-runtime的ConverseCommand/ConverseStreamCommand调用模型typescript/src/agents/bedrockLLMAgent.ts因此需要{ Effect: Allow, Action: bedrock:InvokeModel, Resource: * }更严格的做法是将 Resource 限定为具体模型 ARN如arn:aws:bedrock:region::foundation-model/anthropic.claude-3-haiku-20240307-v1:0。写入 CloudWatch Logs框架使用 Logger 记录分类、路由与执行耗时信息需要{ Effect: Allow, Action: [ logs:CreateLogGroup, logs:CreateLogStream, logs:PutLogEvents ], Resource: * }根据你实际启用的能力可能还需要补充以下权限使用DynamoDbChatStorage时dynamodb:GetItem、dynamodb:PutItem、dynamodb:UpdateItem、dynamodb:DeleteItem、dynamodb:Query、dynamodb:Scan对应会话历史表使用LexBotAgent时lex:RecognizeText对应 Lex Bot Alias使用LambdaAgent时lambda:InvokeFunction对应目标函数 ARN使用AmazonKnowledgeBasesRetriever时bedrock:Retrieve与bedrock:RetrieveAndGenerate对应知识库 ARN使用 Bedrock Guardrails 时bedrock:ApplyGuardrail。在 Lambda 控制台的Configuration → Permissions中查看执行角色并附加上述策略即可。若运行时报AccessDeniedException或MalformedInputException优先按此清单核对角色权限与模型开通状态。常见问题与排查建议分类器与 Agent 使用不同的模型默认BedrockClassifier使用 Claude 3.5 SonnetBedrockLLMAgent默认使用 Claude 3 Haikutypescript/src/types/index.ts两者都需要在目标区域开通访问否则首次调用即失败历史丢失确认是否显式传入了DynamoDbChatStorage以及 TTL 配置是否合理响应在网关超时如果开启streaming: true但未使用streamifyResponse长响应可能触发 API Gateway 超时建议按 chat-demo-app 示例 的方式接入流式响应冷启动影响编排器实例建议定义在 handler 外部模块顶层这样 Lambda 容器复用期间可复用已初始化的 orchestrator、Agent 与存储客户端降低每次调用的初始化开销——文档示例与 chat-demo-app 实战入口 均采用这一模式。通过上述步骤你已能基于 Node.js 将一个多 Agent 对话编排服务完整部署到 AWS Lambda从安装multi-agent-orchestrator、编写 handler、组合多个 Agent 与持久化存储到配置 IAM 权限与选择部署方式。若需 Python 侧的等价实现可进一步参考 aws-lambda-python.md。【免费下载链接】agent-squadFlexible and powerful framework for managing multiple AI agents and handling complex conversations项目地址: https://gitcode.com/GitHub_Trending/mu/agent-squad创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价