Ir al contenido

Agente de Strands de Python

Genera un Agente Strands en Python para construir agentes de IA con herramientas, y opcionalmente desplegarlo en Amazon Bedrock AgentCore Runtime. Por defecto, el generador usa FastAPI para exponer un servidor HTTP. Alternativamente, puedes elegir el protocolo Agent-to-Agent (A2A) para interoperabilidad con otros agentes compatibles con A2A, o el protocolo AG-UI para integración directa con el frontend mediante CopilotKit.

Strands es un framework Python ligero y listo para producción para construir agentes de IA. Características clave incluyen:

  • Ligero y personalizable: Bucle de agente simple que no interfiere
  • Listo para producción: Observabilidad completa, tracing y opciones de despliegue escalables
  • Agnóstico a modelos y proveedores: Soporta múltiples modelos de distintos proveedores
  • Herramientas comunitarias: Conjunto potente de herramientas contribuidas por la comunidad
  • Soporte multi-agente: Técnicas avanzadas como equipos de agentes y agentes autónomos
  • Modos de interacción flexibles: Soporte conversacional, streaming y no streaming

Puedes generar un Agente Strands en Python de dos formas:

  1. Instale el Nx Console VSCode Plugin si aún no lo ha hecho
  2. Abra la consola Nx en VSCode
  3. Haga clic en Generate (UI) en la sección "Common Nx Commands"
  4. Busque @aws/nx-plugin - py#strands-agent
  5. Complete los parámetros requeridos
    • Haga clic en Generate
    Parámetro Tipo Predeterminado Descripción
    project Requerido string - El proyecto al que agregar el Strands Agent
    computeType string BedrockAgentCoreRuntime El tipo de cómputo para alojar tu Strands Agent.
    name string - El nombre de tu Strands Agent (predeterminado: agent)
    auth string IAM El método utilizado para autenticar con tu Strands Agent. Elige entre IAM (predeterminado) o Cognito.
    protocol string HTTP El protocolo del servidor para tu Strands Agent. HTTP expone un servidor HTTP FastAPI. A2A expone un servidor de protocolo Agent-to-Agent. AG-UI expone un servidor de protocolo Agent-User Interaction para integración directa con el frontend.
    iacProvider string Inherit El proveedor de IaC preferido. Por defecto, esto se hereda de tu selección inicial.

    El generador añadirá los siguientes archivos a tu proyecto Python existente. Los archivos generados dependen del protocol elegido:

    • Directorioyour-project/
      • Directorioyour_module/
        • Directorioagent/ (o nombre personalizado si se especifica)
          • __init__.py Inicialización del paquete Python
          • init.py Configuración de aplicación FastAPI con middleware CORS y manejo de errores
          • agent.py Definición principal del agente con herramientas de ejemplo
          • main.py Punto de entrada FastAPI para Bedrock AgentCore Runtime
          • Dockerfile Punto de entrada para alojar tu agente (excluido cuando computeType es None)
      • pyproject.toml Actualizado con dependencias de Strands
      • project.json Actualizado con objetivos de servicio del agente

    Cuando protocol se establece en A2A, el punto de entrada usa el Strands A2A Server en lugar de FastAPI:

    • Directorioyour-project/
      • Directorioyour_module/
        • Directorioagent/ (o nombre personalizado si se especifica)
          • __init__.py Inicialización del paquete Python
          • agent.py Definición principal del agente con herramientas de ejemplo
          • main.py Punto de entrada del servidor A2A
          • Dockerfile Punto de entrada para alojar tu agente (excluido cuando computeType es None)
      • pyproject.toml Actualizado con dependencias de Strands
      • project.json Actualizado con objetivos de servicio del agente

    Cuando protocol se establece en AG-UI, el punto de entrada usa la integración ag-ui-strands, que expone tu agente mediante el protocolo AG-UI para integración directa con el frontend usando CopilotKit:

    • Directorioyour-project/
      • Directorioyour_module/
        • Directorioagent/ (o nombre personalizado si se especifica)
          • __init__.py Inicialización del paquete Python
          • agent.py Definición principal del agente con herramientas de ejemplo
          • main.py Punto de entrada del servidor AG-UI usando ag-ui-strands
          • Dockerfile Punto de entrada para alojar tu agente (excluido cuando computeType es None)
      • pyproject.toml Actualizado con dependencias de Strands y AG-UI
      • project.json Actualizado con objetivos de servicio del agente

    Dado que este generador proporciona infraestructura como código basada en tu proveedor de iacProvider seleccionado, creará un proyecto en packages/common que incluye los constructos CDK o módulos de Terraform correspondientes.

    El proyecto común de infraestructura como código tiene la siguiente estructura:

    • Directoriopackages/common/constructs
      • Directoriosrc
        • Directorioapp/ Constructos para infraestructura específica de un proyecto/generador
        • Directoriocore/ Constructos genéricos reutilizados por los constructos en app
        • index.ts Punto de entrada que exporta los constructos de app
      • project.json Objetivos de compilación y configuración del proyecto

    Para desplegar tu Agente Strands, se generan los siguientes archivos:

    • Directoriopackages/common/constructs/src
      • Directorioapp
        • Directorioagents
          • Directorio<project-name>
            • <project-name>.ts Constructo CDK para desplegar tu agente

    Las herramientas son funciones que el agente de IA puede llamar para realizar acciones. Strands usa un enfoque basado en decoradores para definirlas.

    Puedes añadir nuevas herramientas en el archivo agent.py:

    from strands import Agent, tool
    @tool
    def calculate_sum(numbers: list[int]) -> int:
    """Calcula la suma de una lista de números"""
    return sum(numbers)
    @tool
    def get_weather(city: str) -> str:
    """Obtiene información meteorológica de una ciudad"""
    # Tu integración de API del tiempo aquí
    return f"Weather in {city}: Soleado, 25°C"
    # Añade herramientas al agente
    agent = Agent(
    system_prompt="Eres un asistente útil con acceso a varias herramientas.",
    tools=[calculate_sum, get_weather],
    )

    El framework Strands maneja automáticamente:

    • Validación de tipos basada en type hints
    • Generación de esquema JSON para tool calling
    • Manejo de errores y formato de respuestas

    Strands provee herramientas preconstruidas a través del paquete strands-tools:

    from strands_tools import current_time, http_request, file_read
    agent = Agent(
    system_prompt="Eres un asistente útil.",
    tools=[current_time, http_request, file_read],
    )

    Por defecto, Strands usa Claude 4 Sonnet, pero puedes personalizar el proveedor. Consulta la documentación de Strands sobre proveedores de modelos:

    from strands import Agent
    from strands.models import BedrockModel
    # Crea un 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)

    Puedes añadir herramientas de servidores MCP a tu agente Strands.

    Para consumir servidores MCP creados con los generadores py#mcp-server o ts#mcp-server puedes hacer uso del generador connection.

    1. Instale el Nx Console VSCode Plugin si aún no lo ha hecho
    2. Abra la consola Nx en VSCode
    3. Haga clic en Generate (UI) en la sección "Common Nx Commands"
    4. Busque @aws/nx-plugin - connection
    5. Complete los parámetros requeridos
      • Haga clic en Generate

      Consulta la guía del generador connection para detalles sobre cómo se configura la conexión.

      Para otros servidores MCP, consulta la Documentación de Strands.

      Para una guía detallada sobre cómo escribir agentes Strands, consulta la documentación de Strands.

      El protocolo de servidor de tu agente determina cómo se comunica. Todas las opciones son servidas por FastAPI — el punto de entrada difiere:

      • HTTP (por defecto): Un servidor FastAPI estándar con un endpoint personalizado /invocations, CORS y streaming. Mejor para integraciones de clientes personalizados.
      • A2A: El Strands A2A Server montado sobre una aplicación FastAPI. Mejor cuando tu agente necesita ser descubrible e invocable por otros agentes compatibles con A2A.
      • AG-UI: La integración ag-ui-strands, que expone el protocolo AG-UI mediante SSE. Mejor para integración directa con el frontend usando CopilotKit en un sitio web React.

      Todos los protocolos exponen /ping para el contrato de verificación de salud del runtime de AgentCore. Los agentes A2A escuchan en el puerto 9000; los agentes HTTP y AG-UI escuchan en el puerto 8080. El Dockerfile y la infraestructura generados están configurados para ti.

      El servidor HTTP generado incluye:

      • Configuración de aplicación FastAPI con middleware CORS
      • Middleware de manejo de errores
      • Generación de esquema OpenAPI
      • Endpoint de verificación de salud (/ping)
      • Endpoint de invocación del agente (/invocations)

      Personalizando Entradas y Salidas de Invocación con Pydantic

      Sección titulada «Personalizando Entradas y Salidas de Invocación con Pydantic»

      El endpoint de invocación del agente usa modelos Pydantic para definir y validar los esquemas de solicitud y respuesta. Puedes personalizar estos modelos en main.py para que coincidan con los requisitos de tu agente.

      El modelo InvokeInput por defecto acepta un mensaje.

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

      Puedes extender este modelo para incluir cualquier campo adicional que tu agente necesite.

      El ID de sesión se extrae del header HTTP x-amzn-bedrock-agentcore-runtime-session-id, de acuerdo con el contrato de sesión de Bedrock AgentCore Runtime. Si el header no se proporciona, se genera un UUID aleatorio como alternativa.

      Para respuestas de streaming, el generador proporciona JsonStreamingResponse que serializa automáticamente modelos Pydantic al formato JSON Lines (application/jsonl). Este formato es compatible con la especificación de streaming de OpenAPI 3.2 y funciona perfectamente con el cliente TypeScript generado.

      Por defecto, el agente produce objetos StreamChunk que contienen el texto de respuesta del agente:

      class StreamChunk(BaseModel):
      content: str

      Puedes personalizar el modelo StreamChunk según tus necesidades:

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

      Existe una solicitud de característica abierta para soporte nativo en FastAPI.

      El generador incluye una dependencia del SDK Python de Bedrock AgentCore para las constantes PingStatus. Si lo deseas, es sencillo usar BedrockAgentCoreApp en lugar de FastAPI, sin embargo ten en cuenta que se pierde la seguridad de tipos.

      Puedes encontrar detalles sobre las capacidades del SDK en la documentación.

      Cuando protocol=A2A, el main.py generado monta A2AServer.to_fastapi_app() sobre una aplicación FastAPI padre que también expone /ping. Cuando se despliega en AgentCore, el punto de entrada resuelve el ARN público del runtime desde AppConfig y lo anuncia en la tarjeta del agente.

      La mayoría de los usuarios no necesitarán modificar este archivo — edita agent.py para cambiar herramientas o el prompt del sistema. El servidor A2A puebla la tarjeta del agente (/.well-known/agent-card.json) desde el name y description del constructor Agent.

      Cuando protocol=AG-UI, el main.py generado envuelve tu Agent de Strands en un ag_ui_strands.StrandsAgent y crea una aplicación FastAPI mediante create_strands_app(). La aplicación resultante expone un único endpoint POST que transmite eventos de AG-UI mediante Server-Sent Events (SSE), así como /ping para la verificación de salud del runtime de AgentCore.

      La mayoría de los usuarios no necesitarán modificar este archivo — edita agent.py para cambiar herramientas o el prompt del sistema.

      El generador configura un target llamado <your-agent-name>-serve para iniciar tu agente localmente:

      Terminal window
      pnpm nx agent-serve your-project

      Este comando usa uv run para ejecutar tu agente con el SDK Python de Bedrock AgentCore.

      Desplegando tu Agente Strands a Bedrock AgentCore Runtime

      Sección titulada «Desplegando tu Agente Strands a Bedrock AgentCore Runtime»

      Si seleccionaste BedrockAgentCoreRuntime para computeType, se genera la infraestructura CDK o Terraform relevante que puedes usar para desplegar tu Strands Agent en Amazon Bedrock AgentCore Runtime.

      Se genera una construcción CDK para tu agente, nombrada según el name que elegiste al ejecutar el generador, o <ProjectName>Agent por defecto.

      Puedes usar esta construcción CDK en una aplicación CDK:

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

      El generador proporciona una opción auth para configurar la autenticación de tu Strands Agent. Puedes elegir entre autenticación IAM (predeterminada) o Cognito al generar tu agente.

      Por defecto, tu Strands Agent estará protegido usando autenticación IAM, simplemente despliégalo sin ningún argumento:

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

      Puedes otorgar acceso para invocar tu agente en Bedrock AgentCore Runtime usando el método grantInvokeAccess, por ejemplo:

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

      Cuando seleccionas autenticación Cognito, el generador configura el agente para usar Cognito para la autenticación.

      La construcción generada acepta una propiedad identity que configura la autenticación 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,
      });
      }
      }

      La construcción UserIdentity puede generarse usando el generador ts#react-website#auth, o puedes crear tu propio UserPool y UserPoolClient de CDK.

      Para construir tu Agente Strands para Bedrock AgentCore Runtime, se añade un target bundle que:

      • Exporta dependencias Python a requirements.txt usando uv export
      • Instala dependencias para la plataforma objetivo (aarch64-manylinux_2_28) con uv pip install

      También se añade un target docker específico de tu Agente Strands, que copia el Dockerfile y los artefactos empaquetados en un directorio de contexto docker. Esto co-localiza el Dockerfile con la salida construida, permitiendo a CDK construir la imagen Docker directamente usando AgentRuntimeArtifact.fromAsset.

      Tu agente se configura automáticamente con observabilidad usando AWS Distro for Open Telemetry (ADOT), mediante auto-instrumentación en tu Dockerfile.

      Puedes encontrar trazas en CloudWatch seleccionando “GenAI Observability”. Para ver trazas, habilita Transaction Search.

      Para más detalles, consulta la documentación de observabilidad de AgentCore.

      Para invocar un Agente ejecutándose localmente mediante el target <your-agent-name>-serve, puedes enviar una simple solicitud POST a /invocations en el puerto donde se ejecuta tu agente local. Por ejemplo, con curl:

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

      Para invocar tu Agente desplegado en Bedrock AgentCore Runtime, puedes enviar una solicitud POST al endpoint del plano de datos de Bedrock AgentCore Runtime con tu ARN de runtime codificado en URL.

      Puedes obtener el ARN de runtime desde tu infraestructura de la siguiente manera:

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

      El ARN tendrá el siguiente formato: arn:aws:bedrock-agentcore:<region>:<account>:runtime/<agent-runtime-id>.

      Luego puedes codificar el ARN en URL reemplazando : con %3A y / con %2F.

      La URL del plano de datos de Bedrock AgentCore Runtime para invocar el agente es la siguiente:

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

      La forma exacta de invocar esta URL depende del método de autenticación utilizado.

      Para autenticación IAM, la solicitud debe firmarse usando AWS Signature Version 4 (SigV4).

      Ventana de terminal
      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'
      Haz clic aquí para más detalles sobre cómo configurar el comando acurl anterior

      Para autenticación Cognito, pasa el Access Token de Cognito en el header Authorization:

      Ventana de terminal
      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>"

      Puedes obtener el access token usando el comando cognito-idp admin-initiate-auth del AWS CLI, por ejemplo:

      Ventana de terminal
      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 tu Agente Strands desde un sitio web React, puedes hacer uso del generador connection, que configura automáticamente un cliente con la autenticación correcta (IAM o Cognito).

      1. Instale el Nx Console VSCode Plugin si aún no lo ha hecho
      2. Abra la consola Nx en VSCode
      3. Haga clic en Generate (UI) en la sección "Common Nx Commands"
      4. Busque @aws/nx-plugin - connection
      5. Complete los parámetros requeridos
        • Haga clic en Generate

        Consulta la guía del generador connection para detalles sobre cómo se configura la conexión.

        Para delegar trabajo desde este agente a un agente A2A remoto (ya sea TypeScript o Python), usa el generador connection. Este genera un cliente autenticado con SigV4 para el agente objetivo y transforma mediante AST el agent.py de este agente para registrar el agente A2A remoto como un delegado decorado con @tool.

        1. Instale el Nx Console VSCode Plugin si aún no lo ha hecho
        2. Abra la consola Nx en VSCode
        3. Haga clic en Generate (UI) en la sección "Common Nx Commands"
        4. Busque @aws/nx-plugin - connection
        5. Complete los parámetros requeridos
          • Haga clic en Generate

          Consulta la guía del generador connection para detalles sobre cómo se configura la conexión.