penpal
Async Claude via the Batch API. Half the cost, easier bulk/repeat processing, and no rush 😎
Penpal is a CLI for sending prompts to Claude through Anthropic's Batch API, which processes requests asynchronously at 50% off. Submit a prompt (or a thousand!), go do something else, then come back and call the output exactly when you need it.
Install
pipx install penpal-cli
Or with pip:
pip install penpal-cli
Requires Python 3.11+.
Why Penpal?
| Use Case | Why Penpal | Example |
|---|---|---|
| Bulk analysis | 50% cheaper, ideal for processing 100s of files | Summarize 500 research papers, review 50 PRs |
| AI coding agents | CLI integrates with Claude Code, Cursor, VS Code, et al. | Let your IDE run expensive queries in the background |
| Evaluations | Process thousands of test cases at batch pricing | Run LLM evaluation suites on a budget |
| Scheduled workflows | Fire off a prompt and check results tomorrow | Generate daily reports, batch content creation, batch moderation |
| Spend smarter! | Deploy your money & tokens more strategically | Get big docs and big answers a little later, for half the price |
Quick start
# 1. Store your API key (one-time setup)
penpal auth
# 2. Submit a prompt
penpal ask "Explain the CAP theorem in plain English"
# 3a. Check if it's done once...
penpal status
# 3b. Or, keep tabs with the Terminal program
penpal session
# 4. Read the response
penpal read --latest
Batch requests typically complete in minutes—sometimes under 10 seconds for small requests. Use penpal status --watch to auto-refresh.
What works (and what doesn't)
The Batch API supports all Messages API features except streaming. Here's what that means:
| Feature | Status | Notes |
|---|---|---|
| Vision (images, screenshots) | ✅ Works | Analyze images at batch pricing |
| File attachments (PDFs, code) | ✅ Works | Pass files directly to Claude |
| Tool use & function calling | ✅ Works | Build agentic workflows on a budget |
| System prompts & skills | ✅ Works | Full control with reusable system prompts |
| Max tokens / temperature | ✅ Works | All inference parameters supported |
| Streaming responses | ❌ No | Responses are complete when retrieved |
| MCP (Model Context Protocol) | ❌ No | Requires real-time bidirectional interaction |
| Real-time chat | ❌ No | Async-only — no live conversations |
In short: Use Penpal for any task that doesn't need immediate answers. Perfect for bulk analysis, evaluations, content generation, and code review.
Works with AI coding assistants
Since Penpal is CLI-powered, your favorite coding assistant can cheaply send expensive queries into the background. Imagine:
- 📝 Async Claude in your IDE: Let a cheaper model ask Opus a tough question for half the price, then pull the answer back into context when ready.
- 🎯 Batch processing in automation: Submit 500 summaries at once, retrieve them as needed without bloating your context window.
- ⚡ Scheduled workflows: Run expensive evaluations or code reviews overnight at batch pricing.
No streaming delays, no token-counting anxiety — just submit and move on.
Claude Code
Teach Claude Code about Penpal so it can use cheaper batch requests:
penpal setup-claude-code
This appends a small instruction block to ~/.claude/CLAUDE.md, which works globally. Remove it with penpal uninstall-claude-code.
AGENTS.md (cross-agent standard)
For projects using other AI coding agents (Copilot, Cursor, OpenCode, Codex, etc.), add Penpal instructions to the AGENTS.md standard:
penpal setup-agents-md
This writes to ./AGENTS.md in the current directory. Remove it with penpal uninstall-agents-md.
Batch mode
A batch can contain multiple requests. Process an entire directory of files in a single batch:
penpal ask -b ./documents/ "Summarize this document"
Each file becomes a separate request. Use penpal read <id> -i <N> to read individual results.
Skills (reusable system prompts)
Create and reuse system prompts as named skills:
penpal skills add code-review # Opens $EDITOR
penpal ask --skill code-review -f app.py "Review this"
penpal skills # List all skills
You can also add skills manually to ~/.config/penpal/skills.
File attachments
Attach images, PDFs, and text files directly:
penpal ask -f screenshot.png "What's in this image?"
penpal ask -f paper.pdf "Summarize this paper"
penpal ask -f main.py -f utils.py "Review these files"
Code extraction
Extract fenced code blocks from responses directly to files:
penpal read --latest --extract
Raw output for piping
--raw strips all formatting, ideal for piping into other tools or feeding back to an AI coding agent:
penpal read --latest --raw | pbcopy
penpal read --latest --raw > response.md
TUI dashboard
Launch an interactive terminal dashboard with live status updates, cost tracking, manual request creation, and more:
penpal session
History and cost tracking
penpal history # Browse past requests
penpal history --cost # See spending summary
penpal history --since 7d # Filter by time
penpal history --search "CAP" # Search prompts
Model aliases
Use short names instead of full model identifiers:
| Alias | Model |
|---|---|
haiku |
claude-haiku-4-5-20251001 |
sonnet |
claude-sonnet-4-20250514 |
opus |
claude-opus-4-20250514 |
penpal ask -m haiku "What was Pangaea?"
Configuration
Penpal uses XDG directories. Config file location:
penpal config --path # ~/.config/penpal/config.toml
penpal config --edit # Open in $EDITOR
penpal config # Show resolved settings
Example config.toml:
model = "sonnet"
max_tokens = 8192
poll_interval = 180
preview_lines = 40
Environment variables
| Variable | Description |
|---|---|
ANTHROPIC_API_KEY |
API key (overrides stored key) |
PENPAL_MODEL |
Default model |
PENPAL_MAX_TOKENS |
Default max output tokens |
PENPAL_POLL_INTERVAL |
Status polling interval (seconds) |
License
MIT
Metadata
Release files for penpal-cli 0.1.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| penpal_cli-0.1.3.tar.gz | 35.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| penpal_cli-0.1.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 70.0 kB
Release files / penpal_cli-0.1.3.tar.gz
| Download URL | penpal_cli-0.1.3.tar.gz |
|---|---|
| Size | 35.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f64cee0634ae9d1ee5e422d346808329d4ff0d34d81fcd62a22419ab0180c844
|
|
BLAKE2b-256 checksum How to use checksums |
0d8b59eca56fa9697e5f80c285eefc26fadd62df94d6b348547f165add59951e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.3
|
Release files / penpal_cli-0.1.3-py3-none-any.whl
| Download URL | penpal_cli-0.1.3-py3-none-any.whl |
|---|---|
| Size | 34.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
daa1b7147304bbf2531d2500c59c258f6a93102908af8f8bd39b3dc28245a223
|
|
BLAKE2b-256 checksum How to use checksums |
df81c3c26ddccf165bc2ee2fb6a4e19757d94332848226f4837e62d97821e30e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.3
|