The simplest way to use the SDK is with a basic question:
import anyiofrom claude_agent_sdk import ( AssistantMessage, TextBlock, query,)async def basic_example(): """Basic example - simple question.""" print("=== Basic Example ===") async for message in query(prompt="What is 2 + 2?"): if isinstance(message, AssistantMessage): for block in message.content: if isinstance(block, TextBlock): print(f"Claude: {block.text}") print()if __name__ == "__main__": anyio.run(basic_example)
You can customize Claude’s behavior using ClaudeAgentOptions:
import anyiofrom claude_agent_sdk import ( AssistantMessage, ClaudeAgentOptions, TextBlock, query,)async def with_options_example(): """Example with custom options.""" print("=== With Options Example ===") options = ClaudeAgentOptions( system_prompt="You are a helpful assistant that explains things simply.", max_turns=1, ) async for message in query( prompt="Explain what Python is in one sentence.", options=options ): if isinstance(message, AssistantMessage): for block in message.content: if isinstance(block, TextBlock): print(f"Claude: {block.text}") print()if __name__ == "__main__": anyio.run(with_options_example)
The max_turns option limits the number of conversation turns. Setting it to 1 ensures Claude responds only once.
import anyiofrom claude_agent_sdk import ( AssistantMessage, ClaudeAgentOptions, ResultMessage, TextBlock, query,)async def with_tools_example(): """Example using tools.""" print("=== With Tools Example ===") options = ClaudeAgentOptions( allowed_tools=["Read", "Write"], system_prompt="You are a helpful file assistant.", ) async for message in query( prompt="Create a file called hello.txt with 'Hello, World!' in it", options=options, ): if isinstance(message, AssistantMessage): for block in message.content: if isinstance(block, TextBlock): print(f"Claude: {block.text}") elif isinstance(message, ResultMessage) and message.total_cost_usd > 0: print(f"\nCost: ${message.total_cost_usd:.4f}") print()if __name__ == "__main__": anyio.run(with_tools_example)
Here’s a complete example running all three patterns:
Full working example
#!/usr/bin/env python3"""Quick start example for Claude Code SDK."""import anyiofrom claude_agent_sdk import ( AssistantMessage, ClaudeAgentOptions, ResultMessage, TextBlock, query,)async def basic_example(): """Basic example - simple question.""" print("=== Basic Example ===") async for message in query(prompt="What is 2 + 2?"): if isinstance(message, AssistantMessage): for block in message.content: if isinstance(block, TextBlock): print(f"Claude: {block.text}") print()async def with_options_example(): """Example with custom options.""" print("=== With Options Example ===") options = ClaudeAgentOptions( system_prompt="You are a helpful assistant that explains things simply.", max_turns=1, ) async for message in query( prompt="Explain what Python is in one sentence.", options=options ): if isinstance(message, AssistantMessage): for block in message.content: if isinstance(block, TextBlock): print(f"Claude: {block.text}") print()async def with_tools_example(): """Example using tools.""" print("=== With Tools Example ===") options = ClaudeAgentOptions( allowed_tools=["Read", "Write"], system_prompt="You are a helpful file assistant.", ) async for message in query( prompt="Create a file called hello.txt with 'Hello, World!' in it", options=options, ): if isinstance(message, AssistantMessage): for block in message.content: if isinstance(block, TextBlock): print(f"Claude: {block.text}") elif isinstance(message, ResultMessage) and message.total_cost_usd > 0: print(f"\nCost: ${message.total_cost_usd:.4f}") print()async def main(): """Run all examples.""" await basic_example() await with_options_example() await with_tools_example()if __name__ == "__main__": anyio.run(main)