在 AWS Bedrock AgentCore 上部署 CopilotKit 智能体:LangGraph 与 Strands 双模式实战指南

在 AWS Bedrock AgentCore 上部署 CopilotKit 智能体:LangGraph 与 Strands 双模式实战指南 在 AWS Bedrock AgentCore 上部署 CopilotKit 智能体LangGraph 与 Strands 双模式实战指南【免费下载链接】CopilotKitThe Frontend Stack for Agents Generative UI. React, Angular, Mobile, Slack, and more. Makers of the AG-UI Protocol项目地址: https://gitcode.com/GitHub_Trending/co/CopilotKit导读本文基于 CopilotKit 仓库中的 examples/integrations/agentcore 示例完整讲解如何将 CopilotKit 前端Vite React 聊天界面、生成式图表、共享 Todo 画布与内联工具渲染部署到 AWS Bedrock AgentCore 运行时之上。读完本文你将掌握两条部署路径基于 LangGraph 的单智能体与基于 Strands 的单智能体能够独立完成从环境准备、CDK 基础设施部署、前端发布到本地 Docker 全链路调试的全部操作并理解 AG-UI 桥接、Cognito 鉴权与 AgentCore Gateway MCP 工具调用的底层工作原理。示例概览与能力清单该示例项目构建了一个带生成式图表的聊天 UI 共享状态 Todo 画布 内联工具渲染的完整应用后端运行在 AWS Bedrock AgentCore 上且提供了 LangGraph 与 Strands 两种智能体实现供选择生成式图表智能体调用query_data工具读取数据库agents/langgraph-single-agent/tools/query_data.py再调用pieChart、barChart等前端工具渲染图表组件见 frontend/src/components/generative-ui/BarChart.tsx共享状态 Todo 画布通过manage_todos/get_todos工具维护用户级共享状态前端由 frontend/src/components/canvas/TodoCanvas.tsx 渲染内联工具渲染CopilotKit 将 AgentCore 流式返回的 AG-UI 事件渲染为原生 UI 组件。项目目录结构中的关键组成对应 README 的 Whats inside组成部分作用frontend/Vite React包含 CopilotKit 聊天、图表、Todo 画布agents/langgraph-single-agent/LangGraph 智能体含工具与共享 Todo 状态agents/strands-single-agent/Strands 智能体含工具与共享 Todo 状态pyproject.toml/uv.lockscripts/辅助脚本的 Python 依赖infra-cdk/CDK 定义Cognito、AgentCore、CopilotKit Lambda 桥、Amplifyinfra-terraform/不依赖托管 Intelligence 的基础 AgentCore 基础设施Terraform 版docker/本地开发的 Docker Compose 编排前置条件与依赖管理在开始前需要准备以下工具链对应 README 的 Prerequisites 表格工具要求AWS CLI已配置执行过aws configureNode.js18uv任意较新版本Docker运行中值得注意的一点是Python 端完全由 uv 管理。uv 会负责解析并安装 Python 解释器因此不存在单独的 Python 安装步骤。这与仓库中 Agent 构建的方式一致——两个智能体的 Dockerfile 均使用uv sync --locked安装依赖确保镜像获取到的是 lockfile 中固定的依赖集合而非当天能解析出的任何版本。Agent 依赖的细节约定每个位于agents/下的单智能体目录langgraph-single-agent/与strands-single-agent/都是独立的 uv 项目各自拥有自己的uv.lock。而agents/utils/是例外它是被两个 Dockerfile 通过COPY复制的共享源码本身不是项目因此没有自己的pyproject.toml或 lockfile——凡是它 import 的包都必须由复制它的每个智能体在自己项目的依赖中显式声明。当你需要给某个 Agent 新增依赖时对应 README 的 Agent dependenciescd agents/langgraph-single-agent uv add some-package # 或者直接编辑 pyproject.toml然后执行uv lock无论走哪条路都要把更新后的uv.lock与pyproject.toml一起提交。Terraform 会对两者做哈希校验因此依赖变更会在下一次 apply 时自动触发镜像重新构建。托管 Intelligence 凭据配置在部署或本地运行之前先创建根环境文件对应 README 的 Managed Intelligence credentialscp .env.example .env然后在.env中填写CPK_INTELLIGENCE_API_KEY你的托管 CopilotKit Intelligence 项目的 API Key必填CPK_TELEMETRY_ID可选的遥测分析标识非敏感信息可以留空。.env.example的实际内容.env.example还包含两个被注释掉的本地 Intelligence 端点# INTELLIGENCE_API_URLhttp://host.docker.internal:4201 # INTELLIGENCE_GATEWAY_WS_URLws://host.docker.internal:4401这两行用于 Docker Compose 把域名解析到运行本地 Intelligence 的主机使用托管 Intelligence 时保持注释状态即可。部署到 AWS第一步创建环境与配置cp .env.example .env cp config.yaml.example config.yaml # 编辑 .env 和 config.yaml在config.yaml中需要设置stack_name_base与admin_user_email。从 config.yaml.example 可以看到完整可编辑项# ── User-editable settings ────────────────────────────────────────────────── stack_name_base: my-copilotkit-agentcore-lg # max 35 chars; used as prefix for all AWS resources admin_user_email: # e.g. youexample.com — auto-creates a Cognito user copilotkit_intelligence_api_key_secret_name: copilotkit/intelligence/api-key backend: # Set automatically by deploy scripts — do not edit. pattern: langgraph-single-agent # overwritten by deploy-langgraph.sh / deploy-strands.sh deployment_type: docker # docker (default) or zip network_mode: PUBLIC # PUBLIC (default) or VPC部署脚本会把.env中的托管 Intelligence Key 存入配置的 AWS Secrets Manager 密钥中密钥名由copilotkit_intelligence_api_key_secret_name指定默认copilotkit/intelligence/api-key而 CDK 只在创建 CopilotKit Runtime Lambda 时才解析该密钥——这一流程可以在 deploy-langgraph.sh 的第 116126 行看到脚本先查询密钥是否存在不存在则create-secret存在则put-secret-value更新版本随后把返回的VersionId以CPK_INTELLIGENCE_API_KEY_SECRET_VERSION_ID导出给 CDK。关于端点有一个关键约束托管 Intelligence 使用默认端点若要使用自托管 Intelligence必须设置 AWS 可达的端点覆盖。严禁使用localhost、127.0.0.1或仅在 Docker 内有效的host.docker.internal它们出现在.env.example的注释中只是为本地运行准备的。这一点在部署脚本中有对应的硬校验validate_remote_override函数见 deploy-langgraph.sh 第 6376 行会拒绝命中localhost|127.0.0.1|host.docker.internal的地址并强制INTELLIGENCE_API_URL使用https://、INTELLIGENCE_GATEWAY_WS_URL使用wss://协议。第二步执行部署./deploy-langgraph.sh # LangGraph 智能体基础设施 前端 ./deploy-langgraph.sh --skip-frontend # 仅基础设施/智能体 ./deploy-langgraph.sh --skip-backend # 仅前端 # 或 ./deploy-strands.sh # AWS Strands 智能体 ./deploy-strands.sh --skip-frontend ./deploy-strands.sh --skip-backend # 仅自托管 Intelligence 时 INTELLIGENCE_API_URLhttps://intelligence.example.com \ INTELLIGENCE_GATEWAY_WS_URLwss://gateway.example.com \ ./deploy-langgraph.sh INTELLIGENCE_API_URLhttps://intelligence.example.com \ INTELLIGENCE_GATEWAY_WS_URLwss://gateway.example.com \ ./deploy-strands.sh说明要点以命令前缀方式传入的端点值会覆盖托管默认值配合--skip-frontend或--skip-backend时同样可以使用这一前缀两个脚本使用不同的栈后缀保持隔离LangGraph 使用-lgStrands 使用-st。脚本会自动改写config.yaml中的patternlanggraph-single-agent/strands-single-agent与stack_name_base剥离已有的-lg/-st后缀后追加本脚本的后缀首次运行基础设施部署大约需要 1015 分钟期间脚本会执行npm install并调用npx cdklatest deploy --all --require-approval never部署前脚本会做完整预检deploy-langgraph.sh 第 6087 行检查aws、uv、node、docker是否安装校验端点格式并通过aws sts get-caller-identity验证 AWS 凭据有效。第三步访问应用打开部署结束时打印的Amplify URL使用你的邮箱登录即可。admin_user_email会在 Cognito 中自动创建对应用户。本地开发部署好 AWS 栈之后本地链路依赖已部署的栈提供 Memory 与 Gateway即可进入本地开发模式cp .env.example .env cp docker/.env.example docker/.env cd docker # 在 docker/.env 中填入 AWS 凭据 —— STACK_NAME、MEMORY_ID 与 aws-exports.json 会自动解析 # 使用本地 Intelligence 时取消 ../.env 中 host.docker.internal 相关行的注释 ./up.sh --build关键体验Frontend→ 保存即热更新卷挂载 ViteAgent→ 变更后执行docker compose up --build agent重建浏览器→ 访问http://localhost:3000认证会重定向回 localhost。up.sh是一个便捷包装脚本docker/up.sh它做三件事从config.yaml推导栈名根据AGENT选择-lg/-st后缀从 CloudFormation 栈输出中读取MemoryArn并提取最后的MEMORY_ID回填到docker/.env生成指向 localhost 的本地aws-exports.jsoncopilotKitRuntimeUrl指向http://localhost:3001/copilotkit然后以--watch模式启动 Compose。完整的本地调用链为browser:3000 → bridge:3001 → agent:8080。AWS 仅用于 Memory 和 GatewaySSM/OAuth2。从 docker/docker-compose.yml 可以看到三个服务的完整定义agent暴露 8080 端口并接收MEMORY_ID、STACK_NAME、AWS 临时凭据与AGUI_ENABLEDtrue等环境变量bridge把AGENTCORE_AG_UI_URL指向http://agent:8080/invocationsfrontend通过卷挂载实现热更新。docker/.env.example中明确提示Docker 容器读不到~/.aws/credentials需要粘贴凭据可通过aws configure export-credentials --format env适用于 SSO/临时凭据生成。架构一次请求的完整旅程README 给出的架构图完整描绘了运行时链路Browser → API Gateway → CopilotKit Lambda (Node.js, AG-UI bridge) ↓ AgentCore Runtime ↓ langgraph_agent.py / strands_agent.py ↓ MCP (OAuth2 M2M) AgentCore Gateway → Lambda tools鉴权Cognito OIDC 签发 Bearer Token从浏览器经 Lambda 转发至 AgentCoreAG-UI 桥CopilotKit Lambda 是 Node.js 实现的 AG-UI 桥位于 infra-cdk/lambdas/copilotkit-runtime负责把前端请求转为 AG-UIRunAgentInput协议运行时AgentCore Runtime 承载 Python 智能体工具调用智能体通过 MCP 协议OAuth2 M2M连接 AgentCore Gateway再经 Gateway 调用 Lambda 工具。LangGraph 智能体源码视角agents/langgraph-single-agent/langgraph_agent.py 展示了关键实现模型ChatBedrock使用us.anthropic.claude-sonnet-4-5-20250929-v1:0temperature0.1max_tokens16384开启 streaming持久化AgentCoreMemorySaver以MEMORY_ID 区域默认us-east-1把对话状态存入 AgentCore MemoryGateway 工具create_gateway_mcp_client()从 SSM 参数/{stack_name}/gateway_url读取 Gateway 地址并用requires_access_token装饰器配合 M2M 流程换取新鲜 Bearer Token通过MultiServerMCPClient的streamable_http传输接入Gateway 不可用时如纯本地运行会降级为gateway_tools []并继续运行CopilotKit 集成create_agent挂载CopilotKitMiddleware()与StateStreamingMiddleware将manage_todos工具的参数todos映射为状态键todos实现共享状态的前端即时更新再封装为LangGraphAGUIAgent身份提取优先从 JWT 上下文提取actor_id失败时回退到forwarded_props中的actor_id/actorId/user_id/userId/sub键两者皆缺则报错拒绝执行异常处理任何运行异常都会以 AG-UI 的RunErrorEvent流式返回给前端。Strands 智能体源码视角agents/strands-single-agent/strands_agent.py 则展示了 Strands 侧的等价实现记忆AgentCoreMemorySessionManager按memory_id session_id actor_id提供云端持久会话历史与 LangGraph 方案的AgentCoreMemorySaver思路一致会话管理session_id取自请求thread_id缺失时回退为actor_id确保每个用户拥有独立持久会话线程同时把thread_id回写进 payload以命中预置的 agent 缓存Gateway 客户端MCPClient接收一个lambda工厂而非直接连接对象确保每次 MCP 重连时重新获取新鲜的get_gateway_access_token()源码注释明确说明这是为了避免闭包陷阱共享状态manage_todos配置了state_from_args工具调用即触发StateSnapshotEvent让前端立刻更新无需等待工具结果返回与predict_state映射state_context_builder把当前 todos 注入系统提示词省去单独的get_todos工具前端工具行为pieChart、barChart、toggleTheme、scheduleTime等前端工具配置continue_after_frontend_callFalse并保留MessagesSnapshotEvent——源码注释特别指出若无此配置流会中止且 CopilotKit v2 会因缺少快照而清空 UI追踪trace_attributes记录user.id与session.id便于可观测性关联。两条路径共享同一套前端与基础设施差异仅在智能体实现这正体现了该示例Pick LangGraph or Strands的设计意图。拆除资源不再需要时可通过 CDK 一键销毁注意两个栈使用不同的输出目录cd infra-cdk npx cdklatest destroy --all --output ../cdk.out-lg # LangGraph 栈 cd infra-cdk npx cdklatest destroy --all --output ../cdk.out-st # Strands 栈备选路径Terraform 基础设施如果不想使用托管 Intelligence 的 Threads 能力仓库还提供了纯 Terraform 的基础设施方案infra-terraform/README.md。它覆盖基础的 AgentCore 智能体、Gateway、认证与前端基础设施但不会把托管 Intelligence 凭据注入 CopilotKit Runtime Lambda——需要托管 Threads 与 Intelligence 路径时请回到 CDK 部署。使用方式cd infra-terraform cp terraform.tfvars.example terraform.tfvars # 编辑 terraform.tfvars —— 设置 stack_name_base、backend_pattern、aws_region terraform init terraform plan terraform apply在docker模式backend_deployment_type默认值下一次 apply 会先构建 Agent 的 ARM64 镜像并推送到 ECR再创建运行时无需单独构建步骤。部署完成后可用uv run scripts/test-agent.py Hello测试 Agent依赖来自示例根目录的pyproject.tomluv 会向上查找项目。注意该 README 也如实标注了当前 Terraform 前端部署脚本因缺少feedback_api_url输出而暂不可用——需要部署前端时应使用infra-cdk/路径。小结通过本示例可以完整掌握一条前端 → AG-UI 桥 → AgentCore Runtime → MCP Gateway的生产级部署链路LangGraph 与 Strands 两种智能体在工具接入、共享状态流式更新、会话记忆与身份鉴权上各有实现特色但都统一在 AG-UI 协议与 CopilotKit 前端运行时之下。无论选择 CDK 托管部署还是 Terraform 基础方案这套示例都为你提供了一个可直接复用的 AgentCore 生产化蓝本。【免费下载链接】CopilotKitThe Frontend Stack for Agents Generative UI. React, Angular, Mobile, Slack, and more. Makers of the AG-UI Protocol项目地址: https://gitcode.com/GitHub_Trending/co/CopilotKit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考