The agent loop runs tool calls, feeds results back, and iterates until stop_reason is end_turn.
Building a Complete Agent Loop
import anthropic, subprocess, json
client = anthropic.Anthropic()
def execute_tool(name: str, inp: dict) -> str:
if name == "run_python":
result = subprocess.run(
["python3","-c",inp["code"]],
capture_output=True, text=True, timeout=10
)
return result.stdout or result.stderr
if name == "read_file":
return open(inp["path"]).read()
return f"Unknown tool: {name}"
def run_agent(goal: str, max_turns: int = 10) -> str:
messages = [{"role":"user","content":goal}]
for turn in range(max_turns):
resp = client.messages.create(
model="claude-opus-4-5",
max_tokens=2048,
tools=tools,
messages=messages
)
messages.append({"role":"assistant","content":resp.content})
if resp.stop_reason == "end_turn":
return resp.content[-1].text # done!
tool_results = []
for block in resp.content:
if block.type == "tool_use":
result = execute_tool(block.name, block.input)
tool_results.append({
"type":"tool_result",
"tool_use_id":block.id,
"content":result
})
messages.append({"role":"user","content":tool_results})
return "Max turns reached"