Chapter 3: Claude Agent SDK — Building Agentic Systems
3.1 What is an Agentic Loop
The agentic loop is the core pattern for autonomous task execution. The model doesn't just answer—it performs a sequence of actions:
1. Send a request to Claude with tools
2. Receive a response
3. Check stop_reason:
- "tool_use" -> execute the tool, append the result to history, go back to step 1
- "end_turn" -> the task is complete, show the result to the user
4. Repeat until completion
This is a model-driven approach: Claude decides which tool to call next based on context and prior tool results. This differs from hard-coded decision trees where the action sequence is fixed.
Anti-patterns (avoid):
- Parsing assistant text to detect completion ("Task completed")
- Using an arbitrary iteration limit (e.g.,
max_iterations=5) as the primary stop condition - Checking whether the assistant produced textual content as a completion signal
Correct approach: the only reliable completion signal is stop_reason == "end_turn".
3.2 AgentDefinition Configuration
AgentDefinition is the agent configuration object in the Claude Agent SDK:
agent = AgentDefinition(
name="customer_support",
description="Handles customer requests for returns and order issues",
system_prompt="You are a customer support agent...",
allowed_tools=["get_customer", "lookup_order", "process_refund", "escalate_to_human"],
# For a coordinator:
# allowed_tools=["Task", "get_customer", ...]
)
Key parameters:
name/description— identification and description of the agentsystem_prompt— system prompt with instructionsallowed_tools— list of allowed tools (principle of least privilege)
3.3 Hub-and-Spoke: Coordinator and Subagents
A multi-agent architecture is typically built as a hub-and-spoke topology:
Coordinator
/ | \
Subagent1 Subagent2 Subagent3
(search) (analysis) (synthesis)
The coordinator is responsible for:
- Decomposing the task into subtasks
- Deciding which subagents are needed (dynamic selection)
- Delegating work to subagents
- Aggregating and validating results
- Handling errors and retries
- Communicating results to the user
Critical principle: subagents have isolated context.
- Subagents do not automatically inherit the coordinator's conversation history
- All required context must be explicitly passed in the subagent prompt
- Subagents do not share memory across calls
- All communication flows through the coordinator (for observability and error control)
3.4 The Task Tool for Spawning Subagents
Subagents are spawned via the Task tool:
# The coordinator's allowedTools must include "Task"
coordinator_agent = AgentDefinition(
allowed_tools=["Task", "get_customer"]
)
Explicit context passing is mandatory:
# Bad: the subagent has no context
Task: "Analyze the document"
# Good: full context in the prompt
Task: "Analyze the following document.
Document: [full document text]
Prior search results: [web search results]
Output format requirements: [schema]"
Parallel spawning: a coordinator can call multiple Tasks in one response—subagents run in parallel:
# One coordinator response contains:
Task 1: "Search for articles about X"
Task 2: "Analyze document Y"
Task 3: "Search for articles about Z"
# All three run concurrently
3.5 Hooks in the Agent SDK
Hooks allow interception and transformation at specific points in the agent lifecycle.
PostToolUse intercepts a tool result before it is provided to the model:
# Example: normalize date formats from different MCP tools
@hook("PostToolUse")
def normalize_dates(tool_result):
# Convert Unix timestamp -> ISO 8601
# Convert "Mar 5, 2025" -> "2025-03-05"
return normalized_result
Outgoing-call interception hook blocks actions that violate policy:
# Example: block refunds above $500
@hook("PreToolUse")
def enforce_refund_limit(tool_call):
if tool_call.name == "process_refund" and tool_call.args.amount > 500:
return redirect_to_escalation(tool_call)
Key difference: hooks vs prompt instructions
| Attribute | Hooks | Prompt instructions |
|---|---|---|
| Guarantee | Deterministic (100%) | Probabilistic (>90%, not 100%) |
| When to use | Critical business rules, financial operations, compliance | General preferences, recommendations, formatting |
| Example | Block refunds > $500 | "Try to solve before escalating" |
Rule: when failure has financial, legal, or safety consequences—use hooks, not prompts.