@gtheys/pi-per-commit-spend
Pi extension that tracks AI spend per git commit across sessions
Package details
Install @gtheys/pi-per-commit-spend from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:@gtheys/pi-per-commit-spend- Package
@gtheys/pi-per-commit-spend- Version
0.2.5- Published
- May 5, 2026
- Downloads
- 304/mo · 304/wk
- Author
- gtheys
- License
- MIT
- Types
- extension
- Size
- 22 KB
- Dependencies
- 0 dependencies · 2 peers
Pi manifest JSON
{
"extensions": [
"./index.ts"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
pi-per-commit-spend
A pi extension that tracks AI spend per git commit across sessions.
Every time you commit in a repo, the extension records the total AI cost accumulated since the previous commit. Spend from multiple sessions is merged — if you work across three sessions before committing, all three sessions' costs roll into that commit's entry.
Works with subscription providers
When using subscription services (GitHub Copilot, Claude Max, etc.) the API returns cost = 0. This extension automatically:
- Fetches pricing data from models.dev (4,000+ models)
- Looks up the current model's real pricing across all providers
- Calculates cost from token counts when the API reports zero
Calculated costs are tagged with (calc) in the /spend view.
How subscription cost calculation works
Subscription providers (like GitHub Copilot) don't expose per-request pricing — the API reports cost.total = 0 because you pay a flat monthly fee. This extension fills that gap:
- On session start, it fetches models.dev/api.json — a community-maintained database with pricing for 4,000+ models across 80+ providers
- On
model_select, it tracks which model is currently active (e.g.claude-sonnet-4,gpt-5.1) - On each assistant message, if
cost.total = 0:- It searches models.dev for the model ID across all providers (not just the subscription one)
- It skips providers that report zero cost (other subscriptions)
- It picks the first provider with real per-token pricing
- It calculates:
(input × input_price + output × output_price + cache_read × cache_read_price + cache_write × cache_write_price) / 1,000,000
- Example: You're using
claude-sonnet-4via GitHub Copilot. The Copilot provider reportscost: { input: 0, output: 0 }. But the same model exists under theanthropicprovider withcost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 }(per 1M tokens). The extension uses the Anthropic pricing to calculate your cost.
Note: The calculated cost is an estimate — it reflects what you would have paid per-token, not your actual subscription cost. This is useful for comparing productivity across projects and understanding relative spend per commit.
The pricing cache is refreshed every 24 hours. Use /spend-refresh to force an update.
Install
pi install npm:@gtheys/pi-per-commit-spend
Or install from git:
pi install git:github.com/gtheys/pi-per-commit-spend
Commands
| Command | Description |
|---|---|
/spend |
Interactive spend breakdown per commit (Space to expand, Esc/q to close) |
/spend-reset |
Clear all recorded spend data for the current repo |
/spend-refresh |
Force-refresh models.dev pricing cache |
How it works
- Fetches pricing — On session start, loads models.dev pricing data (cached 24h locally)
- Tracks model — Listens to
model_selectto know which model is active - Accumulates — Every assistant message's usage is summed. If
cost.total > 0, uses API cost. If= 0, calculates from tokens × models.dev pricing - Records on commit — When
git commitsucceeds, the accumulated spend is saved to disk - Persists across sessions — Uncommitted spend is saved as "pending" on shutdown, then reloaded into the accumulator on the next session
Event flow
session_start → load pending entries, fetch models.dev pricing
↓
model_select → track current model ID
↓
message_end → accumulate cost (API cost or calculated from tokens)
↓
tool_result (git commit) → flush accumulator to DB, reset
↓
session_shutdown → save remaining accumulator as "pending" entry
Cost calculation
For subscription providers (cost.total = 0):
model = current model ID (e.g. "claude-sonnet-4")
pricing = lookup across all models.dev providers
cost = (input_tokens × input_price
+ output_tokens × output_price
+ cache_read_tokens × cache_read_price
+ cache_write_tokens × cache_write_price) / 1,000,000
Storage
Data lives in ~/.pi/agent/data/:
| File | Purpose |
|---|---|
per-commit-spend.json |
Spend entries keyed by repo path |
per-commit-spend-models.json |
Cached models.dev pricing (refreshed every 24h) |
Entry format:
{
"commitHash": "abc1234",
"commitMessage": "feat: add login page",
"cost": 0.0423,
"calculatedCost": true,
"inputTokens": 15000,
"outputTokens": 3000,
"cacheReadTokens": 24000,
"cacheWriteTokens": 5000,
"timestamp": 1709600000000,
"pending": false
}
Development
The extension is a single TypeScript file at index.ts. Pi loads .ts files directly — no build step needed.
npm pack --dry-run # preview tarball contents
License
MIT