Strands Agents
SDK open source de AWS para construir agentes de IA con un enfoque model-driven. Agentes funcionales en pocas líneas de código, con soporte multi-modelo, herramientas personalizadas, MCP, multi-agente y observabilidad integrada.
Strands Agents es un SDK open source (Apache 2.0) creado por AWS que adopta un enfoque model-driven para construir agentes de IA. La premisa: el modelo de lenguaje es el orquestador — tú defines herramientas y un prompt, y el modelo decide cuándo y cómo usarlas.
¿Por qué importa?
La mayoría de frameworks de agentes requieren definir flujos explícitos, grafos de decisión o cadenas de pasos. Strands invierte el paradigma:
- Sin orquestación manual — el LLM decide el flujo basado en el contexto
- Agente funcional en 4 líneas — sin boilerplate
- Model-agnostic — Bedrock, OpenAI, Anthropic, Ollama, Mistral, Gemini, y más
- Herramientas como funciones Python — decorador
@tooly listo - MCP nativo — conectar servidores MCP como fuentes de herramientas
- Observabilidad integrada — trazas, métricas y logs desde el primer momento
Ejemplo mínimo
from strands import Agent
agent = Agent()
agent("¿Cuál es la capital de Francia?")Eso es un agente funcional. Usa Bedrock con Claude por defecto.
Herramientas personalizadas
from strands import Agent, tool
@tool
def weather(city: str) -> str:
"""Get current weather for a city.
Args:
city: Name of the city to check weather for.
Returns:
Current weather description.
"""
# En producción, llamar a una API real
return f"Sunny, 22°C in {city}"
@tool
def convert_temperature(celsius: float) -> float:
"""Convert Celsius to Fahrenheit.
Args:
celsius: Temperature in Celsius.
Returns:
Temperature in Fahrenheit.
"""
return celsius * 9/5 + 32
agent = Agent(tools=[weather, convert_temperature])
agent("What's the weather in Madrid? Give me the temperature in Fahrenheit too.")El agente decide autónomamente: primero llama weather("Madrid"), luego convert_temperature(22.0), y compone la respuesta.
Proveedores de modelos
from strands import Agent
from strands.models import BedrockModel
# Amazon Bedrock (default)
agent = Agent(model="anthropic.claude-sonnet-4-20250514-v1:0")
# Con configuración explícita
bedrock = BedrockModel(
model_id="anthropic.claude-sonnet-4-20250514-v1:0",
region_name="us-west-2",
temperature=0.3,
)
agent = Agent(model=bedrock)# OpenAI
from strands.models import OpenAIModel
agent = Agent(model=OpenAIModel(model_id="gpt-4o"))
# Anthropic directo
from strands.models import AnthropicModel
agent = Agent(model=AnthropicModel(model_id="claude-sonnet-4-20250514"))
# Ollama (local)
from strands.models import OllamaModel
agent = Agent(model=OllamaModel(model_id="llama3.1"))Proveedores soportados: Amazon Bedrock, Amazon Nova, Anthropic, OpenAI, Gemini, Ollama, Mistral, LiteLLM, LlamaAPI, SageMaker, Writer, llama.cpp, y custom providers.
Integración con MCP
Conectar servidores MCP como fuentes de herramientas:
from strands import Agent
from strands.tools.mcp import MCPClient
# Conectar a un servidor MCP
mcp = MCPClient(command="uvx", args=["my-mcp-server"])
with mcp:
agent = Agent(tools=mcp.list_tools())
agent("Use the MCP tools to complete this task")Patrones multi-agente
Agents as Tools
Un agente puede usar otros agentes como herramientas:
from strands import Agent
researcher = Agent(
system_prompt="You are a research specialist.",
tools=[web_search]
)
writer = Agent(
system_prompt="You are a technical writer.",
tools=[researcher.as_tool(
name="research",
description="Research a topic thoroughly"
)]
)
writer("Write an article about quantum computing")Swarm
Múltiples agentes colaborando con handoffs:
from strands import Agent
from strands.multiagent import Swarm
triage = Agent(system_prompt="Route to the right specialist.")
billing = Agent(system_prompt="Handle billing questions.", tools=[billing_api])
technical = Agent(system_prompt="Handle technical issues.", tools=[diagnostics])
swarm = Swarm(
agents={"triage": triage, "billing": billing, "technical": technical},
entry_point="triage"
)
swarm("I can't log in and I was charged twice")Graph
Flujos dirigidos con condiciones:
from strands.multiagent import Graph
graph = Graph()
graph.add_node("classify", classify_agent)
graph.add_node("respond", respond_agent)
graph.add_node("escalate", escalate_agent)
graph.add_edge("classify", "respond", condition=lambda r: r.priority == "low")
graph.add_edge("classify", "escalate", condition=lambda r: r.priority == "high")
graph.run("Customer complaint about delivery")Observabilidad
Cada invocación retorna un AgentResult con trazas y métricas:
result = agent("What is the square root of 144?")
# Métricas de uso
print(result.metrics.get_summary())
# {
# "total_cycles": 2,
# "total_duration": 1.88,
# "accumulated_usage": {"inputTokens": 3921, "outputTokens": 83},
# "tool_usage": {"calculator": {"call_count": 1, "success_rate": 1.0}}
# }Exportar a OpenTelemetry para Datadog, Grafana, etc.
Streaming
import asyncio
from strands import Agent
agent = Agent(callback_handler=None)
async def stream():
async for event in agent.stream_async("Explain quantum computing"):
if "data" in event:
print(event["data"], end="", flush=True)
asyncio.run(stream())Structured output
from pydantic import BaseModel
from strands import Agent
class MovieReview(BaseModel):
title: str
rating: float
summary: str
agent = Agent()
result = agent.structured_output(
"Review the movie Inception",
output_model=MovieReview
)
print(result.title) # "Inception"
print(result.rating) # 9.2Deploy a producción
Strands agents son Python estándar — se despliegan en cualquier lugar:
- AWS Lambda — serverless, pay-per-invocation
- AWS Fargate / ECS — contenedores
- Amazon EKS — Kubernetes
- Amazon EC2 — instancias
- Amazon Bedrock AgentCore — managed agent runtime
- Docker — cualquier plataforma con contenedores
¿Cuándo elegirlo?
Buena opción cuando:
- Quieres agentes funcionales con mínimo código
- Necesitas flexibilidad de modelos (cambiar provider sin reescribir)
- Ya usas AWS y Bedrock
- Necesitas MCP nativo
- Quieres observabilidad sin configuración adicional
- Proyectos que van de prototipo a producción
Considerar alternativas cuando:
- Necesitas flujos determinísticos estrictos (LangGraph puede ser mejor)
- Tu stack es exclusivamente OpenAI (el SDK de OpenAI es más directo)
- Prefieres TypeScript como lenguaje principal (Strands tiene SDK TS pero Python es más maduro)
Comparación con alternativas
| Aspecto | Strands Agents | LangChain/LangGraph | CrewAI | OpenAI SDK |
|---|---|---|---|---|
| Enfoque | Model-driven | Chain/Graph-driven | Role-based | API-driven |
| Complejidad | Baja | Alta | Media | Baja |
| Multi-modelo | Sí (15+) | Sí | Limitado | Solo OpenAI |
| MCP nativo | Sí | Plugin | No | No |
| Multi-agente | Swarm, Graph, A2A | LangGraph | Crews | Swarm (beta) |
| Observabilidad | Integrada | LangSmith (pago) | Limitada | Limitada |
| Licencia | Apache 2.0 | MIT | MIT | MIT |
| Respaldo | AWS | LangChain Inc. | CrewAI Inc. | OpenAI |
Ecosistema
- strands-agents — SDK principal (Python y TypeScript)
- strands-agents-tools — paquete comunitario de herramientas
- strands-agents-builder — agente que ayuda a construir otros agentes
- strands-agents-mcp-server — servidor MCP para asistentes de IDE
- strands-evals — SDK de evaluación de agentes
Referencias
- Strands Agents Documentation — AWS, 2025. Documentación oficial completa.
- strands-agents/sdk-python — GitHub, 2025. Repositorio del SDK de Python.
- Introducing Strands Agents — AWS, 2025. Post de lanzamiento oficial.
- Strands Agents 1.0: Production-Ready Multi-Agent Orchestration — AWS Open Source Blog, 2025. Anuncio de la versión 1.0.
- strands-agents on PyPI — PyPI, 2025. Paquete oficial con instrucciones de instalación.