Pular para o conteúdo

Agente de Strands em Python

Gere um Agente Strands em Python para construir agentes de IA com ferramentas, e opcionalmente implante-o no Amazon Bedrock AgentCore Runtime. Por padrão, o gerador usa FastAPI para expor um servidor HTTP. Alternativamente, você pode escolher o protocolo Agent-to-Agent (A2A) para interoperabilidade com outros agentes compatíveis com A2A, ou o protocolo AG-UI para integração direta com frontend via CopilotKit.

Strands é um framework Python leve e pronto para produção para construção de agentes de IA. Principais recursos incluem:

  • Leve e personalizável: Loop de agente simples que não atrapalha
  • Pronto para produção: Observabilidade completa, tracing e opções de implantação para escala
  • Agnóstico de modelo e provedor: Suporte a diversos modelos de vários provedores
  • Ferramentas comunitárias: Conjunto poderoso de ferramentas contribuídas pela comunidade
  • Suporte a multiagentes: Técnicas avançadas como equipes de agentes e agentes autônomos
  • Modos de interação flexíveis: Suporte a conversacional, streaming e não-streaming

Você pode gerar um Agente Strands em Python de duas formas:

  1. Instale o Nx Console VSCode Plugin se ainda não o fez
  2. Abra o console Nx no VSCode
  3. Clique em Generate (UI) na seção "Common Nx Commands"
  4. Procure por @aws/nx-plugin - py#strands-agent
  5. Preencha os parâmetros obrigatórios
    • Clique em Generate
    Parâmetro Tipo Padrão Descrição
    project Obrigatório string - O projeto ao qual adicionar o Strands Agent
    computeType string BedrockAgentCoreRuntime O tipo de computação para hospedar seu Strands Agent.
    name string - O nome do seu Strands Agent (padrão: agent)
    auth string IAM O método usado para autenticar com seu Strands Agent. Escolha entre IAM (padrão) ou Cognito.
    protocol string HTTP O protocolo do servidor para o seu Strands 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.
    iacProvider string Inherit O provedor de IaC preferido. Por padrão, isso é herdado da sua seleção inicial.

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

    • Directoryyour-project/
      • Directoryyour_module/
        • Directoryagent/ (ou nome personalizado se especificado)
          • __init__.py Inicialização do pacote Python
          • init.py Configuração da aplicação FastAPI com middleware CORS e tratamento de erros
          • agent.py Definição principal do agente com ferramentas de exemplo
          • main.py Ponto de entrada FastAPI para Bedrock AgentCore Runtime
          • Dockerfile Ponto de entrada para hospedar seu agente (excluído quando computeType é None)
      • pyproject.toml Atualizado com dependências do Strands
      • project.json Atualizado com alvos de serviço do agente

    Quando protocol é definido como A2A, o ponto de entrada usa o Strands A2A Server em vez do FastAPI:

    • Directoryyour-project/
      • Directoryyour_module/
        • Directoryagent/ (ou nome personalizado se especificado)
          • __init__.py Inicialização do pacote Python
          • agent.py Definição principal do agente com ferramentas de exemplo
          • main.py Ponto de entrada do servidor A2A
          • Dockerfile Ponto de entrada para hospedar seu agente (excluído quando computeType é None)
      • pyproject.toml Atualizado com dependências do Strands
      • project.json Atualizado com alvos de serviço do agente

    Quando protocol é definido como AG-UI, o ponto de entrada usa a integração ag-ui-strands, que expõe seu agente via protocolo AG-UI para integração direta com frontend usando CopilotKit:

    • Directoryyour-project/
      • Directoryyour_module/
        • Directoryagent/ (ou nome personalizado se especificado)
          • __init__.py Inicialização do pacote Python
          • agent.py Definição principal do agente com ferramentas de exemplo
          • main.py Ponto de entrada do servidor AG-UI usando ag-ui-strands
          • Dockerfile Ponto de entrada para hospedar seu agente (excluído quando computeType é None)
      • pyproject.toml Atualizado com dependências do Strands e AG-UI
      • project.json Atualizado com alvos de serviço do agente

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

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

    • Directorypackages/common/constructs
      • Directorysrc
        • Directoryapp/ Constructs para infraestrutura específica de um projeto/gerador
        • Directorycore/ Constructs genéricos reutilizados pelos constructs em app
        • index.ts Ponto de entrada exportando os constructs de app
      • project.json Metas de build e configuração do projeto

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

    • Directorypackages/common/constructs/src
      • Directoryapp
        • Directoryagents
          • Directory<project-name>
            • <project-name>.ts Construct CDK para implantar seu agente

    Ferramentas são funções que o agente de IA pode chamar para executar ações. O framework Strands usa uma abordagem simples baseada em decoradores para definir ferramentas.

    Você pode adicionar novas ferramentas no arquivo agent.py:

    from strands import Agent, tool
    @tool
    def calculate_sum(numbers: list[int]) -> int:
    """Calculate the sum of a list of numbers"""
    return sum(numbers)
    @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"
    # Add tools to your agent
    agent = Agent(
    system_prompt="You are a helpful assistant with access to various tools.",
    tools=[calculate_sum, get_weather],
    )

    O framework Strands trata automaticamente:

    • Validação de tipos baseada nas dicas de tipo da função
    • Geração de schema JSON para chamadas de ferramentas
    • Tratamento de erros e formatação de respostas

    Strands fornece uma coleção de ferramentas pré-construídas através do pacote strands-tools:

    from strands_tools import current_time, http_request, file_read
    agent = Agent(
    system_prompt="You are a helpful assistant.",
    tools=[current_time, http_request, file_read],
    )

    Por padrão, agentes Strands usam Claude 4 Sonnet, mas você pode personalizar o provedor de modelo. Consulte a documentação do Strands sobre provedores de modelos para opções de configuração:

    from strands import Agent
    from strands.models import BedrockModel
    # Create a BedrockModel
    bedrock_model = BedrockModel(
    model_id="anthropic.claude-sonnet-4-20250514-v1:0",
    region_name="us-west-2",
    temperature=0.3,
    )
    agent = Agent(model=bedrock_model)

    Você pode adicionar ferramentas de servidores MCP ao seu agente Strands.

    Para consumir servidores MCP criados usando os geradores py#mcp-server ou ts#mcp-server, você pode usar o gerador connection.

    1. Instale o Nx Console VSCode Plugin se ainda não o fez
    2. Abra o console Nx no VSCode
    3. Clique em Generate (UI) na seção "Common Nx Commands"
    4. Procure por @aws/nx-plugin - connection
    5. Preencha os parâmetros obrigatórios
      • Clique em Generate

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

      Para outros servidores MCP, consulte a Documentação do Strands.

      Para um guia mais detalhado sobre escrita de agentes Strands, consulte a documentação do Strands.

      O protocolo de servidor do seu agente determina como ele se comunica. Todas as opções são servidas pelo 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 clientes personalizados.
      • A2A: O Strands A2A Server montado em uma aplicação FastAPI. Melhor quando seu agente precisa ser descoberto e invocado por outros agentes compatíveis com A2A.
      • AG-UI: A integração ag-ui-strands, que expõe o protocolo AG-UI via SSE. Melhor para integração direta com frontend usando CopilotKit em um website React.

      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. O Dockerfile e a infraestrutura gerados são configurados para você.

      O servidor HTTP gerado inclui:

      • Configuração da aplicação FastAPI com middleware CORS
      • Middleware de tratamento de erros
      • Geração de schema 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 schemas de requisição e resposta. Você pode personalizar esses modelos em main.py para atender aos requisitos do seu agente.

      O modelo padrão InvokeInput aceita uma mensagem.

      from pydantic import BaseModel
      class InvokeInput(BaseModel):
      message: str

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

      O ID de 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 em 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

      Existe 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, porém note que a segurança de tipos é perdida.

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

      Quando protocol=A2A, o main.py gerado monta A2AServer.to_fastapi_app() em uma aplicação FastAPI pai que também expõe /ping. Quando implantado no AgentCore, o ponto de entrada resolve o ARN público do runtime do AppConfig e o anuncia no cartão do agente.

      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 popula o cartão do agente (/.well-known/agent-card.json) a partir do name e description do construtor Agent.

      Quando protocol=AG-UI, o main.py gerado envolve seu Agent Strands em um ag_ui_strands.StrandsAgent e cria uma aplicação FastAPI via create_strands_app(). A aplicação resultante expõe um único endpoint POST que transmite eventos AG-UI via Server-Sent Events (SSE), além de /ping para a verificação de saúde do runtime AgentCore.

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

      O gerador configura um alvo chamado <your-agent-name>-serve, que inicia seu Agente Strands localmente para desenvolvimento e testes.

      Terminal window
      pnpm nx agent-serve your-project

      Este comando usa uv run para executar seu Agente Strands usando o Bedrock AgentCore Python SDK.

      Implantando Seu Agente Strands no Bedrock AgentCore Runtime

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

      Se você selecionou BedrockAgentCoreRuntime para computeType, a infraestrutura CDK ou Terraform relevante é gerada, que você pode usar para implantar seu Strands Agent no Amazon Bedrock AgentCore Runtime.

      Um construto CDK é gerado para o seu agente, 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 o seu Strands Agent. Você pode escolher entre autenticação IAM (padrão) ou Cognito ao gerar seu agente.

      Por padrão, seu Strands Agent será protegido usando autenticação IAM, basta implantá-lo 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 agente 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 agente para usar Cognito para autenticação.

      O construto gerado aceita uma propriedade 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#react-website#auth, ou você pode criar seu próprio UserPool e UserPoolClient CDK.

      Para construir seu Agente Strands para o Bedrock AgentCore Runtime, um alvo 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 alvo (aarch64-manylinux_2_28) usando uv pip install

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

      Seu agente é configurado automaticamente com observabilidade usando o AWS Distro for Open Telemetry (ADOT), através da configuração de auto-instrumentação em seu Dockerfile.

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

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

      Para invocar um Agente executando localmente através do alvo <your-agent-name>-serve, você pode enviar uma requisição POST simples para /invocations na porta em que seu agente local está sendo executado. Por exemplo, com curl:

      Terminal window
      curl -N -X POST http://localhost:8081/invocations \
      -d '{"message": "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 de runtime codificado em URL.

      Você pode obter o ARN de 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 maneira 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).

      Terminal window
      acurl <region> bedrock-agentcore -N -X POST \
      'https://bedrock-agentcore.<region>.amazonaws.com/runtimes/<url-encoded-arn>/invocations' \
      -d '{"message": "what is 3 + 5?"}' \
      -H 'Content-Type: application/json'
      Clique aqui para mais detalhes sobre como configurar o comando acurl acima

      Para Autenticação Cognito, passe o Token de Acesso Cognito no cabeçalho Authorization:

      Terminal window
      curl -N -X POST 'https://bedrock-agentcore.<region>.amazonaws.com/runtimes/<url-encoded-arn>/invocations' \
      -d '{"message": "what is 3 + 5?"}' \
      -H "Content-Type: application/json" \
      -H "Authorization: Bearer <access-token>"

      Você pode obter o token de acesso usando o comando cognito-idp admin-initiate-auth da AWS CLI, por exemplo:

      Terminal window
      aws cognito-idp admin-initiate-auth \
      --user-pool-id <user-pool-id> \
      --client-id <user-pool-client-id> \
      --auth-flow ADMIN_NO_SRP_AUTH \
      --auth-parameters USERNAME=<username>,PASSWORD=<password> \
      --region <region> \
      --query 'AuthenticationResult.AccessToken' \
      --output text

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

      1. Instale o Nx Console VSCode Plugin se ainda não o fez
      2. Abra o console Nx no VSCode
      3. Clique em Generate (UI) na seção "Common Nx Commands"
      4. Procure por @aws/nx-plugin - connection
      5. Preencha os parâmetros obrigatórios
        • Clique em Generate

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

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

        1. Instale o Nx Console VSCode Plugin se ainda não o fez
        2. Abra o console Nx no VSCode
        3. Clique em Generate (UI) na seção "Common Nx Commands"
        4. Procure por @aws/nx-plugin - connection
        5. Preencha os parâmetros obrigatórios
          • Clique em Generate

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