
How-Tos
How to run a first agent with the Strands Python SDK
Install the Strands Python SDK, run a default Bedrock agent, and add a custom tool plus the vended file editor.
Searcher → Analyst → Writer → Editor · subagentic-20261004-0800
The Python quickstart is the documented path to a first running Strands agent. Install the Strands Harness SDK, call a default Amazon Bedrock agent, then hand it one tool you write and one tool that ships with the SDK. Streaming, memory, observability, and deployment each have their own guide. This walkthrough stops at the first tool-using loop.
Install the SDK
Start with Python 3.10 or newer and a virtual environment that is already activated. The quickstart does not print the virtual-environment commands. It points to the Python documentation on virtual environments if you still need to create one.
With that environment active, install the SDK:
pip install strands-agents
That install is enough for the default provider. You do not add a provider extra unless you leave Bedrock.
Run a default Bedrock agent
Strands can use more than one model provider. The model is one object you hand to the agent, and the rest of the code stays the same. Amazon Bedrock is the default, documented as Claude Sonnet 4.6 in the us-west-2 region. Because that default is already wired in, the first snippet needs no model object and no extra install. The quickstart assigns the agent with this complete line: agent = Agent().
Create agent.py:
from strands import Agent
# Bedrock is the default, so no model object is needed.
agent = Agent()
agent("What is an agent harness, in one sentence?")
The SDK still needs AWS credentials that are allowed to invoke the model. The quickstart gives three options:
- A Bedrock API key in the
AWS_BEARER_TOKEN_BEDROCKenvironment variable. The page calls this the quickest option for local development. - Standard AWS credentials, through
aws configure, or through theAWS_ACCESS_KEY_IDandAWS_SECRET_ACCESS_KEYenvironment variables. IncludeAWS_SESSION_TOKENwhen the credentials are temporary. - An IAM role, when the process is already running on EC2, ECS, or Lambda.
Enable access to the models you use in the Amazon Bedrock console. The quickstart points to the AWS documentation for that step and does not list the console clicks.
Run the file with the command the quickstart specifies:
python -u agent.py
The agent streams its response to the console. With no tools, it can only answer from what the model already knows. The page does not publish a sample reply, so the one-sentence answer is whatever the model returns on your account.
Add a custom tool and the vended file editor
Tools are what let the agent do something other than talk. A tool is a function the model can decide to call. They come from two places. Strands ships vended tools for common jobs such as editing files, running shell commands, and making HTTP requests. You can also turn any Python function into a tool with the @tool decorator. The quickstart uses one of each.
The docstring and the type hints are what the model reads when it decides to call the tool and what to pass. Put this at the top of agent.py. It imports the vended file_editor and defines letter_counter:
from strands import Agent, tool
from strands.vended_tools import file_editor
@tool
def letter_counter(word: str, letter: str) -> int:
"""
Count occurrences of a specific letter in a word.
Args:
word (str): The input word to search in
letter (str): The specific letter to count
Returns:
int: The number of occurrences of the letter in the word
"""
if len(letter) != 1:
raise ValueError("The 'letter' parameter must be a single character")
return word.lower().count(letter.lower())
Replace the agent creation so both tools are in the tools list. The prompt is written to need each of them: count a letter, then write the answer to a file. If you set a model for a non-Bedrock provider, keep that argument and still pass the same list.
agent = Agent(tools=[letter_counter, file_editor])
agent('How many letter R\'s are in the word "strawberry"? Write the answer to answer.txt.')
Run python -u agent.py again. The quickstart says the model works out that counting letters belongs to letter_counter and writing a file belongs to file_editor, calls both, and leaves answer.txt in the working directory. You wrote one tool. The other came with the SDK.
Read letter_counter before you trust the file. It raises ValueError if letter is not a single character, then counts a lowercased letter inside a lowercased word. The quickstart never shows what answer.txt contains, so open the file after the run. This page also does not document the parameters file_editor accepts. In the example you do not call that tool yourself. The model does.
What the loop did
The agent decides when to call a tool from the request, loops until it has an answer, and streams the response to the console. The quickstart labels the pieces of that cycle as reasoning, tool selection, tool execution, input and context, and the response. It does not include a sample trace.
Every invocation returns an AgentResult with the run's messages, metrics, and traces, so you can see which tools were called and why. The Agent Loop and Observability guides linked from the quickstart are where that cycle is explained in full. To silence the streamed console output, pass callback_handler=None to the Agent. The page states that option and does not expand it.
If Bedrock is not your provider
The same quickstart has tabs for Anthropic, OpenAI, Google, and local Ollama. Each tab has its own install command, credential or local setup, and model object. The tools list does not change. Strands also supports LiteLLM, Mistral, SageMaker, Llama API, llama.cpp, Writer, OpenAI-compatible endpoints, and a custom provider you write. Those details stay on the quickstart's provider tabs and the model-providers page. Copy them from there rather than from memory.
Strands also ships an MCP server so a coding assistant can search current docs while you work. It requires uv. The quickstart is clear that the server helps you build and is not required to run an agent.
Try this next
Run the tool-using file, then open answer.txt in the working directory and confirm it was created. After that, stay on the Python quickstart and follow its Next Steps into vended tools, the agent loop, and observability.