Conceptos

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.

evergreen#ai#agents#sdk#open-source#aws#mcp

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 @tool y 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.2

Deploy 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

AspectoStrands AgentsLangChain/LangGraphCrewAIOpenAI SDK
EnfoqueModel-drivenChain/Graph-drivenRole-basedAPI-driven
ComplejidadBajaAltaMediaBaja
Multi-modeloSí (15+)LimitadoSolo OpenAI
MCP nativoPluginNoNo
Multi-agenteSwarm, Graph, A2ALangGraphCrewsSwarm (beta)
ObservabilidadIntegradaLangSmith (pago)LimitadaLimitada
LicenciaApache 2.0MITMITMIT
RespaldoAWSLangChain 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

Conceptos