505 lines
10 KiB
Markdown
505 lines
10 KiB
Markdown
# ADW Usage Modes: Subscription vs API
|
|
|
|
## Overview
|
|
|
|
ADW infrastructure supports two distinct usage modes, enabling both interactive development and automated workflows without code changes.
|
|
|
|
## Mode A: Claude Max Subscription
|
|
|
|
### What It Is
|
|
|
|
Run Claude Code through your Claude Max subscription without needing API keys.
|
|
|
|
### How It Works
|
|
|
|
```
|
|
User with Claude Max subscription
|
|
↓
|
|
Logged in to Claude Code CLI
|
|
↓
|
|
ADW executes: claude -p "prompt"
|
|
↓
|
|
Claude Code uses subscription auth
|
|
↓
|
|
Prompt executed, results returned
|
|
```
|
|
|
|
No API key configuration needed - authentication happens automatically through your subscription.
|
|
|
|
### Setup
|
|
|
|
**Zero configuration required:**
|
|
|
|
```bash
|
|
# Just run the ADWs
|
|
./adws/adw_prompt.py "analyze this code"
|
|
|
|
# No .env file needed
|
|
# No API key needed
|
|
# Works immediately
|
|
```
|
|
|
|
### Requirements
|
|
|
|
- Active Claude Max subscription
|
|
- Claude Code CLI installed and logged in
|
|
- User must be authenticated
|
|
|
|
### Advantages
|
|
|
|
✅ **Simple** - No configuration, just works
|
|
✅ **Secure** - No API keys to manage
|
|
✅ **Interactive** - Perfect for development
|
|
✅ **Immediate** - No setup friction
|
|
|
|
### Limitations
|
|
|
|
❌ **User presence required** - Can't run headless
|
|
❌ **Single user** - Tied to your subscription
|
|
❌ **Limited automation** - Not ideal for CI/CD
|
|
❌ **Session-dependent** - Must be logged in
|
|
|
|
### Perfect For
|
|
|
|
- Interactive development
|
|
- Local experimentation
|
|
- Learning ADWs
|
|
- Personal projects
|
|
- Quick prototyping
|
|
|
|
### Example Workflow
|
|
|
|
```bash
|
|
# Morning: Start development
|
|
./adws/adw_chore_implement.py "add user authentication"
|
|
|
|
# Afternoon: Create another feature
|
|
./adws/adw_chore_implement.py "implement password reset"
|
|
|
|
# Evening: Code review
|
|
./adws/adw_prompt.py "review security in auth module"
|
|
|
|
# All executed through your subscription
|
|
# No API key management
|
|
# Just works
|
|
```
|
|
|
|
## Mode B: API-Based Programmatic Execution
|
|
|
|
### What It Is
|
|
|
|
Run Claude Code programmatically using API keys for automated, headless workflows.
|
|
|
|
### How It Works
|
|
|
|
```
|
|
Environment has ANTHROPIC_API_KEY
|
|
↓
|
|
ADW reads API key from environment
|
|
↓
|
|
ADW executes: claude -p "prompt"
|
|
↓
|
|
Claude Code uses API key for auth
|
|
↓
|
|
Prompt executed, results returned
|
|
```
|
|
|
|
API key is passed through filtered environment to subprocess.
|
|
|
|
### Setup
|
|
|
|
**Step 1: Create .env file**
|
|
|
|
```bash
|
|
# Copy template
|
|
cp .env.sample .env
|
|
|
|
# Edit .env
|
|
nano .env
|
|
```
|
|
|
|
**Step 2: Add your API key**
|
|
|
|
```bash
|
|
# .env file
|
|
ANTHROPIC_API_KEY=sk-ant-api03-...
|
|
|
|
# Optional configurations
|
|
CLAUDE_CODE_PATH=claude
|
|
CLAUDE_BASH_MAINTAIN_PROJECT_WORKING_DIR=true
|
|
```
|
|
|
|
**Step 3: Secure the file**
|
|
|
|
```bash
|
|
# Never commit .env
|
|
echo ".env" >> .gitignore
|
|
|
|
# Restrict permissions
|
|
chmod 600 .env
|
|
```
|
|
|
|
### Requirements
|
|
|
|
- Anthropic API key (from console.anthropic.com)
|
|
- API access enabled on account
|
|
- Claude Code CLI installed
|
|
|
|
### Advantages
|
|
|
|
✅ **Headless** - Runs without user interaction
|
|
✅ **Automatable** - Perfect for CI/CD
|
|
✅ **Multi-user** - Not tied to single subscription
|
|
✅ **Scriptable** - Full programmatic control
|
|
✅ **Reliable** - No session dependencies
|
|
|
|
### Limitations
|
|
|
|
❌ **Requires API key** - Additional setup
|
|
❌ **Costs** - API usage charges
|
|
❌ **Key management** - Security consideration
|
|
❌ **Environment config** - Must configure .env
|
|
|
|
### Perfect For
|
|
|
|
- CI/CD pipelines
|
|
- Webhook handlers
|
|
- Scheduled tasks (cron jobs)
|
|
- Server-side automation
|
|
- Team automation workflows
|
|
- Production deployments
|
|
|
|
### Example Workflows
|
|
|
|
#### CI/CD Integration
|
|
|
|
```yaml
|
|
# .github/workflows/ai-review.yml
|
|
name: AI Code Review
|
|
|
|
on: [pull_request]
|
|
|
|
jobs:
|
|
review:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v2
|
|
|
|
- name: Set up environment
|
|
run: |
|
|
echo "ANTHROPIC_API_KEY=${{ secrets.ANTHROPIC_API_KEY }}" > .env
|
|
|
|
- name: Run AI review
|
|
run: |
|
|
./adws/adw_prompt.py "review this PR for security issues"
|
|
```
|
|
|
|
#### Webhook Handler
|
|
|
|
```python
|
|
# webhook_server.py
|
|
from flask import Flask, request
|
|
import subprocess
|
|
|
|
app = Flask(__name__)
|
|
|
|
@app.route('/webhook/feature-request', methods=['POST'])
|
|
def handle_feature_request():
|
|
data = request.json
|
|
description = data['description']
|
|
|
|
# Execute ADW with API key from environment
|
|
subprocess.run([
|
|
'./adws/adw_chore_implement.py',
|
|
description
|
|
])
|
|
|
|
return {'status': 'processing'}
|
|
```
|
|
|
|
#### Cron Job
|
|
|
|
```bash
|
|
# crontab -e
|
|
|
|
# Run daily code quality check at 2 AM
|
|
0 2 * * * cd /path/to/project && ./adws/adw_prompt.py "analyze code quality and suggest improvements" >> /var/log/adw-daily.log 2>&1
|
|
```
|
|
|
|
## Mode Detection
|
|
|
|
The ADW infrastructure automatically detects which mode to use:
|
|
|
|
```python
|
|
# In agent.py
|
|
def get_safe_subprocess_env():
|
|
env = {
|
|
# System variables
|
|
"HOME": os.getenv("HOME"),
|
|
"PATH": os.getenv("PATH"),
|
|
# ...
|
|
}
|
|
|
|
# Only add API key if it exists
|
|
api_key = os.getenv("ANTHROPIC_API_KEY")
|
|
if api_key:
|
|
env["ANTHROPIC_API_KEY"] = api_key
|
|
|
|
# If no API key, Claude Code uses subscription
|
|
return env
|
|
```
|
|
|
|
**Detection logic:**
|
|
1. Check if `ANTHROPIC_API_KEY` exists in environment
|
|
2. If yes → API mode (pass key to subprocess)
|
|
3. If no → Subscription mode (Claude Code uses logged-in session)
|
|
|
|
**No code changes needed** - same scripts work in both modes.
|
|
|
|
## Comparison Matrix
|
|
|
|
| Feature | Subscription Mode | API Mode |
|
|
|---------|------------------|----------|
|
|
| **Setup Complexity** | None | Moderate (API key) |
|
|
| **User Presence** | Required | Not required |
|
|
| **CI/CD Integration** | ❌ Difficult | ✅ Easy |
|
|
| **Cost** | Subscription price | API usage charges |
|
|
| **Security** | No key to manage | Must secure API key |
|
|
| **Automation** | Limited | Full |
|
|
| **Interactive Use** | ✅ Excellent | ✅ Works fine |
|
|
| **Headless Use** | ❌ Not practical | ✅ Perfect |
|
|
| **Multi-user** | Per subscription | Shared key possible |
|
|
| **Session Management** | Must stay logged in | None needed |
|
|
|
|
## Switching Between Modes
|
|
|
|
### Subscription → API
|
|
|
|
```bash
|
|
# Create .env file
|
|
cat > .env << 'EOF'
|
|
ANTHROPIC_API_KEY=sk-ant-...
|
|
EOF
|
|
|
|
# Secure it
|
|
chmod 600 .env
|
|
|
|
# Now all ADW executions use API
|
|
./adws/adw_prompt.py "test"
|
|
```
|
|
|
|
### API → Subscription
|
|
|
|
```bash
|
|
# Remove .env file
|
|
rm .env
|
|
|
|
# Or comment out API key
|
|
# ANTHROPIC_API_KEY=sk-ant-...
|
|
|
|
# Now all ADW executions use subscription
|
|
./adws/adw_prompt.py "test"
|
|
```
|
|
|
|
**Same scripts work in both modes** - just change environment.
|
|
|
|
## Best Practices
|
|
|
|
### For Subscription Mode
|
|
|
|
1. **Stay logged in**
|
|
```bash
|
|
# Check auth status
|
|
claude --version
|
|
```
|
|
|
|
2. **Personal projects**
|
|
- Use for local development
|
|
- No .env file needed
|
|
|
|
3. **Quick iteration**
|
|
- Fast setup
|
|
- Immediate feedback
|
|
|
|
### For API Mode
|
|
|
|
1. **Secure your keys**
|
|
```bash
|
|
# Never commit
|
|
echo ".env" >> .gitignore
|
|
|
|
# Restrict permissions
|
|
chmod 600 .env
|
|
|
|
# Use secrets management in production
|
|
```
|
|
|
|
2. **Rotate regularly**
|
|
```bash
|
|
# Update API key periodically
|
|
# Revoke old keys
|
|
```
|
|
|
|
3. **Monitor usage**
|
|
- Track API consumption
|
|
- Set up billing alerts
|
|
- Monitor costs
|
|
|
|
4. **Use environment-specific keys**
|
|
```bash
|
|
# Development
|
|
ANTHROPIC_API_KEY=sk-ant-dev-...
|
|
|
|
# Production
|
|
ANTHROPIC_API_KEY=sk-ant-prod-...
|
|
```
|
|
|
|
### For Both Modes
|
|
|
|
1. **Document which mode you're using**
|
|
```markdown
|
|
# README.md
|
|
|
|
## Setup
|
|
|
|
This project uses Claude Max subscription mode by default.
|
|
For CI/CD, configure ANTHROPIC_API_KEY in .env.
|
|
```
|
|
|
|
2. **Test in both modes**
|
|
- Ensure portability
|
|
- Validate automation path
|
|
- Document differences
|
|
|
|
3. **Choose based on use case**
|
|
- Interactive development → Subscription
|
|
- Automation/CI/CD → API
|
|
- Both are valid
|
|
|
|
## Troubleshooting
|
|
|
|
### Subscription Mode Issues
|
|
|
|
**Problem**: "Authentication failed"
|
|
```bash
|
|
# Solution: Re-login to Claude Code
|
|
claude login
|
|
```
|
|
|
|
**Problem**: "Command not found: claude"
|
|
```bash
|
|
# Solution: Install Claude Code CLI
|
|
# [Installation instructions]
|
|
```
|
|
|
|
**Problem**: "Session expired"
|
|
```bash
|
|
# Solution: Re-authenticate
|
|
claude logout
|
|
claude login
|
|
```
|
|
|
|
### API Mode Issues
|
|
|
|
**Problem**: "Invalid API key"
|
|
```bash
|
|
# Solution: Check .env file
|
|
cat .env | grep ANTHROPIC_API_KEY
|
|
|
|
# Verify key format: sk-ant-api03-...
|
|
# Get new key from console.anthropic.com
|
|
```
|
|
|
|
**Problem**: "API key not found"
|
|
```bash
|
|
# Solution: Ensure .env is loaded
|
|
# Check file location
|
|
ls -la .env
|
|
|
|
# Verify environment
|
|
echo $ANTHROPIC_API_KEY
|
|
```
|
|
|
|
**Problem**: "Rate limit exceeded"
|
|
```bash
|
|
# Solution: Implement backoff or use subscription mode
|
|
# Reduce parallel executions
|
|
# Contact Anthropic for higher limits
|
|
```
|
|
|
|
## Security Considerations
|
|
|
|
### Subscription Mode
|
|
|
|
✅ **Secure by default** - No secrets to manage
|
|
✅ **Session-based** - Expires automatically
|
|
✅ **User-specific** - Can't be shared accidentally
|
|
|
|
⚠️ **Physical access** - Anyone with terminal access can use
|
|
⚠️ **Session hijacking** - Theoretical risk in shared environments
|
|
|
|
### API Mode
|
|
|
|
✅ **Revocable** - Can disable keys anytime
|
|
✅ **Trackable** - Monitor usage per key
|
|
✅ **Rotatable** - Easy to update
|
|
|
|
⚠️ **Key exposure** - Must protect .env file
|
|
⚠️ **Commit risk** - Can accidentally commit
|
|
⚠️ **Scope risk** - Key has broad permissions
|
|
|
|
### Protection Strategies
|
|
|
|
1. **For .env files**
|
|
```bash
|
|
# Always in .gitignore
|
|
echo ".env" >> .gitignore
|
|
|
|
# Restrict permissions
|
|
chmod 600 .env
|
|
|
|
# Use git secrets scanning
|
|
git secrets --scan
|
|
```
|
|
|
|
2. **For production**
|
|
```bash
|
|
# Use secrets managers
|
|
- AWS Secrets Manager
|
|
- HashiCorp Vault
|
|
- GitHub Secrets
|
|
|
|
# Not .env files in production
|
|
```
|
|
|
|
3. **For CI/CD**
|
|
```yaml
|
|
# Use repository secrets
|
|
secrets:
|
|
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
|
|
|
|
# Never hardcode
|
|
# Never commit
|
|
```
|
|
|
|
## Recommendation
|
|
|
|
**Start with Subscription Mode**
|
|
- Simpler setup
|
|
- Perfect for learning
|
|
- Great for development
|
|
- Zero configuration
|
|
|
|
**Migrate to API Mode when needed**
|
|
- Adding CI/CD
|
|
- Implementing webhooks
|
|
- Scheduling tasks
|
|
- Production deployment
|
|
|
|
**Keep both available**
|
|
- Developers use subscription
|
|
- Automation uses API
|
|
- Best of both worlds
|
|
|
|
Same ADW infrastructure supports both - choose based on context.
|