Bỏ qua để đến nội dung

TypeScript Agent

Tạo một TypeScript Strands Agent để xây dựng AI agent với các công cụ, và tùy chọn triển khai nó lên Amazon Bedrock AgentCore Runtime. Theo mặc định, generator sử dụng tRPC qua WebSocket để tận dụng hỗ trợ streaming hai chiều của AgentCore cho giao tiếp thời gian thực, an toàn về kiểu dữ liệu. Ngoài ra, bạn có thể chọn giao thức Agent-to-Agent (A2A) để tương tác với các agent tương thích A2A khác, hoặc giao thức AG-UI để tích hợp trực tiếp frontend thông qua CopilotKit.

Strands là một framework nhẹ để xây dựng AI agent. Các tính năng chính bao gồm:

  • Nhẹ và có thể tùy chỉnh: Vòng lặp agent đơn giản không cản trở bạn
  • Sẵn sàng cho production: Khả năng quan sát đầy đủ, tracing và các tùy chọn triển khai để mở rộng quy mô
  • Không phụ thuộc vào model và provider: Hỗ trợ nhiều model khác nhau từ các provider khác nhau
  • Công cụ do cộng đồng đóng góp: Bộ công cụ mạnh mẽ được cộng đồng đóng góp
  • Hỗ trợ đa agent: Các kỹ thuật nâng cao như nhóm agent và agent tự động
  • Chế độ tương tác linh hoạt: Hỗ trợ hội thoại, streaming và không streaming

Bạn có thể tạo một TypeScript Agent theo hai cách:

Chạy generator này@aws/nx-plugin:ts#agent

pnpm nx g @aws/nx-plugin:ts#agent
Xây dựng lệnh của bạn9

Bắt buộc

infra = agentcore | agentcore-ecr

Tùy chọn của generator9 tùy chọn
projectBắt buộcstring

Dự án để thêm Agent vào

frameworkenumMặc định: strands

SDK agent cần sử dụng.

strands
authenuminfra = agentcore | agentcore-ecrMặc định: iam

Phương thức được sử dụng để xác thực với Agent của bạn. Chỉ áp dụng khi infra được thiết lập (bị bỏ qua khi infra là none).

iamcognito
protocolenumMặc định: http

Giao thức máy chủ cho Agent của bạn. HTTP cung cấp máy chủ tRPC/WebSocket. A2A cung cấp máy chủ giao thức Agent-to-Agent. AG-UI cung cấp máy chủ giao thức AG-UI để tích hợp trực tiếp frontend với CopilotKit.

httpa2aag-ui
iacenumMặc định: inherit

Nhà cung cấp IaC ưu tiên. Mặc định giá trị này được kế thừa từ lựa chọn ban đầu của bạn.

inheritcdkterraform
infraenumMặc định: agentcore

Loại hạ tầng để lưu trữ Agent của bạn. agentcore triển khai mã của bạn dưới dạng zip đến runtime được quản lý bởi AgentCore để có chu kỳ build và deploy nhanh nhất. agentcore-ecr build và lưu trữ container image thay vào đó, để kiểm soát ở cấp độ hệ điều hành hoặc sử dụng pipeline container đã có sẵn.

agentcoreagentcore-ecrnone
sessionenumMặc định: s3

Bộ nhớ được sử dụng để lưu trữ phiên làm việc cho Agent của bạn.

s3in-memory
namestring

Tên của Agent của bạn (mặc định: agent)

preferInstallDependenciesbooleanMặc định: true

Có nên cài đặt dependencies sau khi generator chạy hay không. Đặt thành false để hoãn việc cài đặt khi chạy nhiều generator liên tiếp (việc cài đặt vẫn sẽ chạy nếu cần thiết để các generator tiếp theo có thể tính toán Nx project graph); cài đặt một lần vào cuối.

Generator sẽ thêm các file sau vào project TypeScript hiện có của bạn. Các file được tạo phụ thuộc vào protocol được chọn:

protocol = http
  • Thư mụcyour-project/
    • Thư mụcsrc/
      • Thư mụcagent/ (or custom name if specified)
        • index.ts Entry point for Bedrock AgentCore Runtime (tRPC/WebSocket server)
        • init.ts tRPC initialization
        • router.ts tRPC router with agent procedures
        • agent.ts Main agent definition with sample tools
        • session.ts Resolves the SessionManager used to persist conversation state
        • Thư mụcschema/
          • z-async-iterable.ts Zod schema for the router’s streamed responses
        • client.ts Vended client for invoking your agent
        • agent-core-trpc-client.ts Client factory for connecting to agents on AgentCore Runtime
        • Dockerfile Container image definition (only when infra is agentcore-ecr)
    • package.json Updated with Strands dependencies
    • project.json Updated with agent serve targets
protocol = a2a

Entry point sử dụng Strands A2A Express Server thay vì tRPC:

  • Thư mụcyour-project/
    • Thư mụcsrc/
      • Thư mụcagent/ (or custom name if specified)
        • index.ts A2A Express server entry point
        • agent.ts Main agent definition with sample tools
        • session.ts Resolves the SessionManager used to persist conversation state
        • Thư mụcmiddleware/
          • session-id-middleware.ts Binds the inbound AgentCore session ID for the request
        • Dockerfile Container image definition (only when infra is agentcore-ecr)
    • package.json Updated with Strands and Express dependencies
    • project.json Updated with agent serve targets
protocol = ag-ui

Entry point sử dụng @ag-ui/aws-strands để expose agent thông qua giao thức AG-UI (SSE qua POST), tương thích với CopilotKit:

  • Thư mụcyour-project/
    • Thư mụcsrc/
      • Thư mụcagent/ (or custom name if specified)
        • index.ts AG-UI server entry point (Express + SSE)
        • agent.ts Main agent definition with sample tools
        • session.ts Resolves the SessionManager used to persist conversation state
        • Thư mụcmiddleware/
          • session-id-middleware.ts Binds the inbound AgentCore session ID for the request
        • Dockerfile Container image definition (only when infra is agentcore-ecr)
    • package.json Updated with Strands and AG-UI dependencies
    • project.json Updated with agent serve targets

Tùy chọn infra chọn cách mã của bạn được đóng gói và lưu trữ trên Amazon Bedrock AgentCore Runtime:

  • agentcore (mặc định) sử dụng triển khai mã trực tiếp: mã đã build của bạn được đóng gói dưới dạng .zip, tải lên S3 và chạy trên runtime ngôn ngữ được quản lý bởi AgentCore. Không có container image để build, không có ECR repository để quản lý và không có image để push, điều này giúp chu kỳ build và deploy nhanh hơn đáng kể.
  • agentcore-ecr build một container image arm64 từ Dockerfile được cung cấp và lưu trữ nó từ registry core/asset-ecr được chia sẻ, cùng với mọi container khác trong workspace. Chọn tùy chọn này khi bạn cần kiểm soát image hệ điều hành — ví dụ để cài đặt các thư viện hệ thống gốc — hoặc khi bạn có một pipeline container đã thiết lập. Tùy chọn này cũng cung cấp thêm mục tiêu quét image Trivy (xem Image Scanning bên dưới).
  • none không tạo cơ sở hạ tầng nào cả, vì vậy dự án chỉ có thể chạy cục bộ.
infra = agentcore | agentcore-ecr

Vì generator này cung cấp infrastructure as code dựa trên iac bạn đã chọn, nó sẽ tạo một dự án trong packages/common bao gồm các CDK constructs hoặc Terraform modules liên quan.

Dự án infrastructure as code chung được cấu trúc như sau:

  • Thư mụcpackages/common/constructs
    • Thư mụcsrc
      • Thư mụcapp/ Constructs for infrastructure specific to a project/generator
      • Thư mụccore/ Generic constructs which are reused by constructs in app
      • index.ts Entry point exporting constructs from app
    • project.json Project build targets and configuration

Để triển khai Agent của bạn, các file sau được tạo:

  • Thư mụcpackages/common/constructs/src
    • Thư mụcapp
      • Thư mụcagents
        • Thư mục<agent-name>
          • <agent-name>.ts CDK construct for deploying your agent
infra = none

Nếu bạn chọn none cho infra, không có CDK construct hoặc Terraform module nào được tạo — Agent chỉ có thể chạy cục bộ. Tùy chọn auth bị bỏ qua trong chế độ này vì không có endpoint được host để xác thực.

Khi được triển khai lên Bedrock AgentCore Runtime, mã nguồn của agent được đóng gói dưới dạng zip và chạy trong AgentCore managed runtime. Các client gọi đến data plane endpoint của AgentCore Runtime, endpoint này chuyển tiếp các yêu cầu đến agent của bạn. Agent gọi Amazon Bedrock để suy luận mô hình và có thể gọi các công cụ, MCP server, hoặc các API downstream.

Loading the diagram…

Giao thức server của agent xác định cách nó giao tiếp. Bạn có thể chọn giữa:

  • HTTP (mặc định): Sử dụng tRPC qua WebSocket cho giao tiếp thời gian thực, an toàn về kiểu dữ liệu. Tốt nhất cho tích hợp client tùy chỉnh và kiểm soát chi tiết API của agent.
  • A2A: Sử dụng giao thức Agent-to-Agent (A2A) cho giao tiếp giữa các agent được chuẩn hóa. Tốt nhất khi agent của bạn cần có thể được phát hiện và gọi bởi các agent tương thích A2A khác.
  • AG-UI: Sử dụng giao thức AG-UI (SSE qua POST) thông qua @ag-ui/aws-strands để tích hợp trực tiếp frontend với CopilotKit. Tốt nhất khi bạn muốn một giao diện chat phong phú với streaming, trực quan hóa tool-call và quản lý trạng thái.

Giao thức được thiết lập trong hạ tầng CDK/Terraform, và mã ứng dụng được tạo tương ứng.

protocol = http

TypeScript Agent sử dụng tRPC qua WebSocket, tận dụng hỗ trợ streaming hai chiều của AgentCore để cho phép giao tiếp thời gian thực, an toàn về kiểu dữ liệu giữa client và agent của bạn.

Vì tRPC hỗ trợ các procedure Query, Mutation và Subscription qua WebSocket, bạn có thể định nghĩa bất kỳ số lượng procedure nào. Theo mặc định, một subscription procedure duy nhất có tên invoke được định nghĩa cho bạn trong router.ts.

Công cụ là các hàm mà AI agent có thể gọi để thực hiện các hành động. Bạn có thể thêm công cụ mới trong file agent.ts:

import { Agent, tool } from '@strands-agents/sdk';
import { z } from 'zod';
const letterCounter = tool({
name: 'letter_counter',
description: 'Count occurrences of a specific letter in a word',
inputSchema: z.object({
word: z.string().describe('The input word to search in'),
letter: z.string().length(1).describe('The specific letter to count'),
}),
callback: (input) => {
const { word, letter } = input;
const count = word.toLowerCase().split(letter.toLowerCase()).length - 1;
return `The letter '${letter}' appears ${count} time(s) in '${word}'`;
},
});
// Add tools to your agent
export const getAgent = async () => {
return new Agent({
systemPrompt: 'You are a helpful assistant with access to various tools.',
tools: [letterCounter],
});
};

Framework Strands tự động xử lý:

  • Xác thực đầu vào sử dụng Zod schema
  • Tạo JSON schema cho tool calling
  • Xử lý lỗi và định dạng response

Theo mặc định, các Strands agent sử dụng Claude Sonnet 4.6 trên Amazon Bedrock, nhưng bạn có thể dễ dàng chuyển đổi giữa các model provider:

import { Agent } from '@strands-agents/sdk';
import { BedrockModel } from '@strands-agents/sdk/models/bedrock';
import { OpenAIModel } from '@strands-agents/sdk/models/openai';
// Use Bedrock
const bedrockModel = new BedrockModel({
modelId: 'anthropic.claude-sonnet-4-20250514-v1:0',
});
let agent = new Agent({ model: bedrockModel });
let response = await agent.invoke('What can you help me with?');
// Alternatively, use OpenAI by just switching model provider
const openaiModel = new OpenAIModel({
apiKey: process.env.OPENAI_API_KEY,
modelId: 'gpt-4o',
});
agent = new Agent({ model: openaiModel });
response = await agent.invoke('What can you help me with?');

Xem tài liệu Strands về model provider để biết thêm các tùy chọn cấu hình.

Bạn có thể thêm công cụ từ MCP server vào Strands agent của bạn.

Để sử dụng MCP Server mà bạn đã tạo bằng generator py#mcp-server hoặc ts#mcp-server, bạn có thể sử dụng connection generator.

Chạy generator này@aws/nx-plugin:connection

pnpm nx g @aws/nx-plugin:connection
Xây dựng lệnh của bạn5

Bắt buộc

Bắt buộc

Tham khảo hướng dẫn connection generator để biết chi tiết về cách thiết lập kết nối.

Đối với các MCP server khác, vui lòng tham khảo Tài liệu Strands.

Để có hướng dẫn chuyên sâu hơn về viết Strands agent, tham khảo tài liệu Strands.

protocol = a2a

File index.ts được tạo mount Strands A2A Express Server lên một Express app để agent được tạo expose các endpoint giao thức A2A cùng với health check /ping. URL được quảng cáo trong agent card đến từ biến môi trường AGENTCORE_RUNTIME_URL, quay lại http://localhost:<port>/ cho phát triển cục bộ.

Hầu hết người dùng sẽ không cần sửa đổi file này — chỉnh sửa agent.ts để thay đổi công cụ hoặc system prompt. Các A2A agent lắng nghe trên cổng 9000 (so với 8080 cho HTTP), mà hạ tầng được tạo đã được cấu hình sẵn.

protocol = ag-ui

File index.ts được tạo bọc Strands Agent của bạn trong một @ag-ui/aws-strands StrandsAgent và tạo một Express app. App kết quả expose một POST endpoint duy nhất stream các sự kiện AG-UI qua Server-Sent Events (SSE), cũng như /ping cho health check của AgentCore runtime.

Các AG-UI agent được thiết kế để được sử dụng trực tiếp bởi frontend. Sử dụng connection generator để kết nối React website của bạn với agent thông qua CopilotKit provider và AG-UI HttpAgent client.

Hầu hết người dùng sẽ không cần sửa đổi index.ts — chỉnh sửa agent.ts để thay đổi công cụ hoặc system prompt. Các AG-UI agent lắng nghe trên cổng 8080 (giống như HTTP), mà hạ tầng được tạo đã được cấu hình sẵn.

Để chạy Agent của bạn (và mọi thứ kết nối với nó) cục bộ, sử dụng target dev của project:

Terminal window
pnpm nx dev your-project

Nếu bạn đã thêm nhiều component vào project của mình (agent, MCP server, v.v.), điều này sẽ khởi động tất cả. Để chỉ chạy agent này, target target <your-agent-name>-dev của nó:

Terminal window
pnpm nx agent-dev your-project

Điều này sử dụng tsx --watch để tự động khởi động lại server khi file thay đổi. Agent sẽ có sẵn tại http://localhost:8081 (hoặc cổng được gán nếu bạn có nhiều agent — đọc nó từ metadata.ports trong project.json của project).

Một target <your-agent-name>-serve cũng được tạo, chạy agent với hạ tầng đã triển khai của bạn và do đó yêu cầu RUNTIME_CONFIG_APP_ID phải được thiết lập. Xem hướng dẫn Local Development để biết sự khác biệt giữa devserve.

Generator cấu hình một Nx target <your-agent-name>-chat đưa bạn vào một terminal chat tương tác với agent của bạn.

Target chat chạy độc lập. Theo mặc định, nó kết nối với agent đang chạy cục bộ của bạn, vì vậy hãy khởi động target <your-agent-name>-dev của agent trước (trong một terminal riêng):

Terminal window
pnpm nx agent-dev your-project

Sau đó, trong một terminal khác, khởi động chat:

Terminal window
pnpm nx run your-project:agent-chat

Generator tạo một scripts/<your-agent-name>/chat.ts cho mỗi giao thức. Bạn có thể tùy chỉnh nó khi bạn phát triển hình dạng đầu vào của agent. Nó kết nối với agent cục bộ theo mặc định, hoặc với agent đã triển khai của bạn khi RUNTIME_CONFIG_APP_ID được thiết lập (xem Chat với agent đã triển khai của bạn bên dưới).

infra = agentcore | agentcore-ecr

Để chat với agent của bạn được triển khai lên Bedrock AgentCore, thiết lập biến môi trường RUNTIME_CONFIG_APP_ID thành AppConfig application id của deployment (được xuất ra dưới dạng RuntimeConfigApplicationId bởi stack đã triển khai). Script chat resolve ARN runtime của agent từ cấu hình runtime và kết nối với endpoint đã triển khai:

Đối với các agent được xác thực IAM, các request được ký bằng SigV4 sử dụng AWS credential mặc định của bạn. Đảm bảo môi trường có AWS credential với quyền gọi runtime:

Terminal window
RUNTIME_CONFIG_APP_ID=<app-id> pnpm nx run your-project:agent-chat
infra = agentcore | agentcore-ecr

Triển khai Agent của bạn lên Bedrock AgentCore Runtime

Phần tiêu đề “Triển khai Agent của bạn lên Bedrock AgentCore Runtime”

Nếu bạn chọn agentcore hoặc agentcore-ecr cho infra, cơ sở hạ tầng CDK hoặc Terraform liên quan sẽ được tạo ra mà bạn có thể sử dụng để triển khai Agent của mình lên Amazon Bedrock AgentCore Runtime.

Một CDK construct được tạo ra cho agent của bạn, được đặt tên dựa trên name bạn đã chọn khi chạy generator, hoặc <ProjectName>Agent theo mặc định.

Bạn có thể sử dụng CDK construct này trong một ứng dụng CDK:

import { MyProjectAgent } from '@my-scope/common-constructs';
export class ExampleStack extends Stack {
constructor(scope: Construct, id: string) {
new MyProjectAgent(this, 'MyProjectAgent');
}
}

Generator cung cấp một tùy chọn auth để cấu hình xác thực cho Agent của bạn. Bạn có thể chọn giữa xác thực IAM (mặc định) hoặc Cognito khi tạo agent của mình.

Theo mặc định, Agent của bạn sẽ được bảo mật bằng xác thực IAM, chỉ cần triển khai nó mà không cần bất kỳ đối số nào:

import { MyProjectAgent } from '@my-scope/common-constructs';
export class ExampleStack extends Stack {
constructor(scope: Construct, id: string) {
new MyProjectAgent(this, 'MyProjectAgent');
}
}

Bạn có thể cấp quyền truy cập để gọi agent của mình trên Bedrock AgentCore Runtime bằng phương thức grantInvokeAccess, ví dụ:

import { MyProjectAgent } from '@my-scope/common-constructs';
export class ExampleStack extends Stack {
constructor(scope: Construct, id: string) {
const agent = new MyProjectAgent(this, 'MyProjectAgent');
const lambdaFunction = new Function(this, ...);
agent.grantInvokeAccess(lambdaFunction);
}
}

Khi bạn chọn xác thực Cognito, generator sẽ cấu hình agent để sử dụng Cognito cho xác thực.

Construct được tạo ra chấp nhận một prop identity để cấu hình xác thực Cognito:

import { MyProjectAgent, UserIdentity } from '@my-scope/common-constructs';
export class ExampleStack extends Stack {
constructor(scope: Construct, id: string) {
const identity = new UserIdentity(this, 'Identity');
new MyProjectAgent(this, 'MyProjectAgent', {
identity,
});
}
}

Construct UserIdentity có thể được tạo ra bằng cách sử dụng ts#website#auth generator, hoặc bạn có thể tạo UserPoolUserPoolClient CDK của riêng mình.

Generator tự động cấu hình một target bundle sử dụng Rolldown để tạo gói triển khai:

Terminal window
pnpm nx bundle <project-name>

Cấu hình Rolldown có thể được tìm thấy trong rolldown.config.ts, với một entry cho mỗi bundle cần tạo. Rolldown quản lý việc tạo nhiều bundle song song nếu được định nghĩa.

Bundle target sử dụng index.ts làm entrypoint cho WebSocket server để host trên Bedrock AgentCore Runtime.

infra = agentcore

Generator cấu hình một target <your-agent-name>-package tập hợp gói mã có thể triển khai: index.js đã bundle cộng với cài đặt vendored của AWS Distro for OpenTelemetry, mà AgentCore yêu cầu phải có trong gói. Hạ tầng được tạo tải lên thư mục này dưới dạng .zip — thông qua AgentRuntimeArtifact.fromCodeAsset trong CDK, hoặc được lưu trữ vào shared asset bucket trong Terraform.

infra = agentcore-ecr

Generator cấu hình một target <your-agent-name>-docker sao chép Dockerfile từ thư mục nguồn agent của bạn vào thư mục đầu ra bundle. Điều này đặt Dockerfile cùng với các artifact đã bundle, cho phép CDK xây dựng Docker image trực tiếp bằng AgentRuntimeArtifact.fromAsset.

Một target docker cũng được tạo để chuẩn bị docker context cho tất cả các agent nếu bạn có nhiều agent được định nghĩa.

Docker image được xây dựng cho dự án này có thể được quét để tìm các lỗ hổng bảo mật bằng cách sử dụng Trivy, chạy từ ECR-hosted Trivy image.

Một target trivy được thêm vào dự án của bạn để quét image đã xây dựng và thoát với mã khác không nếu phát hiện bất kỳ lỗ hổng bảo mật mức độ nghiêm trọng HIGH hoặc CRITICAL nào. Dockerfile được tạo ra sử dụng một base image không có lỗ hổng bảo mật có thể sửa chữa nào ở các mức độ nghiêm trọng này tại thời điểm tạo, và nâng cấp các công cụ đi kèm (chẳng hạn như npm) để duy trì trạng thái đó.

Quá trình quét sử dụng cùng container engine với quá trình xây dựng image của bạn (docker hoặc finch), do đó không cần công cụ bổ sung nào. Quá trình quét không được cache, vì image mà nó đọc tồn tại trong container engine thay vì trên đĩa — do đó nó luôn quét image thực tế, và thất bại rõ ràng thay vì báo cáo kết quả pass đã được cache cho một image không còn tồn tại. Do đó, mỗi lần chạy mất hàng chục giây cho mỗi image và làm mới cơ sở dữ liệu lỗ hổng bảo mật của Trivy, vì vậy nó cần truy cập mạng. Script root trivy được cung cấp sẽ quét mọi image trong workspace:

Terminal window
pnpm trivy

Có thể có những trường hợp bạn muốn loại bỏ một lỗ hổng bảo mật cụ thể, ví dụ như khi chưa có bản sửa lỗi và bạn đã đánh giá rủi ro là có thể chấp nhận được.

Thêm ID lỗ hổng bảo mật (mỗi dòng một ID) vào file .trivyignore trong thư mục gốc của dự án (tức là bên cạnh project.json của bạn):

.trivyignore
# node-tar arbitrary file write - not exploitable in our usage
CVE-2024-XXXXX

Để biết thêm chi tiết về việc lọc các phát hiện, hãy tham khảo tài liệu lọc của Trivy.

Agent của bạn được tự động cấu hình với khả năng quan sát sử dụng AWS Distro for Open Telemetry (ADOT).

Bạn có thể tìm thấy trace trong CloudWatch AWS Console, bằng cách chọn “GenAI Observability” trong menu. Lưu ý rằng để trace được điền, bạn sẽ cần bật Transaction Search.

Để biết thêm chi tiết, tham khảo tài liệu AgentCore về khả năng quan sát.

Tùy chọn session kiểm soát cách agent của bạn duy trì trạng thái hội thoại (lịch sử tin nhắn, trạng thái công cụ, v.v.) qua các lần gọi, sử dụng SessionManager của Strands SDK:

  • s3 (mặc định): Hạ tầng CDK/Terraform cung cấp một S3 bucket chuyên dụng cho dữ liệu session, được mã hóa bằng KMS key chuyên dụng và với tất cả truy cập công khai bị chặn; server access log được gửi đến CloudWatch Logs log group thông qua cùng key. IAM role của agent được cấp quyền read/write/list/delete vào bucket và quyền decrypt/generate-data-key vào key, và tên bucket được đăng ký cùng với ARN của agent trong cấu hình runtime AppConfig.
  • in-memory: Không có bucket nào được cung cấp. Trạng thái hội thoại chỉ được giữ trong bộ nhớ trong suốt thời gian sống của process đang chạy và không tồn tại qua các lần khởi động lại hoặc scale-in.

Điều này được triển khai trong session.ts được tạo, export một hàm getSessionManager() resolve một SessionManager cho session hiện tại.

Session ID chính nó đến từ AgentCore Runtime session (được truyền qua header x-amzn-bedrock-agentcore-runtime-session-id cho A2A/AG-UI, hoặc WebSocket connection context cho HTTP/tRPC) và được gắn với một context dựa trên AsyncLocalStorage để getCurrentSessionId() có thể resolve nó ở bất kỳ đâu trong request — bao gồm trong bất kỳ MCP hoặc A2A client downstream nào được kết nối thông qua connection generator, để toàn bộ chuỗi gọi chia sẻ một session nhất quán.

Hạn chế session cho chủ sở hữu của chúng

Phần tiêu đề “Hạn chế session cho chủ sở hữu của chúng”

Session ID đến từ người gọi, vì vậy bản thân nó chỉ xác định một cuộc hội thoại chứ không phải cuộc hội thoại thuộc về ai. AgentCore Runtime ủy quyền một lần gọi dựa trên ARN tài nguyên agent runtime thay vì dựa trên một session riêng lẻ, điều này để agent tự do quyết định session có ý nghĩa gì đối với ứng dụng của bạn.

Để hạn chế mỗi người dùng chỉ có thể truy cập các cuộc hội thoại của riêng họ:

  1. Thêm một API để tạo session, sử dụng tRPC, FastAPI hoặc Smithy. Tạo một session ID không rõ ràng (ít nhất 33 ký tự) và lưu trữ nó cùng với ID của người dùng đang gọi — ví dụ trong một bảng được tạo bằng generator ts#dynamodb. Mỗi hướng dẫn API cho biết cách lấy ID của người dùng đang gọi.
  2. Trong agent của bạn, tra cứu ID người dùng được lưu trữ cho session ID mà nó được cung cấp, và từ chối request khi nó không khớp với người gọi. Với auth=cognito, JWT của người gọi đến mã agent của bạn, vì vậy claim sub của nó xác định họ.

Tạo session ID thay vì suy ra nó từ các giá trị do người dùng cung cấp như tên cuộc hội thoại — bất cứ thứ gì người gọi có thể dự đoán, người gọi có thể gửi.

Giao tiếp agent được truyền qua tRPC qua WebSocket. Do đó, khuyến nghị sử dụng client factory an toàn về kiểu dữ liệu được tạo trong client.ts.

protocol = http

Khởi động agent của bạn với target <your-agent-name>-dev:

Terminal window
pnpm nx agent-dev your-project

Sau đó gọi nó bằng phương thức factory .local từ client factory.

Ví dụ, bạn có thể tạo một file có tên scripts/test.ts trong workspace của bạn import client:

Class client được đặt tên theo agent của bạn, vì vậy một agent có tên my-agent export MyAgentClient.

scripts/test.ts
import { MyAgentClient } from '../packages/<project>/src/agent/client.js';
const client = MyAgentClient.local({ url: 'http://localhost:8081/ws' });
client.invoke.subscribe({ prompt: 'what is 1 plus 1?' }, { onData: console.log });

Thay thế cổng được gán cho agent của bạn — đọc nó từ metadata.ports trong project.json của project.

Để gọi Agent của bạn đã được triển khai lên Bedrock AgentCore Runtime, bạn có thể gửi một yêu cầu POST đến điểm cuối dataplane của Bedrock AgentCore Runtime với runtime ARN được mã hóa URL của bạn.

Bạn có thể lấy runtime ARN từ cơ sở hạ tầng của mình như sau:

import { CfnOutput } from 'aws-cdk-lib';
import { MyProjectAgent } from '@my-scope/common-constructs';
export class ExampleStack extends Stack {
constructor(scope: Construct, id: string) {
const agent = new MyProjectAgent(this, 'MyProjectAgent');
new CfnOutput(this, 'AgentArn', {
value: agent.agentCoreRuntime.agentRuntimeArn,
});
}
}

ARN sẽ có định dạng sau: arn:aws:bedrock-agentcore:<region>:<account>:runtime/<agent-runtime-id>.

Sau đó, bạn có thể mã hóa URL cho ARN bằng cách thay thế : bằng %3A/ bằng %2F.

URL dataplane của Bedrock AgentCore Runtime để gọi agent như sau:

https://bedrock-agentcore.<region>.amazonaws.com/runtimes/<url-encoded-arn>/invocations

Cách chính xác để gọi URL này phụ thuộc vào phương thức xác thực được sử dụng.

File client.ts được tạo bao gồm một client factory an toàn về kiểu dữ liệu có thể được sử dụng để gọi agent đã triển khai của bạn.

Bạn có thể gọi agent đã triển khai của bạn bằng cách truyền ARN của nó cho phương thức factory withIamAuth:

import { MyAgentClient } from './agent/client.js';
const client = MyAgentClient.withIamAuth({
agentRuntimeArn: 'arn:aws:bedrock-agentcore:us-west-2:123456789012:runtime/my-agent',
});
client.invoke.subscribe({ prompt: 'what is 1 plus 1?' }, {
onData: (message) => console.log(message),
onError: (error) => console.error(error),
onComplete: () => console.log('Done'),
});

Để gọi Agent của bạn từ React website, bạn có thể sử dụng connection generator, tự động thiết lập tRPC WebSocket client với xác thực đúng (IAM hoặc Cognito).

Chạy generator này@aws/nx-plugin:connection

pnpm nx g @aws/nx-plugin:connection
Xây dựng lệnh của bạn5

Bắt buộc

Bắt buộc

Tham khảo hướng dẫn connection generator để biết chi tiết về cách thiết lập kết nối.

protocol = a2a

Để ủy thác công việc từ agent này cho một remote A2A agent (hoặc TypeScript hoặc Python), sử dụng connection generator. Nó tạo một client được xác thực SigV4 cho target agent và AST-transform agent.ts của agent này để đăng ký remote A2A agent như một Strands tool.

Chạy generator này@aws/nx-plugin:connection

pnpm nx g @aws/nx-plugin:connection
Xây dựng lệnh của bạn5

Bắt buộc

Bắt buộc

Tham khảo hướng dẫn connection generator để biết chi tiết về cách thiết lập kết nối.

protocol = ag-ui

Để gọi AG-UI agent của bạn từ React website, sử dụng connection generator, kết nối một CopilotKit client được cấu hình cho agent đã triển khai của bạn với xác thực đúng (IAM hoặc Cognito).

Chạy generator này@aws/nx-plugin:connection

pnpm nx g @aws/nx-plugin:connection
Xây dựng lệnh của bạn5

Bắt buộc

Bắt buộc

Tham khảo hướng dẫn connection generator để biết chi tiết về cách thiết lập kết nối.

Các Agent hoạt động dựa trên đầu vào không đáng tin cậy và có thể thực hiện các hành động thực tế thông qua các công cụ của chúng, vì vậy đáng để xem xét bảo mật ngay từ đầu. Các thực hành sau đây áp dụng cho agent được tạo ra.

Coi đầu vào và đầu ra của mô hình là không đáng tin cậy

Phần tiêu đề “Coi đầu vào và đầu ra của mô hình là không đáng tin cậy”

Các prompt có thể chứa các hướng dẫn đối nghịch (prompt injection), và đầu ra của mô hình là không xác định — cả hai đều không nên được tin cậy trong logic nhạy cảm về bảo mật:

  • Định nghĩa các schema đầu vào nghiêm ngặt cho các công cụ của bạn, như trong công cụ ví dụ được tạo ra. Hạn chế các giá trị theo những gì công cụ thực sự cần (enums, giới hạn độ dài, phạm vi số) thay vì chấp nhận các chuỗi tự do.
  • Không bao giờ truyền đầu ra của mô hình trực tiếp vào các lệnh shell, truy vấn SQL, đánh giá mã, hoặc HTML được render mà không có xác thực hoặc mã hóa.
  • Áp dụng các kiểm tra ủy quyền trong các công cụ và dịch vụ downstream của bạn — đừng dựa vào system prompt để ngăn mô hình sử dụng sai một công cụ mà nó có quyền truy cập.

Các hướng dẫn Prompt EngineeringResponsible AI của Strands bao gồm việc viết các system prompt mạnh mẽ, có ý thức về an toàn.

Chỉ cấp cho vai trò IAM của agent những quyền mà các công cụ của nó cần. Các cấu trúc CDK và mô-đun Terraform được cung cấp hiển thị các phương thức grant* và các chính sách có phạm vi cho mục đích này — ví dụ cấp cho một agent quyền truy cập để gọi một API cụ thể thay vì đính kèm các chính sách được quản lý rộng. Khi một công cụ hành động thay mặt cho người dùng, ưu tiên ủy quyền hành động bằng cách sử dụng danh tính của người dùng đang gọi (được truyền qua ngữ cảnh yêu cầu) thay vì các quyền môi trường của chính agent.

Bởi vì hành vi của mô hình có thể thay đổi theo những cách không mong đợi, hãy lên kế hoạch để nhanh chóng vô hiệu hóa hoặc thay đổi mô hình mà không cần thay đổi mã:

  • Đọc ID mô hình từ cấu hình (ví dụ một biến môi trường MODEL_ID) để các nhà vận hành có thể chuyển đổi hoặc quay lại một mô hình khác bằng cách cập nhật cấu hình.
  • Đặt agent phía sau một feature flag để chức năng AI của nó có thể bị vô hiệu hóa hoàn toàn. Khi bị vô hiệu hóa, trả về một thông báo chung thay vì một lỗi, và đảm bảo phần còn lại của ứng dụng của bạn giảm cấp một cách ổn định.

Ghi lại cách chuyển đổi các điều khiển này trong sổ tay vận hành của bạn.

  • Tránh ghi log các prompt và completion, có thể chứa dữ liệu người dùng. Hook ghi log lỗi mô hình của agent được tạo ra chỉ ghi log metadata lỗi, không phải nội dung cuộc trò chuyện — giữ thuộc tính này khi thêm logging của riêng bạn.
  • Trả về các thông báo lỗi chung cho người dùng; ghi log các lỗi chi tiết ở phía máy chủ.
  • Cô lập trạng thái cuộc trò chuyện giữa người dùng và phiên, và ủy quyền truy cập vào bất kỳ dữ liệu phiên được lưu trữ nào.
  • Biên tập thông tin nhận dạng cá nhân (PII) khỏi các prompt và đầu ra — bằng bộ lọc thông tin nhạy cảm của Bedrock Guardrail (bên dưới) hoặc, đối với các agent Strands, các cách tiếp cận trong hướng dẫn PII Redaction.

Amazon Bedrock Guardrails cung cấp các bộ lọc nội dung có thể cấu hình, các chủ đề bị từ chối, và các bộ lọc thông tin nhạy cảm (PII) được đánh giá trên đầu vào và đầu ra của mô hình. Bạn có thể đính kèm một guardrail vào mô hình được sử dụng bởi agent được tạo ra:

agent.ts
import { Agent } from '@strands-agents/sdk';
import { BedrockModel } from '@strands-agents/sdk/models/bedrock';
const model = new BedrockModel({
modelId: process.env.MODEL_ID,
guardrailConfig: {
guardrailIdentifier: process.env.GUARDRAIL_ID!,
guardrailVersion: process.env.GUARDRAIL_VERSION ?? 'DRAFT',
},
});
const agent = new Agent({ model, /* ... */ });

Xem hướng dẫn Guardrails của Strands để biết thêm chi tiết.

Sử dụng generator connection để tích hợp project này với các project khác trong workspace của bạn. Các kết nối sau liên quan đến project này:

Strands AgentsTypeScript
React to TypeScript AgentCall a TypeScript Agent from a React website
CopilotKit
React to AG-UI AgentCall an Agent exposing the AG-UI protocol from a React website via CopilotKit
Strands AgentsTypeScriptModel Context Protocol
TypeScript Agent to MCPConnect a TypeScript Agent to an MCP server
Strands AgentsTypeScriptAgent2Agent
TypeScript Agent to A2A AgentConnect a TypeScript Agent to a remote A2A agent
Strands AgentsPythonAgent2Agent
Python Agent to A2A AgentConnect a Python Agent to a remote A2A agent
Strands AgentsTypeScriptAmazon Aurora
TypeScript Agent to Relational DatabaseConnect a TypeScript Agent to an Aurora relational database
Strands AgentsTypeScriptAmazon DynamoDB
TypeScript Agent to TypeScript DynamoDBConnect a TypeScript Agent to a DynamoDB table
Strands AgentsTypeScriptAmazon Bedrock AgentCore Gateway
TypeScript Agent to AgentCore GatewayConnect a TypeScript Agent to an AgentCore Gateway
Amazon Bedrock AgentCore GatewayStrands Agents
AgentCore Gateway to AgentFront an agent with an AgentCore Gateway as a runtime target