259 lines
6.3 KiB
Markdown
259 lines
6.3 KiB
Markdown
# System Prompt Configuration Patterns
|
|
|
|
This guide covers different ways to configure system prompts in the Claude Agent SDK.
|
|
|
|
## Overview
|
|
|
|
System prompts define Claude's role, behavior, and capabilities. The SDK supports multiple configuration patterns.
|
|
|
|
## Configuration Types
|
|
|
|
### 1. No System Prompt (Vanilla Claude)
|
|
|
|
Claude operates without additional instructions:
|
|
|
|
```python
|
|
from claude_agent_sdk import query
|
|
|
|
async for message in query(prompt="What is 2 + 2?"):
|
|
# Process messages
|
|
pass
|
|
```
|
|
|
|
**Use when:** You want vanilla Claude behavior without specialized instructions.
|
|
|
|
### 2. String System Prompt
|
|
|
|
Custom instructions as a simple string:
|
|
|
|
```python
|
|
from claude_agent_sdk import ClaudeAgentOptions, query
|
|
|
|
options = ClaudeAgentOptions(
|
|
system_prompt="You are a helpful Python expert. Explain concepts simply."
|
|
)
|
|
|
|
async for message in query(prompt="Explain async/await", options=options):
|
|
pass
|
|
```
|
|
|
|
**Use when:** You need custom behavior for a specific task or domain.
|
|
|
|
### 3. Preset System Prompt
|
|
|
|
Use the official Claude Code preset:
|
|
|
|
```python
|
|
options = ClaudeAgentOptions(
|
|
system_prompt={"type": "preset", "preset": "claude_code"}
|
|
)
|
|
```
|
|
|
|
The `"claude_code"` preset includes:
|
|
|
|
- Tool usage patterns (Bash, Read, Write, Edit, etc.)
|
|
- Best practices for code modification
|
|
- Knowledge of the Task tool for delegating to subagents
|
|
- Git commit and PR workflows
|
|
- Security guidelines
|
|
|
|
**Use when:** Building SDK applications that orchestrate subagents or use file tools.
|
|
|
|
### 4. Preset with Append
|
|
|
|
Extend the Claude Code preset with additional instructions:
|
|
|
|
```python
|
|
options = ClaudeAgentOptions(
|
|
system_prompt={
|
|
"type": "preset",
|
|
"preset": "claude_code",
|
|
"append": "Always explain your reasoning before implementing changes."
|
|
}
|
|
)
|
|
```
|
|
|
|
**Use when:** You need Claude Code behavior plus domain-specific instructions.
|
|
|
|
## Common Patterns
|
|
|
|
### Orchestrator Agent
|
|
|
|
Main agent that delegates to subagents:
|
|
|
|
```python
|
|
options = ClaudeAgentOptions(
|
|
system_prompt="claude_code", # Knows how to use Task tool
|
|
allowed_tools=["Bash", "Task", "Read", "Write"],
|
|
agents={
|
|
"subagent-1": AgentDefinition(...),
|
|
"subagent-2": AgentDefinition(...)
|
|
}
|
|
)
|
|
```
|
|
|
|
**Critical:** Orchestrators must use `system_prompt="claude_code"` to understand how to delegate to subagents.
|
|
|
|
### Domain Expert
|
|
|
|
Specialized behavior for specific tasks:
|
|
|
|
```python
|
|
options = ClaudeAgentOptions(
|
|
system_prompt={
|
|
"type": "preset",
|
|
"preset": "claude_code",
|
|
"append": """You are a security auditor for Python applications.
|
|
|
|
Focus on:
|
|
- SQL injection vulnerabilities
|
|
- Command injection risks
|
|
- Authentication/authorization flaws
|
|
- Secrets management issues
|
|
|
|
Provide specific, actionable security recommendations."""
|
|
},
|
|
allowed_tools=["Read", "Grep", "Glob"]
|
|
)
|
|
```
|
|
|
|
### Constrained Agent
|
|
|
|
Agent with specific behavioral constraints:
|
|
|
|
```python
|
|
options = ClaudeAgentOptions(
|
|
system_prompt="""You are a read-only code analyzer.
|
|
|
|
IMPORTANT:
|
|
- Never modify files
|
|
- Never execute code
|
|
- Only analyze and report findings
|
|
|
|
Provide detailed analysis with file/line references.""",
|
|
allowed_tools=["Read", "Grep", "Glob"]
|
|
)
|
|
```
|
|
|
|
## Shorthand vs Dict Format
|
|
|
|
The SDK accepts both shorthand and dictionary formats for the `claude_code` preset:
|
|
|
|
```python
|
|
# Dict format (official examples prefer this)
|
|
system_prompt={"type": "preset", "preset": "claude_code"}
|
|
|
|
# Shorthand format (equivalent, but less explicit)
|
|
system_prompt="claude_code"
|
|
|
|
# With append (dict only)
|
|
system_prompt={
|
|
"type": "preset",
|
|
"preset": "claude_code",
|
|
"append": "Additional instructions here"
|
|
}
|
|
```
|
|
|
|
**Note:** The shorthand `system_prompt="claude_code"` is a convenience that's equivalent to the full dict format. Both are valid and produce identical behavior. Official examples prefer the dict format for explicitness, but shorthand works fine for simple cases.
|
|
|
|
## Best Practices
|
|
|
|
1. **Use preset for orchestrators** - Orchestrators need `system_prompt="claude_code"` for Task tool knowledge
|
|
2. **Use append for specialization** - Extend preset with domain-specific instructions
|
|
3. **Match tools to prompt** - System prompt should align with allowed_tools
|
|
4. **Be specific** - Clear, specific instructions produce better results
|
|
5. **Test variations** - Experiment with different prompts for your use case
|
|
|
|
## Examples
|
|
|
|
### File Processing Agent
|
|
|
|
```python
|
|
options = ClaudeAgentOptions(
|
|
system_prompt={
|
|
"type": "preset",
|
|
"preset": "claude_code",
|
|
"append": """Process CSV files with these requirements:
|
|
- Validate data types
|
|
- Handle missing values
|
|
- Generate summary statistics
|
|
- Create visualizations using matplotlib"""
|
|
},
|
|
allowed_tools=["Read", "Write", "Bash"]
|
|
)
|
|
```
|
|
|
|
### Documentation Generator
|
|
|
|
```python
|
|
options = ClaudeAgentOptions(
|
|
system_prompt="""You are a technical documentation specialist.
|
|
|
|
Generate clear, comprehensive documentation with:
|
|
- Overview and purpose
|
|
- API reference with types
|
|
- Usage examples
|
|
- Common pitfalls and troubleshooting
|
|
|
|
Use Google-style Python docstrings.""",
|
|
allowed_tools=["Read", "Write", "Edit", "Grep"]
|
|
)
|
|
```
|
|
|
|
### Test Writer
|
|
|
|
```python
|
|
options = ClaudeAgentOptions(
|
|
system_prompt={
|
|
"type": "preset",
|
|
"preset": "claude_code",
|
|
"append": """Write pytest-based tests following these patterns:
|
|
- Use fixtures for setup/teardown
|
|
- Parametrize tests when appropriate
|
|
- Include edge cases and error conditions
|
|
- Aim for >90% code coverage"""
|
|
},
|
|
allowed_tools=["Read", "Write", "Bash"]
|
|
)
|
|
```
|
|
|
|
## Anti-Patterns
|
|
|
|
❌ **Orchestrator without claude_code preset**
|
|
|
|
```python
|
|
# Orchestrator won't know how to use Task tool
|
|
options = ClaudeAgentOptions(
|
|
agents={...}
|
|
# Missing system_prompt="claude_code"
|
|
)
|
|
```
|
|
|
|
✅ **Proper orchestrator configuration**
|
|
|
|
```python
|
|
options = ClaudeAgentOptions(
|
|
system_prompt="claude_code",
|
|
agents={...}
|
|
)
|
|
```
|
|
|
|
❌ **Conflicting instructions**
|
|
|
|
```python
|
|
# Tells agent to modify files but only allows read tools
|
|
options = ClaudeAgentOptions(
|
|
system_prompt="Fix any bugs you find",
|
|
allowed_tools=["Read", "Grep"] # Can't actually fix anything
|
|
)
|
|
```
|
|
|
|
✅ **Aligned tools and instructions**
|
|
|
|
```python
|
|
options = ClaudeAgentOptions(
|
|
system_prompt="Analyze code for bugs and report findings",
|
|
allowed_tools=["Read", "Grep", "Glob"]
|
|
)
|
|
```
|