Pular para o conteúdo

Python Agent

Gere um agente de IA Python para construir agentes com ferramentas e, opcionalmente, implante-o no Amazon Bedrock AgentCore Runtime. Escolha o framework do agente com a opção framework: Strands (o padrão) ou LangChain (construído sobre LangGraph).

O gerador expõe seu agente através de um protocol de servidor. Ambos os frameworks suportam HTTP (o padrão), o protocolo Agent-to-Agent (A2A) para interoperabilidade com outros agentes compatíveis com A2A, e o protocolo AG-UI para integração direta com frontend via CopilotKit.

Você pode gerar um Python Agent de duas maneiras:

Execute este gerador@aws/nx-plugin:py#agent

pnpm nx g @aws/nx-plugin:py#agent
Monte seu comando9

Obrigatório

infra = agentcore | agentcore-ecr

Opções do gerador9 opções
projectObrigatóriostring

O projeto ao qual adicionar o Agent

frameworkenumPadrão: strands

O SDK do agente a ser usado.

strandslangchain
authenuminfra = agentcore | agentcore-ecrPadrão: iam

O método usado para autenticar com seu Agent. Aplicável apenas quando infra está definido (ignorado quando infra é none).

iamcognito
protocolenumPadrão: http

O protocolo do servidor para o seu Agent. HTTP expõe um servidor HTTP FastAPI. A2A expõe um servidor de protocolo Agent-to-Agent. AG-UI expõe um servidor de protocolo Agent-User Interaction para integração direta com frontend.

httpa2aag-ui
iacenumPadrão: inherit

O provedor IaC preferido. Por padrão, isso é herdado da sua seleção inicial.

inheritcdkterraform
infraenumPadrão: agentcore

O tipo de infraestrutura para hospedar seu Agent. agentcore implanta seu código como um zip em um runtime gerenciado pelo AgentCore para o ciclo de build e deploy mais rápido. agentcore-ecr constrói e hospeda uma imagem de contêiner, para controle em nível de sistema operacional ou um pipeline de contêiner estabelecido.

agentcoreagentcore-ecrnone
sessionenumPadrão: s3

O armazenamento usado para persistir a sessão do seu Agent. LangChain oferece suporte a 's3' ou 'dynamodb-s3'; Strands oferece suporte a 's3'; 'in-memory' é válido para ambos.

s3dynamodb-s3in-memory
namestring

O nome do seu Agent (padrão: agent)

preferInstallDependenciesbooleanPadrão: true

Se deve preferir instalar dependências após a execução do gerador. Defina como false para adiar a instalação ao executar múltiplos geradores em lote (uma instalação ainda é executada se necessário para que geradores subsequentes possam computar o grafo de projetos Nx); instale uma vez no final.

O gerador adicionará os seguintes arquivos ao seu projeto Python existente. Os arquivos gerados dependem do protocol escolhido:

protocol = http
  • Directoryyour-project/
    • Directoryyour_module/
      • Directoryagent/ (or custom name if specified)
        • __init__.py Python package initialization
        • init.py FastAPI application setup with CORS and error handling middleware
        • agent.py Main agent definition with sample tools
        • session.py Resolves the framework-specific session persistence implementation
        • Directorymiddleware/
          • __init__.py Python package initialization
          • session_id_middleware.py Binds the inbound AgentCore session ID for the request
        • main.py FastAPI entry point for Bedrock AgentCore Runtime
        • Dockerfile Container image definition (only when infra is agentcore-ecr)
    • pyproject.toml Updated with Strands dependencies
    • project.json Updated with agent serve targets
protocol = a2a

O ponto de entrada expõe seu agente através do protocolo A2A (Strands usa o Strands A2A Server; LangChain envolve o grafo em um executor a2a-sdk), montado em uma aplicação FastAPI:

  • Directoryyour-project/
    • Directoryyour_module/
      • Directoryagent/ (or custom name if specified)
        • __init__.py Python package initialization
        • agent.py Main agent definition with sample tools
        • session.py Resolves the framework-specific session persistence implementation
        • Directorymiddleware/
          • __init__.py Python package initialization
          • session_id_middleware.py Binds the inbound AgentCore session ID for the request
        • main.py A2A server entry point
        • Dockerfile Container image definition (only when infra is agentcore-ecr)
    • pyproject.toml Updated with framework and A2A dependencies
    • project.json Updated with agent serve targets
protocol = ag-ui

O ponto de entrada expõe seu agente através do protocolo AG-UI para integração direta com frontend usando CopilotKit. Agentes Strands usam a integração ag-ui-strands; agentes LangChain usam ag-ui-langgraph:

  • Directoryyour-project/
    • Directoryyour_module/
      • Directoryagent/ (or custom name if specified)
        • __init__.py Python package initialization
        • agent.py Main agent definition with sample tools
        • session.py Resolves the framework-specific session persistence implementation
        • Directorymiddleware/
          • __init__.py Python package initialization
          • session_id_middleware.py Binds the inbound AgentCore session ID for the request
        • main.py AG-UI server entry point
        • Dockerfile Container image definition (only when infra is agentcore-ecr)
    • pyproject.toml Updated with framework and AG-UI dependencies
    • project.json Updated with agent serve targets

A opção infra seleciona como seu código é empacotado e hospedado no Amazon Bedrock AgentCore Runtime:

  • agentcore (padrão) usa implantação direta de código: seu código compilado é empacotado como um .zip, enviado para o S3 e executado em um runtime de linguagem gerenciado pelo AgentCore. Não há imagem de contêiner para construir, nenhum repositório ECR para gerenciar e nenhuma imagem para enviar, o que resulta em um ciclo de compilação e implantação substancialmente mais rápido.
  • agentcore-ecr constrói uma imagem de contêiner arm64 a partir de um Dockerfile fornecido e a hospeda no registro compartilhado core/asset-ecr, juntamente com todos os outros contêineres no workspace. Escolha esta opção quando você precisar de controle sobre a imagem do sistema operacional — por exemplo, para instalar bibliotecas nativas do sistema — ou quando você tiver um pipeline de contêiner estabelecido. Esta opção também fornece um alvo de varredura de imagem Trivy (veja Varredura de Imagem abaixo).
  • none não gera nenhuma infraestrutura, então o projeto só pode ser executado localmente.
infra = agentcore | agentcore-ecr

Como este gerador fornece infraestrutura como código baseada no seu iac escolhido, ele criará um projeto em packages/common que inclui os constructs CDK relevantes ou módulos Terraform.

O projeto comum de infraestrutura como código é estruturado da seguinte forma:

  • Directorypackages/common/constructs
    • Directorysrc
      • Directoryapp/ Constructs for infrastructure specific to a project/generator
      • Directorycore/ Generic constructs which are reused by constructs in app
      • index.ts Entry point exporting constructs from app
    • project.json Project build targets and configuration

Para implantar seu Agente, os seguintes arquivos são gerados:

  • Directorypackages/common/constructs/src
    • Directoryapp
      • Directoryagents
        • Directory<agent-name>
          • <agent-name>.ts CDK construct for deploying your agent
infra = none

Se você selecionou none para infra, nenhum construto CDK ou módulo Terraform é gerado — o Agente só pode ser executado localmente. A opção auth é ignorada neste modo, pois não há endpoint hospedado para autenticar.

Quando implantado no Bedrock AgentCore Runtime, o código do seu agente é empacotado como um zip e executado no runtime gerenciado do AgentCore. Os clientes invocam o endpoint do plano de dados do AgentCore Runtime, que encaminha as solicitações para o seu agente. O agente chama o Amazon Bedrock para inferência de modelo e pode invocar ferramentas, servidores MCP ou APIs downstream.

Loading the diagram…

Você pode editar agent.py para adicionar ferramentas, configurar o modelo e personalizar o prompt do sistema. A API depende do framework que você escolheu.

Ferramentas são funções que o agente de IA pode chamar para executar ações. Ambos os frameworks usam uma abordagem baseada em decoradores para definir ferramentas, derivam o nome e a descrição da ferramenta do nome da função e da docstring, e geram o esquema de entrada a partir de suas dicas de tipo.

Defina a ferramenta e, em seguida, adicione-a à lista tools dentro de get_agent():

packages/my-project/my_module/agent/agent.py
from contextlib import contextmanager
from strands import Agent, tool
from strands.hooks import HookCallback, HookProvider
from strands_tools import current_time
from my_scope_agent_connection import log_model_errors, log_tool_errors
from .session import get_session_manager
@tool
def subtract(a: int, b: int) -> int:
return a - b
@tool
def get_weather(city: str) -> str:
"""Get weather information for a city"""
# Your weather API integration here
return f"Weather in {city}: Sunny, 25°C"
AGENT_HOOKS: list[HookProvider | HookCallback] = [log_model_errors, log_tool_errors]
@contextmanager
def get_agent():
yield Agent(
name="MyAgent",
description="MyAgent Strands Agent",
system_prompt="You are a helpful assistant with access to various tools.",
tools=[subtract, current_time, get_weather],
hooks=AGENT_HOOKS,
session_manager=get_session_manager(),
)

Strands fornece uma coleção de ferramentas pré-construídas através do pacote strands-agents-tools, que o gerador já adiciona ao pyproject.toml do seu projeto. Importe as ferramentas que você deseja e adicione-as a get_agent():

packages/my-project/my_module/agent/agent.py
from strands_tools import current_time, file_read, http_request
# ...
@contextmanager
def get_agent():
yield Agent(
name="MyAgent",
description="MyAgent Strands Agent",
system_prompt="You are a helpful assistant.",
tools=[current_time, file_read, http_request],
hooks=AGENT_HOOKS,
session_manager=get_session_manager(),
)

O agente gerado usa o modelo Strands padrão no Amazon Bedrock. Para configurá-lo, passe um model para o Agent. Consulte a documentação Strands sobre provedores de modelo para os provedores disponíveis e suas opções:

packages/my-project/my_module/agent/agent.py
from strands.models import BedrockModel
# ...
MODEL = BedrockModel(
model_id="anthropic.claude-sonnet-4-20250514-v1:0",
region_name="us-west-2",
temperature=0.3,
)
@contextmanager
def get_agent():
yield Agent(
model=MODEL,
name="MyAgent",
description="MyAgent Strands Agent",
system_prompt="You are a helpful assistant.",
tools=[subtract, current_time],
hooks=AGENT_HOOKS,
session_manager=get_session_manager(),
)

Para consumir Servidores MCP que você criou usando os geradores py#mcp-server ou ts#mcp-server, você pode usar o gerador connection, que conecta as ferramentas do servidor MCP ao seu agente para ambos os frameworks.

Execute este gerador@aws/nx-plugin:connection

pnpm nx g @aws/nx-plugin:connection
Monte seu comando5

Obrigatório

Obrigatório

Consulte o guia do gerador connection para detalhes sobre como a conexão é configurada.

Para outros servidores MCP, consulte a documentação MCP do Strands ou LangChain.

Para um guia mais aprofundado sobre como escrever agentes, consulte a documentação do Strands ou LangChain.

O protocolo do servidor do seu agente determina como ele se comunica. Todas as opções são servidas por FastAPI — o ponto de entrada difere:

  • HTTP (padrão): Um servidor FastAPI padrão com um endpoint /invocations personalizado, CORS e streaming. Melhor para integrações de cliente personalizadas.
  • A2A: Um servidor Agent-to-Agent montado em uma aplicação FastAPI (Strands usa o Strands A2A Server; LangChain usa o a2a-sdk agnóstico de framework). Melhor quando seu agente precisa ser descoberto e invocável por outros agentes compatíveis com A2A.
  • AG-UI: O protocolo AG-UI sobre SSE (Strands usa ag-ui-strands; LangChain usa ag-ui-langgraph). Melhor para integração direta com frontend usando CopilotKit em um site React.

O ponto de entrada do servidor difere por framework (Strands produz um Agent gerenciado por contexto, enquanto LangChain conduz um grafo create_agent compilado), mas o contrato externo para cada protocolo é o mesmo.

Todos os protocolos expõem /ping para o contrato de verificação de saúde do runtime AgentCore. Agentes A2A escutam na porta 9000; agentes HTTP e AG-UI escutam na porta 8080. A infraestrutura gerada é configurada para você.

protocol = http

O servidor HTTP gerado inclui:

  • Configuração da aplicação FastAPI com middleware CORS
  • Middleware de tratamento de erros
  • Geração de esquema OpenAPI
  • Endpoint de verificação de saúde (/ping)
  • Endpoint de invocação do agente (/invocations)

Personalizando Entradas e Saídas de Invocação com Pydantic

Seção intitulada “Personalizando Entradas e Saídas de Invocação com Pydantic”

O endpoint de invocação do agente usa modelos Pydantic para definir e validar os esquemas de solicitação e resposta. Você pode personalizar esses modelos em main.py para corresponder aos requisitos do seu agente.

O modelo InvokeInput padrão aceita um prompt.

from pydantic import BaseModel, Field
class InvokeInput(BaseModel):
prompt: str = Field(max_length=100000)

Você pode estender este modelo para incluir quaisquer campos adicionais que seu agente precise.

O ID da sessão é extraído do cabeçalho HTTP x-amzn-bedrock-agentcore-runtime-session-id, consistente com o contrato de sessão do Bedrock AgentCore Runtime. Se o cabeçalho não for fornecido, um UUID aleatório é gerado como fallback.

Para respostas de streaming, o gerador fornece JsonStreamingResponse que serializa automaticamente modelos Pydantic para o formato JSON Lines (application/jsonl). Este formato é compatível com a especificação de streaming do OpenAPI 3.2 e funciona perfeitamente com o cliente TypeScript gerado.

Por padrão, o agente produz objetos StreamChunk contendo o texto de resposta do agente:

class StreamChunk(BaseModel):
content: str

Você pode personalizar o modelo StreamChunk para atender às suas necessidades:

from pydantic import BaseModel
class StreamChunk(BaseModel):
content: str
timestamp: str
token_count: int

Há uma solicitação de recurso aberta para suporte nativo no FastAPI.

O gerador inclui uma dependência no Bedrock AgentCore Python SDK para as constantes PingStatus. Se desejar, é simples usar BedrockAgentCoreApp em vez de FastAPI, no entanto, note que a segurança de tipo é perdida.

Você pode encontrar mais detalhes sobre as capacidades do SDK na documentação aqui.

protocol = a2a

O main.py gerado monta um servidor A2A em uma aplicação FastAPI pai que também expõe /ping. Agentes Strands usam o A2AServer do Strands; agentes LangChain envolvem o grafo compilado em um AgentExecutor a2a-sdk. A URL anunciada no cartão do agente vem da variável de ambiente AGENTCORE_RUNTIME_URL, recorrendo a http://localhost:<port>/ para desenvolvimento local.

A maioria dos usuários não precisará modificar este arquivo; edite agent.py para alterar ferramentas ou o prompt do sistema. O servidor A2A preenche o cartão do agente (/.well-known/agent-card.json) a partir do name e description do agente.

protocol = ag-ui

O main.py gerado expõe um único endpoint POST que transmite eventos AG-UI através de Server-Sent Events (SSE), bem como /ping para a verificação de saúde do runtime AgentCore. A conexão depende do framework:

  • Strands: envolve seu Agent em um ag_ui_strands.StrandsAgent, construído dentro de um manipulador lifespan do FastAPI (para que a construção aconteça na inicialização do contêiner/sessão em vez do tempo de importação), e servido de um loop /invocations FastAPI feito à mão.
  • LangChain: envolve o grafo compilado em um ag_ui_langgraph.LangGraphAgent, construído da mesma forma dentro de lifespan, e servido de um loop /invocations FastAPI feito à mão.

A maioria dos usuários não precisará modificar este arquivo — edite agent.py para alterar ferramentas ou o prompt do sistema.

Para executar seu Agente (e tudo conectado a ele) localmente, use o target dev do projeto:

Terminal window
pnpm nx dev your-project

Se você adicionou vários componentes ao seu projeto (agentes, servidores MCP, etc.), isso inicia todos eles. Para executar apenas este agente, direcione seu target <your-agent-name>-dev:

Terminal window
pnpm nx agent-dev your-project

Isso usa uv run para executar seu Agente usando o Bedrock AgentCore Python SDK.

O agente escuta em uma porta atribuída do pool do workspace quando foi gerado. Leia-a de metadata.ports no project.json do projeto, ou da flag --port no comando do target <your-agent-name>-dev. Os exemplos abaixo usam 8081, a porta que um primeiro agente HTTP recebe em um workspace novo.

Um target <your-agent-name>-serve também é gerado, que executa o agente contra sua infraestrutura implantada e, portanto, requer que RUNTIME_CONFIG_APP_ID seja definido. Consulte o guia Desenvolvimento Local para a diferença entre dev e serve.

O gerador configura um target Nx <your-agent-name>-chat que o coloca em um chat interativo de terminal com seu agente.

O target de chat é executado de forma independente. Por padrão, ele se conecta ao seu agente em execução local, então inicie o target <your-agent-name>-dev do agente primeiro (em um terminal separado):

Terminal window
pnpm nx agent-dev your-project

Em seguida, em outro terminal, inicie o chat:

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

O gerador emite um scripts/<your-agent-name>/chat.ts para cada protocolo. Ele se conecta ao agente local por padrão, ou ao seu agente implantado quando RUNTIME_CONFIG_APP_ID está definido (veja Conversar com seu agente implantado abaixo).

protocol = http

Para agentes HTTP, o script de chat usa um cliente TypeScript type-safe gerado a partir da especificação OpenAPI do agente. O gerador também emite:

  • scripts/<your_agent_name>_openapi.py — um pequeno script que exporta a especificação OpenAPI do agente (nomeado com o nome do seu agente em snake_case)
  • Um target Nx <your-agent-name>-openapi que o executa
  • Um target Nx <your-agent-name>-generate-client que produz um cliente TypeScript type-safe em scripts/<your-agent-name>/generated/

Quando você personaliza a forma de entrada do agente (por exemplo, adiciona novos campos a InvokeInput), atualize chat.ts para passar os novos campos ao invocar o agente e o resto funciona automaticamente.

infra = agentcore | agentcore-ecr

Para conversar com seu agente implantado no Bedrock AgentCore, defina a variável de ambiente RUNTIME_CONFIG_APP_ID para o id da aplicação AppConfig da implantação (saída como RuntimeConfigApplicationId pela stack implantada). O script de chat resolve o ARN do runtime do seu agente a partir da configuração do runtime e se conecta ao endpoint implantado:

Para agentes autenticados por IAM, as requisições são assinadas com SigV4 usando suas credenciais AWS padrão. Certifique-se de que o ambiente tenha credenciais AWS com permissão para invocar o runtime:

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

Implantando Seu Agente no Bedrock AgentCore Runtime

Seção intitulada “Implantando Seu Agente no Bedrock AgentCore Runtime”

Se você selecionou agentcore ou agentcore-ecr para infra, a infraestrutura CDK ou Terraform relevante é gerada, que você pode usar para implantar seu Agent no Amazon Bedrock AgentCore Runtime.

Um construto CDK é gerado para seu agent, nomeado com base no name que você escolheu ao executar o gerador, ou <ProjectName>Agent por padrão.

Você pode usar este construto CDK em uma aplicação CDK:

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

O gerador fornece uma opção auth para configurar a autenticação para seu Agent. Você pode escolher entre autenticação IAM (padrão) ou Cognito ao gerar seu agent.

Por padrão, seu Agent será protegido usando autenticação IAM, simplesmente implante-o sem nenhum argumento:

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

Você pode conceder acesso para invocar seu agent no Bedrock AgentCore Runtime usando o método grantInvokeAccess, por exemplo:

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);
}
}

Quando você seleciona autenticação Cognito, o gerador configura o agent para usar Cognito para autenticação.

O construto gerado aceita uma prop identity que configura a autenticação 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,
});
}
}

O construto UserIdentity pode ser gerado usando o gerador ts#website#auth, ou você pode criar seu próprio UserPool e UserPoolClient CDK.

Para construir seu Agente para o Bedrock AgentCore Runtime, um target bundle é adicionado ao seu projeto, que:

  • Exporta suas dependências Python para um arquivo requirements.txt usando uv export
  • Instala dependências para a plataforma de destino (aarch64-manylinux_2_28) usando uv pip install
infra = agentcore

Um target <your-agent-name>-package também é adicionado, que monta o pacote de código implantável: o bundle de dependências aarch64, sua árvore de módulos Python e um ponto de entrada main.py raiz. A infraestrutura gerada faz upload deste diretório como um .zip — via AgentRuntimeArtifact.fromCodeAsset no CDK, ou arquivado no bucket de ativos compartilhado no Terraform.

infra = agentcore-ecr

Um target docker específico para seu Agente também é adicionado, que copia o Dockerfile e os artefatos empacotados em um diretório de contexto docker. Isso coloca o Dockerfile junto com a saída construída, permitindo que o CDK construa a imagem Docker diretamente usando AgentRuntimeArtifact.fromAsset.

A imagem Docker construída para este projeto pode ser verificada em busca de vulnerabilidades usando Trivy, executando a partir da imagem Trivy hospedada no ECR.

Um target trivy é adicionado ao seu projeto que verifica a imagem construída e sai com código diferente de zero se alguma vulnerabilidade de severidade HIGH ou CRITICAL for encontrada. O Dockerfile gerado usa uma imagem base sem vulnerabilidades corrigíveis conhecidas dessas severidades no momento da geração, e atualiza as ferramentas incluídas (como npm) para mantê-lo assim.

A verificação usa o mesmo mecanismo de contêiner que sua construção de imagem (docker ou finch), portanto nenhuma ferramenta adicional é necessária. A verificação não é armazenada em cache, pois a imagem que ela lê reside no mecanismo de contêiner em vez de no disco — então ela sempre verifica a imagem real e falha de forma explícita em vez de relatar uma aprovação em cache para uma imagem que não está mais lá. Cada execução, portanto, leva dezenas de segundos por imagem e atualiza o banco de dados de vulnerabilidades do Trivy, então ela precisa de acesso à rede. O script raiz trivy fornecido verifica todas as imagens no workspace:

Terminal window
pnpm trivy

Pode haver casos em que você deseja suprimir uma vulnerabilidade específica, por exemplo, quando nenhuma correção está disponível ainda e você avaliou o risco como aceitável.

Adicione o ID da vulnerabilidade (um por linha) ao arquivo .trivyignore na raiz do seu projeto (ou seja, ao lado do seu project.json):

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

Para mais detalhes sobre filtragem de descobertas, consulte a documentação de filtragem do Trivy.

Seu agente é automaticamente configurado com observabilidade usando o AWS Distro for Open Telemetry (ADOT).

Você pode encontrar traces no Console AWS do CloudWatch, selecionando “GenAI Observability” no menu. Note que para que os traces sejam preenchidos, você precisará habilitar Transaction Search.

Para mais detalhes, consulte a documentação do AgentCore sobre observabilidade.

A opção session mapeia para um conceito de persistência subjacente diferente dependendo do framework escolhido: o conceito de gerenciamento de sessão do Strands para o framework strands, ou o conceito de checkpointer do LangGraph para o framework langchain.

framework = strands

A opção session controla como seu agente persiste o estado da conversa (histórico de mensagens, estado da ferramenta, etc.) entre invocações, usando o SessionManager do SDK Strands:

  • s3 (padrão): A infraestrutura CDK/Terraform provisiona um bucket S3 dedicado para dados de sessão, criptografado com uma chave KMS dedicada e com todo acesso público bloqueado; logs de acesso ao servidor são entregues a um grupo de logs do CloudWatch Logs através da mesma chave. A função IAM do agente recebe acesso de leitura/escrita/listagem/exclusão ao bucket e acesso de descriptografia/geração-de-chave-de-dados à chave, e o nome do bucket é registrado junto com o ARN do agente na configuração do runtime do AppConfig.
  • in-memory: Nenhum bucket é provisionado. O estado da conversa é mantido apenas na memória durante o tempo de vida do processo em execução e não sobrevive a reinicializações ou scale-in.

Isso é implementado no session.py gerado, que exporta uma função get_session_manager() resolvendo um SessionManager para a sessão atual.

O próprio ID da sessão vem da sessão do AgentCore Runtime (propagada através do cabeçalho x-amzn-bedrock-agentcore-runtime-session-id) e é vinculado a um contexto baseado em contextvars.ContextVar para que get_current_session_id() possa resolvê-lo em qualquer lugar na requisição — incluindo em quaisquer clientes MCP ou A2A downstream conectados através do gerador connection, para que toda a cadeia de chamadas compartilhe uma sessão consistente.

O ID da sessão vem do chamador, então por si só ele identifica uma conversa, mas não a quem a conversa pertence. O AgentCore Runtime autoriza uma invocação contra o ARN do recurso do runtime do agente, em vez de contra uma sessão individual, o que deixa o agente livre para decidir o que uma sessão significa para sua aplicação.

Para restringir cada usuário às suas próprias conversas:

  1. Adicione uma API para criar uma sessão, usando tRPC, FastAPI ou Smithy. Gere um ID de sessão opaco (pelo menos 33 caracteres) e armazene-o junto com o ID do usuário chamador — por exemplo, em uma tabela criada com o gerador py#dynamodb. Cada guia de API mostra como recuperar o ID do usuário chamador.
  2. No seu agente, procure o ID do usuário armazenado para o ID da sessão que foi fornecido e rejeite a requisição quando não corresponder ao chamador. Com auth=cognito, o JWT do chamador chega ao código do seu agente, então sua claim sub os identifica.

Gere o ID da sessão em vez de derivá-lo de valores fornecidos pelo usuário, como um nome de conversa — qualquer coisa que um chamador possa prever, um chamador pode enviar.

framework = langchain

A opção session controla como o checkpointer LangGraph do seu agente persiste o estado da conversa:

  • s3 (padrão): O agente implantado usa um S3CheckpointSaver com o bucket de sessão provisionado, armazenando checkpoints e escritas pendentes sob o prefixo checkpoints/. Esta classe reside em s3_checkpoint_saver_langchain.py no projeto compartilhado de conexão de agente.
  • dynamodb-s3: A infraestrutura CDK/Terraform provisiona uma tabela DynamoDB para checkpoints, configurada conforme recomendado na documentação AWS sobre o uso do DynamoDB como armazenamento de checkpoint para agentes LangGraph (esquema unificado PK/SK, cobrança PAY_PER_REQUEST, recuperação point-in-time e um atributo ttl), mais um bucket S3 para descarregar checkpoints acima de 350KB. Ambos são criptografados com uma chave KMS dedicada; os logs de acesso ao servidor do bucket são entregues a um grupo de logs do CloudWatch Logs através da mesma chave. A função IAM do agente recebe acesso de leitura/escrita à tabela e ao bucket, e os nomes da tabela/bucket são registrados junto com o ARN do agente na configuração do runtime do AppConfig.
  • in-memory: Nenhuma tabela ou bucket é provisionado. O estado da conversa é mantido apenas na memória durante o tempo de vida do processo em execução e não sobrevive a reinicializações ou scale-in.

Isso é implementado no session.py gerado, que exporta uma função get_checkpointer() chamada de create_agent(..., checkpointer=get_checkpointer()) em agent.py.

protocol = http

Inicie seu agente com o target <your-agent-name>-dev:

Terminal window
pnpm nx agent-dev your-project

Em seguida, envie uma requisição POST para /invocations na porta em que seu agente local está sendo executado. Substitua a porta atribuída ao seu agente — leia-a de metadata.ports no project.json do projeto, ou da flag --port no comando do target <your-agent-name>-dev. Um primeiro agente HTTP em um workspace novo recebe 8081:

Janela do terminal
curl -N -X POST http://localhost:8081/invocations \
-d '{"prompt": "what is 3 + 5?"}' \
-H "Content-Type: application/json"

Para invocar seu Agent implantado no Bedrock AgentCore Runtime, você pode enviar uma requisição POST para o endpoint do dataplane do Bedrock AgentCore Runtime com seu ARN codificado em URL.

Você pode obter o ARN do runtime da sua infraestrutura da seguinte forma:

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,
});
}
}

O ARN terá o seguinte formato: arn:aws:bedrock-agentcore:<region>:<account>:runtime/<agent-runtime-id>.

Você pode então codificar o ARN em URL substituindo : por %3A e / por %2F.

A URL do dataplane do Bedrock AgentCore Runtime para invocar o agent é a seguinte:

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

A forma exata de invocar esta URL depende do método de autenticação usado.

Para Autenticação IAM, a requisição deve ser assinada usando AWS Signature Version 4 (SigV4).

Janela do terminal
acurl <region> bedrock-agentcore -N -X POST \
'https://bedrock-agentcore.<region>.amazonaws.com/runtimes/<url-encoded-arn>/invocations' \
-d '{"prompt": "what is 3 + 5?"}' \
-H 'Content-Type: application/json'
Click here for more details on configuring the above acurl command

Para invocar seu Agente de um site React, você pode usar o gerador connection, que configura automaticamente um cliente com a autenticação correta (IAM ou Cognito).

Execute este gerador@aws/nx-plugin:connection

pnpm nx g @aws/nx-plugin:connection
Monte seu comando5

Obrigatório

Obrigatório

Consulte o guia do gerador connection para detalhes sobre como a conexão é configurada.

protocol = a2a

Para delegar trabalho deste agente para um agente A2A remoto (seja TypeScript ou Python), use o gerador connection. Ele fornece um cliente autenticado por SigV4 para o agente de destino e transforma por AST o agent.py deste agente para registrar o agente A2A remoto como um delegado decorado com @tool.

Execute este gerador@aws/nx-plugin:connection

pnpm nx g @aws/nx-plugin:connection
Monte seu comando5

Obrigatório

Obrigatório

Consulte o guia do gerador connection para detalhes sobre como a conexão é configurada.

protocol = ag-ui

Para invocar seu agente AG-UI de um site React, use o gerador connection, que conecta um cliente CopilotKit configurado para seu agente implantado com a autenticação correta (IAM ou Cognito).

Execute este gerador@aws/nx-plugin:connection

pnpm nx g @aws/nx-plugin:connection
Monte seu comando5

Obrigatório

Obrigatório

Consulte o guia do gerador connection para detalhes sobre como a conexão é configurada.

Agents atuam em entradas não confiáveis e podem executar ações reais através de suas ferramentas, por isso vale a pena considerar a segurança desde o início. As práticas a seguir se aplicam ao agent gerado.

Trate a entrada e saída do modelo como não confiáveis

Seção intitulada “Trate a entrada e saída do modelo como não confiáveis”

Prompts podem conter instruções adversárias (injeção de prompt), e a saída do modelo é não determinística — nenhuma delas deve ser confiável em lógica sensível à segurança:

  • Defina esquemas de entrada estritos para suas ferramentas, como no exemplo de ferramenta gerado. Restrinja valores ao que a ferramenta realmente precisa (enums, limites de comprimento, intervalos numéricos) em vez de aceitar strings de formato livre.
  • Nunca passe a saída do modelo diretamente para comandos shell, consultas SQL, avaliação de código ou HTML renderizado sem validação ou codificação.
  • Aplique verificações de autorização em suas ferramentas e serviços downstream — não confie no prompt do sistema para impedir que o modelo use indevidamente uma ferramenta à qual ele tem acesso.

Os guias de Prompt Engineering e Responsible AI do Strands cobrem como escrever prompts de sistema robustos e conscientes da segurança.

Defina permissões de ferramentas de forma restrita

Seção intitulada “Defina permissões de ferramentas de forma restrita”

Conceda à role IAM do agent apenas as permissões que suas ferramentas precisam. Os constructs CDK e módulos Terraform fornecidos expõem métodos grant* e políticas com escopo definido para esse propósito — por exemplo, concedendo a um agent acesso para invocar uma API específica em vez de anexar políticas gerenciadas amplas. Quando uma ferramenta age em nome de um usuário, prefira autorizar a ação usando a identidade do usuário chamador (passada através do contexto da solicitação) em vez das permissões ambientes do próprio agent.

Como o comportamento do modelo pode mudar de maneiras inesperadas, planeje desabilitar ou trocar o modelo rapidamente sem uma mudança de código:

  • Leia o ID do modelo da configuração (por exemplo, uma variável de ambiente MODEL_ID) para que os operadores possam alternar ou reverter para um modelo diferente atualizando a configuração.
  • Coloque o agent atrás de uma feature flag para que sua funcionalidade de IA possa ser desabilitada completamente. Quando desabilitado, retorne uma mensagem genérica em vez de um erro, e garanta que o restante da sua aplicação degrade graciosamente.

Documente como acionar esses controles no seu runbook operacional.

  • Evite registrar prompts e completions, que podem conter dados do usuário. O hook de registro de erros do modelo do agent gerado registra apenas metadados de erro, não o conteúdo da conversa — mantenha essa propriedade ao adicionar seu próprio registro.
  • Retorne mensagens de erro genéricas aos usuários; registre erros detalhados no lado do servidor.
  • Isole o estado da conversa entre usuários e sessões, e autorize o acesso a quaisquer dados de sessão persistidos.
  • Remova informações pessoalmente identificáveis (PII) de prompts e saídas — seja com um filtro de informações sensíveis do Bedrock Guardrail (abaixo) ou, para agents Strands, as abordagens no guia PII Redaction.

Amazon Bedrock Guardrails fornecem filtros de conteúdo configuráveis, tópicos negados e filtros de informações sensíveis (PII) que são avaliados na entrada e saída do modelo. Você pode anexar um guardrail ao modelo usado pelo agent gerado:

agent.py
import os
from strands import Agent
from strands.models import BedrockModel
model = BedrockModel(
model_id=os.environ.get("MODEL_ID"),
guardrail_id=os.environ["GUARDRAIL_ID"],
guardrail_version=os.environ.get("GUARDRAIL_VERSION", "DRAFT"),
)
agent = Agent(model=model)

Consulte o guia de Guardrails do Strands para mais detalhes.

Use o gerador connection para integrar este projeto com outros em seu workspace. As seguintes conexões envolvem este projeto:

Strands AgentsPython
React to Python AgentCall a Python 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 AgentsPythonModel Context Protocol
Python Agent to MCPConnect a Python Agent to an MCP server
Strands AgentsPythonAgent2Agent
Python Agent to A2A AgentConnect a Python Agent to a remote A2A agent
Strands AgentsTypeScriptAgent2Agent
TypeScript Agent to A2A AgentConnect a TypeScript Agent to a remote A2A agent
Strands AgentsPythonAmazon DynamoDBPython
Python Agent to Python DynamoDBConnect a Python Agent to a DynamoDB table
Strands AgentsPythonAmazon Bedrock AgentCore Gateway
Python Agent to AgentCore GatewayConnect a Python Agent to an AgentCore Gateway
Amazon Bedrock AgentCore GatewayStrands Agents
AgentCore Gateway to AgentFront an agent with an AgentCore Gateway as a runtime target