TL;DR — Strands Agents is AWS's open-source Python SDK for building AI agents. It uses a simple model-driven loop: the model decides what to do, calls tools, observes results, and repeats — no graph DSL, no chain abstractions. First-class integration with Amazon Bedrock but works with any provider. Tools are plain Python functions with docstrings. Built for AWS shops that want agents without framework overhead.
What it is
Strands gives you an Agent class that runs a tool-calling loop powered by the model's native tool-use capability. You define tools as decorated Python functions, point at a model (Bedrock, OpenAI, Anthropic, Ollama), and call agent(). The SDK handles the loop, streaming, and tool execution. No chains, no graphs — the model is the control flow.
Why it exists
AWS teams building on Bedrock needed an agent SDK that felt native to their stack — IAM auth, Bedrock model IDs, CloudWatch logging — without pulling in LangChain's entire ecosystem. Strands is that: minimal, model-driven, AWS-native by default but provider-agnostic by design.
Install & setup
pip install strands-agents strands-agents-tools
# For Bedrock (default):
export AWS_REGION=us-east-1
# For OpenAI:
export OPENAI_API_KEY=sk-...
Basic agent
from strands import Agent, tool
@tool
def get_weather(city: str) -> str:
"""Get the current weather for a city."""
return f"Sunny, 22°C in {city}"
agent = Agent(tools=[get_weather])
response = agent("What's the weather in Seattle?")
print(response)
Using with Bedrock
from strands import Agent
from strands.models.bedrock import BedrockModel
model = BedrockModel(model_id="us.anthropic.claude-sonnet-4-20250514")
agent = Agent(model=model, tools=[get_weather])
Using with OpenAI
from strands.models.openai import OpenAIModel
model = OpenAIModel(model_id="gpt-4o")
agent = Agent(model=model, tools=[get_weather])
Streaming
agent = Agent(tools=[get_weather])
for event in agent.stream("What's the weather in London?"):
if event.get("data"):
print(event["data"], end="", flush=True)
Multi-agent
Wrap an agent as a tool for another agent — the sub-agent pattern:
researcher = Agent(tools=[search_tool], system_prompt="You research topics.")
@tool
def ask_researcher(question: str) -> str:
"""Ask the research agent a question."""
return str(researcher(question))
manager = Agent(tools=[ask_researcher])
manager("Research and summarize vLLM's architecture")
When to use, when to skip
Use it if you're on AWS/Bedrock and want a simple, no-framework-overhead agent SDK. The model-driven philosophy means less to learn and debug.
Skip it if you need rich orchestration (LangGraph), middleware (LangChain), or multi-agent conversation patterns (AutoGen). The ecosystem is young.
vs the alternatives
| Tool | Best for | Trade-off |
|---|---|---|
| Strands Agents | AWS/Bedrock, minimal SDK | Young ecosystem, fewer integrations |
| LangChain | Rich ecosystem, provider portability | Heavier |
| Pydantic AI | Type-safe, testable | Not AWS-native |
| Agno | Lightweight, fast | Different defaults |
Verified against Strands Agents docs (strandsagents.com), May 2026.