realizar un trabajo útil puede ser relativamente sencillo. Para una aplicación simple, unas pocas líneas de Python usando la biblioteca boto3 y la API Bedrock pueden ser todo lo que se necesita. Usted configura el acceso a un LLM, envía un mensaje y algunos comentarios, recibe una respuesta y se la devuelve al usuario.
Ese enfoque se vuelve más difícil de gestionar si su aplicación tiene que asumir más responsabilidades. Una vez que el modelo necesita mantener el contexto de la conversación, elegir entre herramientas, seguir instrucciones detalladas o coordinar varios pasos, el código de la aplicación circundante comienza a parecerse a un marco de agente.
Ahí es donde entra en juego el uso de Strands y AgentCore.
Strands proporciona esa capa de agente, pero ejecutar un agente de manera confiable presenta un conjunto diferente de preocupaciones. Necesita un lugar donde ejecutarse, una interfaz de invocación, aislamiento de sesiones, escalamiento, seguridad y potencialmente servicios como memoria a largo plazo o acceso administrado a herramientas. Amazon Bedrock AgentCore proporciona estas capacidades operativas sin definir cómo debe comportarse el propio agente.
NÓTESE BIEN. Aparte de ser usuario de sus sistemas, no tengo ninguna afiliación ni asociación con AWS.
Todas las imágenes mostradas en este artículo, excepto la imagen del título generada por IA, fueron creadas por el autor.
Hilos
Strands es un marco de agente de código abierto de AWS. Proporciona los componentes a nivel de aplicación necesarios para crear un agente.
Un LLM, como Claude Sonnet, a través de Amazon Bedrock o modelos locales a través de Ollama y otros proveedores. Un mensaje del sistema que define el rol y el comportamiento del agente. Herramientas que el modelo puede elegir llamar. Mensajes de conversación y contexto. Un bucle de agente que envía solicitudes al modelo, ejecuta las herramientas solicitadas y devuelve los resultados de las herramientas al modelo.
Piense en Strands como el equivalente de AWS a LangChain o CrewAI.
Se puede crear un agente básico de Strands con solo un modelo y un mensaje del sistema:
from strands import Agente modelo = 'your_LLM_choice' agente = Agente( modelo=modelo, system_prompt="Eres un asistente educativo de PYME.", ) respuesta = agente("Explique la primera ley de Newton").
Aunque estoy enmarcando este artículo como un equipo doble de Strands/AgentCore, Strands en sí no requiere que AgentCore se ejecute. Un agente de Strands es un código de aplicación normal y puede ejecutarse localmente o en otra infraestructura. AgentCore entra en juego cuando el agente necesita una implementación administrada en la infraestructura de AWS y servicios de producción, como memoria, escalabilidad y observabilidad.
El agente que estamos construyendo
Construiremos e implementaremos un asistente educativo basado en Strands antes de agregar AgentCore Memory para preservar las preferencias del usuario entre conversaciones. Nuestro agente atenderá preguntas sobre:
Matemáticas Física Química Geografía
El modelo decide qué tema se adapta mejor a cada pregunta, por lo que no es necesario mantener una lista de palabras clave ni una herramienta de enrutamiento separada. Responde preguntas respaldadas como experto en el tema relevante y rechaza cualquier cosa fuera de las cuatro áreas admitidas.
Este es un primer agente útil porque su comportamiento es fácil de entender, pero la aplicación aún implica decisiones que se encuentran en sistemas más grandes: seleccionar un modelo, escribir instrucciones, validar solicitudes, probar el comportamiento del modelo, implementar la aplicación y administrar sesiones de conversación.
Solo estoy usando un agente de Strands en lugar de agentes especializados separados para cada tema. Los agentes separados valen la pena cuando los sujetos necesitan diferentes modelos, herramientas, instrucciones, datos o permisos, pero por ahora, eso agregaría coordinación y complejidad innecesarias a esta implementación inicial.
AgenteCore
Amazon Bedrock AgentCore es un conjunto de servicios de AWS administrados para crear, implementar, conectar y operar agentes en la nube de AWS. Es independiente del marco, por lo que puede alojar agentes creados con Strands, LangChain, OpenAI Agents SDK y otros marcos.
Las principales capacidades de AgentCore son:
+——————+———————————————————————————————+ | Capacidad | Propósito | +——————+———————————————————————————————+ | Tiempo de ejecución | Hospeda y escala agentes en entornos de sesiones aisladas. Admite transmisión y HTTP, MCP, | | | y protocolos A2A. | +——————+———————————————————————————————+ | Memoria | Almacena eventos de conversación y extrae hechos, preferencias, resúmenes o episodios duraderos | | | para usar en todas las sesiones. | +——————+———————————————————————————————+ | Puerta de enlace | Expone API, funciones Lambda y servidores MCP como herramientas administradas que los agentes pueden descubrir | | | y llama. | +——————+———————————————————————————————+ | Identidad | Gestiona la autenticación entrante y las credenciales que utilizan los agentes para acceder a servicios externos. | +——————+———————————————————————————————+ | Política | Aplica reglas de autorización Cedar a las llamadas a la herramienta Gateway antes de que alcancen sus objetivos. | +——————+———————————————————————————————+ | Navegador | Proporciona sesiones de navegador administradas para agentes que necesitan interactuar con sitios web. | +——————+———————————————————————————————+ | Intérprete de código | Ejecuta Python, JavaScript o TypeScript en entornos limitados administrados aislados. | +——————+———————————————————————————————+ | Observabilidad | Envía registros, seguimientos y métricas de agentes a servicios como CloudWatch y X-Ray. | +——————+———————————————————————————————+ | Evaluaciones | Mide el comportamiento de los agentes y la calidad de la respuesta mediante evaluadores integrados o personalizados. | +——————+———————————————————————————————+
Estas capacidades son independientes, lo que significa que un agente puede usar sólo las que necesita y agregar otras a medida que aumentan sus responsabilidades.
Usaremos AgentCore para desarrollar nuestro agente Strands e implementarlo en AWS con AgentCore Runtime. Esto crea una estructura de proyecto convencional en su sistema local, un flujo de trabajo de desarrollo local, una configuración de implementación y un punto de entrada del tiempo de ejecución.
Nuestro agente SME no tiene herramientas externas y no necesita ninguna de las otras capacidades de AgentCore todavía, pero agregaremos un componente de memoria más adelante.
Cómo encajan Strands y AgentCore
Strands controla lo que hace nuestro agente. El modelo seleccionado, el mensaje del sistema, el contexto de la conversación y cualquier herramienta forman parte de la aplicación Strands.
AgentCore Runtime controla dónde y cómo se ejecuta esa aplicación. Proporciona el entorno gestionado alrededor del agente: implementación, escalado, aislamiento de sesiones, transmisión y una interfaz de invocación.
Vale la pena señalar esta distinción porque la implementación de un agente con AgentCore no define el comportamiento general del sistema. Esto proviene fundamentalmente de la elección del modelo y el código subyacente de Strands.
Instalación de las herramientas de desarrollo.
Para seguirlo, necesitarás:
Una cuenta de AWS. Credenciales de AWS configuradas localmente. Node.js 20 o posterior. Python 3.10 o posterior. AWS CDK (utilizado por AgentCore para la implementación). La CLI de AgentCore. Acceso al modelo seleccionado en Amazon Bedrock.
Mi instalación se realizó en una PC con Windows usando PowerShell. Instale AWS CLI y Node.js primero si esos comandos no están disponibles.
PS C: > msiexec.exe /i https://awscli.amazonaws.com/AWSCLIV2.msi PS C: > aws –version # # Salida # aws-cli/2.22.15 Python/3.12.6 Windows/11 exe/AMD64
Instale AWS CDK globalmente con npm:
PS C: > npm install -g aws-cdk PS C: > cdk –version # # Salida # 2.1126.0 (compilación a90d578)
Instale la CLI de AgentCore:
PS C: > npm install -g @aws/agentcore PS C: > agentcore –version # # Salida # La CLI de AgentCore recopila análisis de uso anónimos y agregados para ayudar a mejorar la herramienta. Para excluirse: agentcore config telemetry.enabled false Para auditar: agentcore config telemetry.audit true Para obtener más información: agentcore telemetry –help 0.19.0
El comando de creación de AgentCore CLI crea el entorno Python e instala las dependencias del proyecto generado cuando se ejecuta localmente. El archivo pyproject.toml generado registra dependencias, como Strands y AgentCore SDK.
Configure las credenciales de AWS utilizando el enfoque apropiado para el entorno. Para el desarrollo local, suele ser un archivo de perfil de AWS.
Confirme que el LLM o el perfil de inferencia que desea utilizar esté disponible en la región de origen deseada. Puede hacerlo desde la CLI de AWS de esta manera:
PS C: > aws bedrock list-foundation-models –region PS C: > aws bedrock list-inference-profiles –region
Eligiendo tu modelo
Al crear un proyecto AgentCore, el indicador de línea de comandos –model-provider Bedrock selecciona Amazon Bedrock como proveedor, pero no especifica qué modelo básico pretende utilizar la aplicación.
Strands utiliza uno de los modelos de Anthropic de forma predeterminada cuando no se proporciona ningún modelo. Al momento de escribir este artículo, el último modelo predeterminado de Strands es global.anthropic.claude-sonnet-4–6, pero es una buena práctica especificar siempre un modelo particular que desea que utilice Strands.
Este fragmento de código de ejemplo especifica explícitamente el uso de Anthropic Claude Sonnet 4.6 a través de un perfil de inferencia global entre regiones:
de strands.models importar BedrockModel modelo = BedrockModel( model_id="global.anthropic.claude-sonnet-4-6", region_name="us-west-2", temperatura=0.2, max_tokens=1_500,)
Bedrock tiene varias familias de modelos para elegir, y Claude Sonnet es un buen punto de partida para las respuestas de las PYME, mientras que Claude Haiku o Amazon Nova Micro pueden adaptarse a una carga de trabajo de enrutamiento más simple y sensible a los costos.
La inferencia global entre regiones puede mejorar la disponibilidad, pero es posible que no satisfaga todos los requisitos de residencia de datos. Un perfil de inferencia geográfica o de aplicación es una mejor opción cuando el procesamiento debe permanecer dentro de un límite geográfico definido, como Europa o Asia.
Creando el proyecto AgentCore
Utilice la CLI de AgentCore para inicializar un proyecto de Strands con Bedrock como proveedor de modelo:
PS C:Usersthomaprojectsstrands-agentcore-demo> agentcore create –name SMETriage –framework Strands –protocol HTTP –model-provider Bedrock –build CodeZip –memory none # # Salida # [hecho] Crear SMETriage/directorio de proyecto [hecho] Preparar el directorio/agente [hecho] Inicializar repositorio git [hecho] Agregar agente al proyecto [hecho] Configurar el entorno Python Creado: SMETriage/ app/SMETriage/ Agente Python (Strands) agentcore/ Proyecto de configuración y CDK ¡Proyecto creado exitosamente! Para continuar, navegue hasta su nuevo proyecto: cd SMETriage
Ya mencionamos la bandera –modelo. Otra opción importante aquí es: –compilar CodeZip.
CodeZip es el formato de implementación de código directo de AgentCore para aplicaciones Python. En lugar de crear una imagen de Docker y usar ECR/ECS, con este indicador, la CLI de AgentCore:
Recopila los archivos fuente de Python del agente. Resuelve y empaqueta sus dependencias. Crea un archivo ZIP que contiene la aplicación y las dependencias compatibles con Linux ARM64. Carga el archivo en Amazon S3. Configura AgentCore Runtime para ejecutar el punto de entrada de Python.
El proyecto registra esta elección en el archivo agentcore/agentcore.json.
Una vez completado el comando de creación de AgentCore, debería ver una estructura de carpetas del proyecto similar a esta:
SMETriage/ |– agentecore/ | |– agentcore.json # Configuración del proyecto y la implementación | |– aws-targets.json # Cuenta y región de AWS de destino | `– .env.local # Valores solo locales; gitignored `– app/ `– SMETriage/ |– main.py # Punto de entrada del agente `– pyproject.toml # Dependencias de Python
El proyecto generado se puede probar antes de realizar cualquier cambio:
PS C:Usersthomaprojectsstrands-agentcore-demosmetriage> agente de desarrollo
Esto abrirá una página web en localhost:8080 o una dirección similar, así que ábrela y podrás hacerle preguntas al modelo.
Cómo gestiona AgentCore los permisos de IAM
La CLI de AgentCore crea la función de ejecución en tiempo de ejecución del agente y agrega los permisos necesarios para invocar el modelo Bedrock seleccionado, acceder a los recursos de memoria configurados y escribir registros de tiempo de ejecución.
No es necesario crear este rol manualmente para este ejemplo. Sin embargo, la identidad de IAM que ejecuta la implementación de AgentCore ya debe tener permiso para crear y pasar roles de IAM, implementar recursos de CloudFormation, cargar paquetes CodeZip en S3 y administrar los recursos de AgentCore necesarios.
Los usuarios y las aplicaciones también necesitan permiso para invocar al agente implementado. Durante el desarrollo, las políticas de IAM generadas suelen ser suficientes. Antes de pasar a producción, estos deben revisarse y limitarse al tiempo de ejecución, el modelo, el recurso de memoria y la infraestructura de soporte específicos.
Implementación del agente PYME
En el archivo main.py en la carpeta app/SMETriage, reemplace el contenido con el siguiente código:
importar sistema operativo desde bedrock_agentcore.runtime importar BedrockAgentCoreApp desde strands importar Agente desde strands.models importar aplicación BedrockModel = BedrockAgentCoreApp() MODEL_ID = os.getenv( "BEDROCK_MODEL_ID", "global.anthropic.claude-sonnet-4-6", ) REGION = os.getenv("AWS_REGION", "us-west-2") SUBJECT_PREFIXES = { "mathematics": ( "Esta es tu PYME de Matemáticas. " "La respuesta a tu pregunta es la siguiente." ), "physics": ( "Esta es tu PYME de Física. " "La respuesta a tu pregunta es la siguiente." ), "química": ( "Esta es tu PYME de Química. " "La respuesta a tu pregunta es la siguiente." ), "geografía": ( "Esta es tu PYME de Geografía. " "La respuesta a tu pregunta es como sigue." ), } def load_model() -> BedrockModel: return BedrockModel( model_id=MODEL_ID, region_name=REGION, temperatura=0.2, max_tokens=1_500, ) def build_agent() -> Agente: prefixes = "n".join( f"- {subject}: {prefix}" para el asunto, prefijo en SUBJECT_PREFIXES.items() ) return Agent( model=load_model(), system_prompt=( "Usted es un asistente de clasificación de PYME educativas. " "Primero decida si la pregunta del usuario es principalmente sobre " "matemáticas, física, química, geografía o una materia " "no admitida. " "Responda sólo preguntas sobre matemáticas, física, química, " "o geografía. " "Para las preguntas admitidas, comience con el prefijo exacto para la " "tema elegida, luego brinde una explicación clara y precisa. " "Cuando una pregunta se superponga temas, elija el tema más " "importante para responderla. " "Para preguntas no admitidas, responda exactamente: " ""Lo siento, no sé la respuesta."nn" "Prefijos de asunto requeridos:n" f"{prefijos}" ), ) @app.entrypoint def invoke(payload, context): Prompt = payload.get("prompt") si no es instancia(prompt, str) o no. Prompt.strip(): return {"error": "Se requiere una pregunta que no esté vacía."} if len(prompt) > 2_000: return {"error": "La pregunta excede la longitud máxima."} respuesta = build_agent()(prompt.strip()) return {"response": str(response)} if __name__ == "__main__": app.run()
Hay tres partes que vale la pena examinar: carga del modelo, instrucciones de enrutamiento y punto de entrada del tiempo de ejecución.
1/ Mantener explícita la configuración del modelo
La función load_model centraliza la configuración de Bedrock.
La variable de entorno BEDROCK_MODEL_ID puede anular el LLM predeterminado sin cambiar la fuente, por ejemplo
PS C:Usersthomaprojectsstrands-agentcore-demosmetriage> $env:BEDROCK_MODEL_ID = "" PS C:Usersthomaprojectsstrands-agentcore-demosmetriage> agentcore dev
Esto resulta útil al comparar modelos o utilizar diferentes perfiles de inferencia entre entornos.
2/ Dejar que el modelo oriente las preguntas
El agente no utiliza una lista de palabras clave temáticas para determinar cómo decodificar una pregunta. El mensaje del sistema le pide al modelo que decida si una pregunta es principalmente sobre uno de los temas admitidos.
Ese enfoque flexible aborda cuestiones dispares como:
"Explícale la hipótesis de Riemann a un niño de 10 años". "¿Por qué el acero inoxidable puede resistir la corrosión?" “¿Por qué las zonas costeras suelen tener climas más suaves?”
Un clasificador de palabras clave fijo tendría que anticipar términos como Riemann, corrosión y costero. El modelo ya comprende las relaciones entre esos términos y sus sujetos.
Algunas preguntas se sitúan de forma natural entre los temas. Considere: “¿Cómo afecta la química de la atmósfera al clima?” Tanto la química como la geografía son opciones razonables, por lo que el mensaje le pide al modelo que seleccione la que sea más relevante para su respuesta.
Este enfoque es flexible, pero no totalmente predecible. El modelo puede clasificar la misma pregunta ambigua de manera diferente de una ejecución a la siguiente, o devolver una respuesta en el formato incorrecto. Eso podría estar bien para un asistente educativo, pero es mucho más riesgoso si el enrutamiento controla el acceso a herramientas o datos confidenciales. En ese caso, sería conveniente implementar otros controles, por ejemplo, resultados estructurados.
3/ Validar la solicitud de Runtime
El punto de entrada comprueba que la solicitud contenga una pregunta utilizable.
Se trata de una validación de solicitud ordinaria en lugar de una moderación de contenido. Evita que solicitudes con formato incorrecto y excesivamente grandes lleguen al modelo. La función decorada con @app.entrypoint es el puente entre AgentCore Runtime y el agente Strands. El tiempo de ejecución proporciona la carga útil, la función la valida y el agente de Strands produce la respuesta.
Probando el agente
Después de detener y reiniciar el comando de desarrollo de agentcore. Podemos hacerle preguntas al agente.
Como se muestra, cada respuesta debe comenzar con el prefijo SME correspondiente y las respuestas actualizadas demuestran que el nuevo agente está vigente. Además, una pregunta sin fundamento, como "¿Quién escribió Orgullo y prejuicio?" debería recibir la respuesta:
"Lo siento, no sé la respuesta a eso".
Una pregunta superpuesta es útil para ver cómo el modelo resuelve la ambigüedad:
El resultado importante no es si siempre elige la química o la geografía. La respuesta debe utilizar un prefijo coincidente y dar una explicación relevante.
Implementación del agente en la nube de AWS
Una vez que el agente se comporte correctamente localmente, impleméntelo en AWS usando:
PS C:Usersthomaprojectsstrands-agentcore-demosmetriage> agentcore implementar AgentCore Implementar proyecto: SMETriage Destino: us-east-2:0123456789 [hecho] Validar proyecto [hecho] Verificar dependencias [hecho] Construir proyecto CDK [hecho] Sintetizar CloudFormation [hecho] Verificar el estado de la pila [hecho] Entorno Bootstrap AWS [hecho] Computar cambios de diferencias… [hecho] Publicar activos ╭──────────────────────── ────────────────────────╮ │ ✓ Implementación en AWS completa │ │ │ │ [████████████████████] 5/5 │ ╰──────────────────────── ────────────────────────╯ Se implementaron 1 pila(s): AgentCore-SMETriage-default Nota: Búsqueda de transacciones habilitada. Se necesitan aproximadamente 10 minutos para que la búsqueda de transacciones esté completamente activa y para que se indexen los rastros de las invocaciones. Registro: agentcore.clilogsdeploydeploy-20260611-104449.log
Podemos inspeccionar el Runtime implementado:
PS C:Usersthomaprojectsstrands-agentcore-demosmetriage> estado del agente –tipo agente Agentes SMETriage: implementados – Tiempo de ejecución: LISTO (arn:aws:bedrock-agentcore:us-east-2:0123456789:runtime/SMETriage_SMETriage-r5adp27A24) URL: https://bedrock-agentcore.us-east-2.amazonaws.com/runtimes/arn%3Aaws%3Abedrock-agentcore%3Aus-east-2%3A6963531187 45%3Aruntime%2FSMETriage_SMETriage-r5adp27A24/invocations
Luego invocalo con:
PS C:Usersthomaprojectsstrands-agentcore-demosmetriage> agentcore invoke "Explique cómo se usa la probabilidad en la vida cotidiana". –stream { "response": "Esta es tu PYME de Matemáticas. La respuesta a tu pregunta es la siguiente.nnLa probabilidad es el estudio matemático de la probabilidad y el azar, y aparece en muchos aspectos de la vida cotidiana. Aquí hay algunos ejemplos clave:nn## Pronóstico del tiempon- Los meteorólogos usan la probabilidad para predecir la **probabilidad de lluvia o nieve** (por ejemplo, "70% de probabilidad de lluvia")n- Estas predicciones se basan en datos históricos y atmosféricos. modelosnn## Seguros y finanzasn- Las compañías de seguros calculan **probabilidades de riesgo** para fijar los precios de las primasn- Los bancos evalúan la **probabilidad de incumplimiento del préstamo** cuando prestan dineron- Los inversores evalúan la **probabilidad de rentabilidad** de las inversionesnn## Medicina y saludn- Los médicos utilizan la probabilidad para evaluar la **precisión de las pruebas de diagnóstico** y el riesgo de enfermedadn- Los ensayos clínicos se basan en la probabilidad para determinar si un **tratamiento es efectivo**n- Los asesores genéticos calculan el **probabilidad de heredar condiciones**nn## Juegos y apuestasn- Los juegos de cartas, los dados y las loterías se rigen por la **probabilidad matemática**n- Comprender las probabilidades ayuda a las personas a tomar **decisiones informadas** sobre el riesgonn## Toma de decisiones cotidianan- Decidir si **llevar un paraguas** según la probabilidad previstan- Estimar la **probabilidad de tráfico** al planificar un viajen- Evaluar **riesgos de seguridad** en las actividades diariasnn## Control de calidadn: los fabricantes utilizan la probabilidad para **predecir tasas de defectos** en la producciónnnEn esencia, la probabilidad nos ayuda a **cuantificar la incertidumbre** y tomar decisiones mejor informadas en un mundo impredecible.n" } Sesión: 735d6d6b-b2de-40d3-ae3c-741821c4810f Para continuar: invocación de agente –session-id 735d6d6b-b2de-40d3-ae3c-741821c4810f Registro: C:Usersthomaprojectsstrands-agentcore-demosmetriageagentcore.clilogsinvokeinvoke-SMETriage-20260611-105138.log
El tiempo de ejecución implementado necesita permiso para invocar el modelo Bedrock o perfil de inferencia seleccionado. Los modelos antrópicos solían requerir el envío de un caso de uso único antes del primer uso, pero ese ya no es el caso. La primera vez que invoca el modelo, automáticamente tiene derecho a usarlo y recibirá un par de correos electrónicos a tal efecto.
Si la invocación falla, verifique los permisos de IAM, la disponibilidad del modelo, el perfil de inferencia, la región de origen y cualquier política de control de servicios de la organización.
NÓTESE BIEN. Recuerde, en este punto, AgentCore Runtime proporciona el entorno de ejecución administrado, pero el comportamiento de la aplicación permanece en el código de Strands. Cambiar el indicador o modelo del sistema requiere actualizar y volver a implementar la aplicación.
Agregar funcionalidad AgentCore: memoria
Al principio, mencioné que AgentCore consta de muchas partes diferentes, por ejemplo, puerta de enlace, tiempo de ejecución, observabilidad, etc.
Ya hemos visto cómo utilizar Runtime. Ahora agregaremos Memoria a nuestro ejemplo. Es posible que hayas notado que, anteriormente, cuando invocamos a AgentCore para hacer nuestras preguntas, se devolvió un ID de sesión. Estos grupos relacionados se turnan en una conversación. Entonces, si tiene una pregunta de seguimiento, puede pasar el ID de sesión de la pregunta original para obtener información relacionada. Por ejemplo,
PS C:Usersthomaprojectsstrands-agentcore-demosmetriage> agentcore invoca "Explica la primera ley de Newton". –stream { "response": "física: Esta es tu PYME de Física. La respuesta a tu pregunta es la siguiente.nn**La Primera Ley del Movimiento de Newton** (también conocida como la **Ley de Inercia**) establece:nn> *Un objeto en reposo permanece en reposo, y un objeto en movimiento permanece en movimiento a una velocidad constante (la misma velocidad y dirección), a menos que actúe sobre él una red externa fuerza.*nn—nn### Conceptos clave:nn1. **Inercia**: esta es la tendencia de un objeto a resistir cambios en su estado de movimiento. Cuanto más masa tiene un objeto, mayor es su inercia.nn2. **En reposo**: si un objeto está estacionario, permanecerá estacionario a menos que una fuerza actúe sobre él. Por ejemplo, un libro sobre una mesa no se moverá por sí solo.nn3. Movimiento**: si un objeto se está moviendo, continuará moviéndose en línea recta a la misma velocidad a menos que una fuerza (como fricción, gravedad o fuerza aplicada) actúe sobre él.nn4. **Fuerza externa neta**: lo que importa es la fuerza *combinada/resultante*. Si todas las fuerzas sobre un objeto se cancelan (fuerza neta = 0), el objeto se comporta como si no actuara ninguna fuerza sobre él.nn—nn### Ejemplo cotidiano:nCuando un automóvil se detiene repentinamente, los pasajeros se tambalean **hacia adelante**: sus cuerpos estaban en movimiento y tienden a **permanecer en movimiento**, lo que demuestra inercia.nnEsta ley define fundamentalmente qué es una **fuerza**: algo que *cambia* el estado de movimiento de un objeto.n" } Sesión: 7dbe017a-e306-4891-88d1-b707a5d6f894 Para continuar: invocación de agente –session-id 7dbe017a-e306-4891-88d1-b707a5d6f894 Registro: C:Usersthomaprojectsstrands-agentcore-demosmetriageagentcore.clilogsinvokeinvoke-SMETriage-20260611-133213.log
Podemos utilizar el ID de sesión: 7dbe017a-e306–4891–88d1-b707a5d6f894 para solicitar un seguimiento.
PS C:Usersthomaprojectsstrands-agentcore-demosmetriage> agentcore invoke –session-id 7dbe017a-e306-4891-88d1-b707a5d6f894 "Dame un ejemplo" –stream { "response": "physics: Esta es tu PYME de física. La respuesta a tu pregunta es la siguiente A continuación.nnAquí hay un ejemplo claro y cotidiano de la Primera Ley de Newton en acción:nn—nn### 🎳 Ejemplo: una bola de bolos rodantenn**Escenario:**nCuando haces rodar una bola de bolos por una pista, continúa avanzando en línea recta aproximadamente a la misma velocidad hasta que:n- **Golpea los bolos** (la fuerza externa la detiene), on- **Se desacelera debido a la fricción** between the ball and the floor (external force reduces its speed)nn—nn### Breaking It Down:nn| Situation | What Happens | Why |n|———-|————–|—–|n| Ball is rolled | It keeps moving forward | No net force to stop it immediately |n| Friction acts on ball | It gradually slows down | External force opposing motion |n| Ball hits pins | It se detiene o cambia de dirección | Fuerza externa de los bolos |nn—nn### El punto clave:nEn un **entorno sin fricción** (como el espacio exterior), la bola de bolos rodaría **para siempre** en línea recta a la misma velocidad, porque no habría **ninguna fuerza externa** para cambiar su movimiento.nn—nnEsto ilustra perfectamente la Primera Ley de Newton: la bola resiste cualquier cambio en su movimiento, y solo una **fuerza externa** puede altere su velocidad o dirección.n" } Sesión: 7dbe017a-e306-4891-88d1-b707a5d6f894 Para reanudar: invocación de agente –session-id 7dbe017a-e306-4891-88d1-b707a5d6f894 Registro: C:Usersthomaprojectsstrands-agentcore-demosmetriageagentcore.clilogsinvokeinvoke-SMETriage-20260611-133413.log
Sin embargo, los ID de sesión NO son mecanismos de memoria a largo plazo. Para eso, podemos usar la capacidad de memoria de AgentCore.
Agregar memoria AgentCore
AgentCore Memory almacena eventos de conversación y puede extraer de ellos registros útiles a largo plazo. Tiene estrategias integradas que sirven para diferentes propósitos:
+—————–+—————————————————————-+ | Estrategia | Qué extrae | +—————–+—————————————————————-+ | PREFERENCIA_USUARIO | Las elecciones de un usuario, el estilo preferido y las preferencias recurrentes. | +—————–+—————————————————————-+ | SEMÁNTICO | Hechos duraderos de conversaciones. | +—————–+—————————————————————-+ | RESUMEN | Resúmenes de conversaciones. | +—————–+—————————————————————-+ | EPISODICO | Secuencias de interacciones que pueden informar el comportamiento posterior. | +—————–+—————————————————————-+
Para nuestro agente PYME, USER_PREFERENCE es la opción más sencilla. Permite al agente recordar declaraciones como:
“Usa inglés del Reino Unido para deletrear” “Responde siempre en lenguaje pirata”. "Mantenga las respuestas breves".
ID de actor e ID de sesión
La memoria necesita dos identificadores:
+————+————————————————————-+———————————————+ | Identificador | Significado | Cuando cambia | +————+————————————————————-+———————————————+ | id_actor | El alumno cuyos recuerdos duraderos se almacenan y | Manténgalo estable para el mismo alumno. | | | recuperado. | | +————+————————————————————-+———————————————+ | id_sesión | Una conversación que contiene giros relacionados. | Utilice un nuevo valor para una nueva conversación. | +————+————————————————————-+———————————————+
AgentCore Runtime proporciona la variable session_id. La aplicación proporciona la identificación del usuario a través de actor_id. En nuestro ejemplo, se pasa en un encabezado X-Learner-Id personalizado y documentado que identifica al usuario (actor_id) que realiza la solicitud.
Debe utilizar un identificador opaco generado por la aplicación, como learner-7f83a2 o un UUID para actor_id. No coloque una dirección de correo electrónico, nombre u otra información personal en la identificación.
RequestHeaderAllowlist del tiempo de ejecución hace que X-Learner-Id esté disponible a través de context.request_headers. En una aplicación de producción, obtenga este valor de una identidad autenticada y no confíe en un ID de alumno proporcionado directamente por un cliente que no sea de confianza.
Crear el recurso de memoria
Desde la raíz del proyecto, agregue un recurso de Memoria:
PS C:Usersthomaprojectsstrands-agentcore-demosmetriage> agentcore agregar memoria ` >> –name LearnerPreferences ` >> –strategies USER_PREFERENCE ` >> –expiry 30
Esto debería agregar una nueva sección a agentcore/agentcore.json:
{ "memories": [ { "name": "LearnerPreferences", "eventExpiryDuration": 30, "strategies": [ { "type": "USER_PREFERENCE", "namespaceTemplates": [ "/users/{actorId}/preferences/" ] } ] } ] }
El espacio de nombres mantiene separadas las preferencias de cada alumno. Su barra diagonal evita colisiones de prefijos entre ID de actores similares. El vencimiento de 30 días controla cuánto tiempo se retienen los eventos de memoria sin procesar.
Cuando se implementa, AgentCore:
Crea el recurso Memoria. Otorga permiso al rol de tiempo de ejecución para leerlo y escribirlo. Inyecta su ID en el tiempo de ejecución como MEMORY_LEARNERPREFERENCES_ID.
Strands se integra con AgentCore Memory a través de AgentCoreMemorySessionManager.
Para cada invocación, la aplicación:
1. Obtiene el ID del alumno del encabezado X-Learner-Id permitido o de un campo de ID de usuario proporcionado por una aplicación.
2. Obtiene el ID de la conversación actual del contexto de tiempo de ejecución.
3. Crea una configuración de memoria AgentCore para ese alumno y la conversación.
4. Crea un agente de Strands con el administrador de sesiones de memoria.
5. Permite que el administrador de sesión almacene mensajes y recupere preferencias relevantes.
El código crea un agente de Strands por invocación porque su configuración de memoria pertenece a un único actor y sesión. El modelo Bedrock y el indicador del sistema aún se pueden reutilizar.
Aquí está el código revisado del Agente de Strands.
importar sistema operativo desde bedrock_agentcore.memory.integrations.strands.config importar (AgentCoreMemoryConfig, RetrievalConfig,) desde bedrock_agentcore.memory.integrations.strands.session_manager importar (AgentCoreMemorySessionManager,) desde bedrock_agentcore.runtime importar BedrockAgentCoreApp desde strands importar Agente desde strands.models importar aplicación BedrockModel = BedrockAgentCoreApp() MODEL_ID = os.getenv( "BEDROCK_MODEL_ID", "global.anthropic.claude-sonnet-4-6", ) REGION = os.getenv("AWS_REGION", "us-west-2") MEMORY_ID = os.getenv("MEMORY_LEARNERPREFERENCES_ID") SUBJECT_PREFIXES = { "mathematics": ( "Esta es tu PYME de Matemáticas. " "La respuesta a tu pregunta es la siguiente." ), "physics": ( "Esta es tu PYME de Física. " "La respuesta a tu pregunta es la siguiente." ), "química": ("Esta es tu PYME de Química. " "La respuesta a tu pregunta es la siguiente." ), "geografía": ( "Esta es tu PYME de Geografía. " "La respuesta a tu pregunta es la siguiente." ), } def load_model() -> BedrockModel: return BedrockModel( model_id=MODEL_ID, region_name=REGION, temperatura=0.2, max_tokens=1_500, ) def build_system_prompt() -> str: prefixes = "n".join( f"- {subject}: {prefix}" para el tema, prefijo en SUBJECT_PREFIXES.items() ) return ( "Eres un educativo Asistente de clasificación para SME. " "Primero decida si la pregunta del usuario es principalmente sobre " "matemáticas, física, química, geografía o una materia " "no admitida. Responda solo preguntas sobre matemáticas, física, química " "o geografía. Para las preguntas admitidas, " "comience con el prefijo exacto del " "tema elegido y luego brinde una explicación clara y precisa " "Cuando una pregunta se superponga con temas, elija el tema más " "importante para responderla. recuperó las preferencias del alumno al decidir el " "nivel, el estilo y los ejemplos en la respuesta. " "Para preguntas no admitidas, responda exactamente: " ""Lo siento, no sé la respuesta."nn" "Prefijos de asunto requeridos:n" f"{prefijos}" ) MODEL = load_model() SYSTEM_PROMPT = build_system_prompt() def build_session_manager( actor_id: str, session_id: str, ) -> AgentCoreMemorySessionManager | Ninguno: si no MEMORY_ID: devolver Ninguno namespace = f"/users/{actor_id}/preferences/" Memory_config = AgentCoreMemoryConfig(memory_id=MEMORY_ID, actor_id=actor_id, session_id=session_id, retrieval_config={ namespace: RetrievalConfig( top_k=3, relevancia_score=0.5, ) }, ) return AgentCoreMemorySessionManager( agentcore_memory_config=memory_config, region_name=REGION, ) def get_actor_id(carga útil, contexto) -> str | Ninguno: actor_id = payload.get("userId") si isinstance(actor_id, str) y actor_id.strip(): devuelve actor_id.strip() request_headers = getattr(context, "request_headers", Ninguno) o {} para nombre, valor en request_headers.items(): si name.casefold() == "x-learner-id": si isinstance(value, str) y value.strip(): devuelve value.strip() devuelve Ninguno @app.entrypoint def invoke(carga útil, contexto): solicitud = carga útil.get("prompt") actor_id = get_actor_id(carga útil, contexto) si no isinstance(prompt, str) o no solicitud.strip(): devuelve {"error": "Se requiere una pregunta que no esté vacía."} si len(prompt) > 2_000: devuelve {"error": "La pregunta excede la longitud máxima."} si no actor_id: return {"error": "Se requiere un ID de usuario que no esté vacío."} if len(actor_id) > 128: return {"error": "userId excede la longitud máxima."} session_id = getattr(context, "session_id", Ninguno) o "local-session" session_manager = build_session_manager(actor_id, session_id) agente = Agente( model=MODEL, session_manager=session_manager, system_prompt=SYSTEM_PROMPT, ) respuesta = agente(prompt.strip()) return { "respuesta": str(respuesta), "memory_enabled": session_manager no es Ninguno, } if __name__ == "__main__": app.run()
Guarde esto y vuelva a implementarlo como antes. Una vez hecho esto, podemos invocarlo así.
PS C:Usersthomaprojectsstrands-agentcore-demosmetriage> agentcore invoke ` "Prefiero mis respuestas en lenguaje pirata" ` -H "X-Learner-Id: learner-7f83a2" ` –stream { "response": "¡Arrr, he notado tu preferencia por el lenguaje pirata, amigo! Adelante, hazme tu pregunta sobre matemáticas, física, química o geografía, y ¡Te responderé en la mejor lengua pirata de los siete mares! 🏴☠️⚓n", "memory_enabled": true } Sesión: 2a94f2d9-9e40-417e-a53a-ad9393f0490d Para reanudar: agentcore invoke –session-id 2a94f2d9-9e40-417e-a53a-ad9393f0490d Registro: C:Usersthomaprojectsstrands-agentcore-demosmetriageagentcore.clilogsinvokeinvoke-SMETriage-20260611-135649.log
Vemos que el indicador Memory_enabled está establecido en verdadero, y ahora simplemente pasamos nuestro ID de alumno cuando hacemos una pregunta, como esta…
PS C:Usersthomaprojectsstrands-agentcore-demosmetriage> agentcore invoke ` "Explique la segunda ley de Newton". ` -H "X-Learner-Id: learner-7f83a2" ` –stream { "response": "physics: Esta es tu PYME de física. La respuesta a tu pregunta es la siguiente.nn¡Ah, amigo! ¡Reúnanse y presten atención! ⚓nn**Segunda ley del movimiento de Newton**, arrr, será uno de los mayores tesoros de todos ciencia!nn—nn🏴☠️ **La Ley, en términos simples piratas:**nn> **Fuerza = Masa × Aceleración**n> *(o como lo garabateamos en el casco del barco: **F = ma**)*nn—nn**¿Qué significa, preguntas?**nn- ⚓ **Fuerza (F)** — Esto es el empujón o tirón das algo, medido en Newtons, ¡arrr!n- 💀 **Masa (m)** — ¡Esta es la cantidad de *cosas* que componen tu bala de cañón o cofre del tesoro, medida en kilogramos!n- 🌊 **Aceleración (a)** — ¡Así de rápido *cambia* tu velocidad, medida en metros por segundo al cuadrado!nn—nn**Un buen ejemplo de en alta mar:**nnSi disparas una **bala de cañón pesada** y una **bala de cañón ligera** con la misma fuerza, ¡la más ligera sale volando con MÁS aceleración! ¡La más pesada será lenta, como un casco cubierto de percebes!nnAsí que recuerda, cuanto más grande sea la masa, más fuerte deberás empujar para obtener la misma aceleración. nn¡Ahora iza las velas y aplica tu física! scallywag! 🦜n", "memory_enabled": true } Sesión: d665e549-6bf2-470d-96ce-506b5be141e2 Para reanudar: invocación de agentcore –session-id d665e549-6bf2-470d-96ce-506b5be141e2 Registro: C:Usersthomaprojectsstrands-agentcore-demosmetriageagentcore.clilogsinvokeinvoke-SMETriage-20260611-155936.log
Costos de funcionamiento
El SDK de Strands Agents en sí es de código abierto y de uso gratuito. Puedes ejecutarlo:
Localmente en su computadora portátil En EC2 En un contenedor Docker En Lambda En cualquier otro lugar que elija
Solo paga por el LLM al que está llamando (por ejemplo, Amazon Nova, Anthropic Claude, OpenAI GPT, etc.) y cualquier infraestructura en la que lo esté ejecutando (EC2, Lambda, etc.). Entonces, si crea un agente de Strands que llama a Amazon Bedrock, su factura es esencialmente:
Costos de inferencia del modelo Bedrock + EC2/Lambda/etc. costos (si corresponde)
AgentCore es una plataforma administrada en AWS que proporciona capacidades empresariales y se factura según las partes de AgentCore que se utilicen. En nuestros ejemplos, utilizamos tiempo de ejecución y memoria, los cuales generarían costos.
Para obtener más información, consulte los enlaces a continuación.
https://aws.amazon.com/bedrock/agentcore/pricing
https://aws.amazon.com/bedrock/pricing/
Resumen
En este artículo se analiza cómo crear y ejecutar un flujo de trabajo agente en AWS. Los dos componentes principales que le permiten hacer esto se llaman Strands y AgentCore.
Strands se utiliza para definir de qué es capaz su agente y qué modelo utiliza para realizar su trabajo. Strands ofrece soporte de modelo flexible. Puede utilizar cualquier LLM en Amazon Bedrock que admita el uso y la transmisión de herramientas, un modelo de la familia de modelos Claude de Anthropic a través de la API de Anthropic, un modelo a través de Ollama y muchos otros proveedores de modelos, como OpenAI a través de LiteLLM. Además, puede definir su propio proveedor de modelo personalizado si lo desea.
AgentCore le permite probar el agente localmente antes de la implementación completa en la infraestructura de nube de AWS. AgentCore es independiente del agente: puede crear agentes usando Strands como mostramos, así como otros sistemas de creación de agentes como CrewAI y LangGraph.
AgentCore tiene muchas más funciones que esto, incluida la capacidad de agregar memoria, observabilidad, evaluación y más a su flujo de trabajo agente.
El ejemplo que codificamos fue un agente de clasificación experto en la materia que admite la respuesta a preguntas de matemáticas, física, química y geografía. Utilizó Bedrock, con Anthropic Sonnet LLM, para comprender e interpretar cada pregunta y seleccionar la respuesta experta adecuada. Las preguntas fuera de los temas admitidos fueron cortésmente rechazadas.
También hablé sobre la diferencia entre sesiones de Runtime y memoria a largo plazo. Una sesión en tiempo de ejecución preserva el contexto durante una sola conversación, lo que permite al agente responder preguntas de seguimiento. Ese contexto se pierde cuando comienza una nueva sesión.
AgentCore Memory soluciona esto permitiendo que información útil se transmita a través de conversaciones separadas. Al asociar preferencias con un usuario a través del campo de encabezado de solicitud actor_id y X-Learner-Id, el agente puede recordar instrucciones como mantener respuestas breves o, en el ejemplo que mostré, responder preguntas en lenguaje pirata.
Estas preferencias se recuperan al hacer una pregunta con el ID de alumno adecuado, lo que permite al agente responder utilizando un estilo preferido sin tener que repetirlo en la solicitud.
Si desea obtener más información, la documentación oficial de AWS Strands está disponible aquí. Para obtener más información sobre AgentCore, haga clic en este enlace.