claude-accountant 1.0.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -6
- package/dist/admin-api.d.ts +2 -2
- package/dist/admin-api.d.ts.map +1 -1
- package/dist/admin-api.js +39 -22
- package/dist/admin-api.js.map +1 -1
- package/dist/budget.d.ts +1 -1
- package/dist/budget.d.ts.map +1 -1
- package/dist/budget.js +30 -5
- package/dist/budget.js.map +1 -1
- package/dist/db.d.ts +1 -0
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +41 -0
- package/dist/db.js.map +1 -1
- package/dist/hook-estimator.d.ts +11 -0
- package/dist/hook-estimator.d.ts.map +1 -0
- package/dist/hook-estimator.js +25 -0
- package/dist/hook-estimator.js.map +1 -0
- package/dist/resources/budget-status.d.ts +2 -2
- package/dist/resources/budget-status.d.ts.map +1 -1
- package/dist/resources/budget-status.js +2 -2
- package/dist/resources/budget-status.js.map +1 -1
- package/dist/server.js +3 -3
- package/dist/server.js.map +1 -1
- package/dist/tools/check-budget.d.ts +2 -2
- package/dist/tools/check-budget.d.ts.map +1 -1
- package/dist/tools/check-budget.js +15 -2
- package/dist/tools/check-budget.js.map +1 -1
- package/dist/tools/estimate-task-cost.d.ts +2 -2
- package/dist/tools/get-recommendations.d.ts +2 -2
- package/dist/tools/get-recommendations.d.ts.map +1 -1
- package/dist/tools/get-recommendations.js +2 -2
- package/dist/tools/get-recommendations.js.map +1 -1
- package/dist/tools/get-usage-history.d.ts.map +1 -1
- package/dist/tools/get-usage-history.js +3 -1
- package/dist/tools/get-usage-history.js.map +1 -1
- package/dist/tools/log-usage.d.ts +1 -1
- package/dist/types.d.ts +17 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
- package/scripts/post-tool-hook.sh +3 -1
- package/skills/usage-awareness/SKILL.md +7 -2
package/README.md
CHANGED
|
@@ -50,8 +50,8 @@ Then add to `~/.claude.json`:
|
|
|
50
50
|
### Option 3: From source
|
|
51
51
|
|
|
52
52
|
```bash
|
|
53
|
-
git clone
|
|
54
|
-
cd
|
|
53
|
+
git clone https://github.com/grantlouisherman/claude-accountant.git
|
|
54
|
+
cd claude-accountant
|
|
55
55
|
npm install && npm run build
|
|
56
56
|
```
|
|
57
57
|
|
|
@@ -104,18 +104,58 @@ You can edit this file directly or use the `configure_budget` tool during a sess
|
|
|
104
104
|
|
|
105
105
|
### Optional: Anthropic Admin API
|
|
106
106
|
|
|
107
|
-
For
|
|
107
|
+
For real usage data instead of estimates, add your Admin API key to the config. This calls the [`/v1/organizations/usage_report/messages`](https://platform.claude.com/docs/en/api/admin/usage_report/retrieve_messages) endpoint to fetch actual spend from Anthropic.
|
|
108
|
+
|
|
109
|
+
**Setup:**
|
|
110
|
+
|
|
111
|
+
1. Go to the [Anthropic Console](https://console.anthropic.com) and create an **Admin API key** (under your organization's admin settings). This is different from a regular API key.
|
|
112
|
+
2. Add the `admin_api` block to `~/.config/usage-plugin/config.json`:
|
|
108
113
|
|
|
109
114
|
```json
|
|
110
115
|
{
|
|
116
|
+
"budget": {
|
|
117
|
+
"daily_limit_usd": 10.00,
|
|
118
|
+
"monthly_limit_usd": null,
|
|
119
|
+
"warning_threshold_pct": 80,
|
|
120
|
+
"critical_threshold_pct": 95
|
|
121
|
+
},
|
|
122
|
+
"pricing_tier": "standard",
|
|
123
|
+
"default_model": "claude-sonnet-4-5-20250514",
|
|
124
|
+
"data_dir": "~/.config/usage-plugin/data",
|
|
111
125
|
"admin_api": {
|
|
112
126
|
"api_key": "sk-ant-admin-...",
|
|
113
|
-
"organization_id": "org-...",
|
|
114
127
|
"sync_interval_minutes": 5
|
|
115
128
|
}
|
|
116
129
|
}
|
|
117
130
|
```
|
|
118
131
|
|
|
132
|
+
When configured, `check_budget` will show both local estimates and real API-reported spend:
|
|
133
|
+
|
|
134
|
+
```
|
|
135
|
+
Budget Status: WARNING
|
|
136
|
+
Daily Limit: $10.00
|
|
137
|
+
Spent Today: $7.5000
|
|
138
|
+
Remaining: $1.8200
|
|
139
|
+
Used: 75.0%
|
|
140
|
+
Requests Today: 42
|
|
141
|
+
|
|
142
|
+
API Reported Spend: $8.1800
|
|
143
|
+
API Usage: 81.8% of daily limit
|
|
144
|
+
Source: Anthropic Admin API
|
|
145
|
+
|
|
146
|
+
Breakdown by model:
|
|
147
|
+
claude-opus-4-5-20251101: $6.2300 (15000 in / 3200 out)
|
|
148
|
+
claude-sonnet-4-5-20250514: $1.9500 (45000 in / 8000 out)
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
The budget status uses the **higher** of local estimates and API-reported spend, so you always get the more conservative view.
|
|
152
|
+
|
|
153
|
+
### Auto-logging via hooks
|
|
154
|
+
|
|
155
|
+
The plugin ships with a PostToolUse hook that automatically logs every tool invocation. Each tool type has a rough token estimate (e.g., Read ~2000 input tokens, Edit ~3000 input tokens), so your budget tracks usage without any manual logging needed.
|
|
156
|
+
|
|
157
|
+
Hook events are written to `~/.config/usage-plugin/data/hook_events.jsonl` and ingested into SQLite automatically when you call `check_budget` or `get_usage_history`.
|
|
158
|
+
|
|
119
159
|
## How it works
|
|
120
160
|
|
|
121
161
|
The plugin uses an estimation-based approach since MCP tools can't introspect Claude's actual token usage mid-conversation:
|
|
@@ -123,9 +163,10 @@ The plugin uses an estimation-based approach since MCP tools can't introspect Cl
|
|
|
123
163
|
1. **Complexity tiers** (trivial/simple/moderate/complex/massive) map to token ranges
|
|
124
164
|
2. **Per-file multipliers** account for reads (~1500 input tokens) and edits (~3000 output tokens)
|
|
125
165
|
3. **Extended thinking** multiplies output estimates by 3x
|
|
126
|
-
4.
|
|
166
|
+
4. **Auto-logging hooks** track every tool call with per-tool-type token estimates
|
|
167
|
+
5. All data is stored locally in SQLite with WAL mode for fast concurrent access
|
|
127
168
|
|
|
128
|
-
When the Admin API is configured, real usage data
|
|
169
|
+
When the Admin API is configured, real usage data is shown alongside local estimates, and the higher value drives budget status decisions.
|
|
129
170
|
|
|
130
171
|
## Budget thresholds
|
|
131
172
|
|
package/dist/admin-api.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type { Config } from "./types.js";
|
|
2
|
-
export declare function
|
|
1
|
+
import type { ApiUsageSummary, Config } from "./types.js";
|
|
2
|
+
export declare function fetchApiUsage(config: Config): Promise<ApiUsageSummary>;
|
|
3
3
|
//# sourceMappingURL=admin-api.d.ts.map
|
package/dist/admin-api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-api.d.ts","sourceRoot":"","sources":["../src/admin-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"admin-api.d.ts","sourceRoot":"","sources":["../src/admin-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,eAAe,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAiC3E,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,eAAe,CAAC,CA6E1B"}
|
package/dist/admin-api.js
CHANGED
|
@@ -1,12 +1,19 @@
|
|
|
1
|
-
import { logUsage } from "./db.js";
|
|
2
1
|
import { calculateCost } from "./pricing.js";
|
|
3
|
-
export async function
|
|
2
|
+
export async function fetchApiUsage(config) {
|
|
4
3
|
if (!config.admin_api) {
|
|
5
4
|
throw new Error("Admin API not configured");
|
|
6
5
|
}
|
|
7
|
-
const { api_key
|
|
8
|
-
|
|
9
|
-
const
|
|
6
|
+
const { api_key } = config.admin_api;
|
|
7
|
+
// Start of today in UTC (RFC 3339)
|
|
8
|
+
const now = new Date();
|
|
9
|
+
const startOfDay = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()));
|
|
10
|
+
const startingAt = startOfDay.toISOString();
|
|
11
|
+
const params = new URLSearchParams({
|
|
12
|
+
starting_at: startingAt,
|
|
13
|
+
bucket_width: "1d",
|
|
14
|
+
"group_by[]": "model",
|
|
15
|
+
});
|
|
16
|
+
const url = `https://api.anthropic.com/v1/organizations/usage_report/messages?${params}`;
|
|
10
17
|
const response = await fetch(url, {
|
|
11
18
|
headers: {
|
|
12
19
|
"x-api-key": api_key,
|
|
@@ -17,23 +24,33 @@ export async function syncFromAdminApi(config) {
|
|
|
17
24
|
throw new Error(`Admin API error: ${response.status} ${response.statusText}`);
|
|
18
25
|
}
|
|
19
26
|
const data = (await response.json());
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
27
|
+
const byModel = [];
|
|
28
|
+
let totalCost = 0;
|
|
29
|
+
let totalInput = 0;
|
|
30
|
+
let totalOutput = 0;
|
|
31
|
+
for (const bucket of data.data) {
|
|
32
|
+
for (const result of bucket.results) {
|
|
33
|
+
const cacheWriteTokens = (result.cache_creation?.ephemeral_5m_input_tokens ?? 0) +
|
|
34
|
+
(result.cache_creation?.ephemeral_1h_input_tokens ?? 0);
|
|
35
|
+
const cost = calculateCost(result.model, result.uncached_input_tokens, result.output_tokens, result.cache_read_input_tokens, cacheWriteTokens);
|
|
36
|
+
byModel.push({
|
|
37
|
+
model: result.model,
|
|
38
|
+
input_tokens: result.uncached_input_tokens,
|
|
39
|
+
output_tokens: result.output_tokens,
|
|
40
|
+
cache_read_tokens: result.cache_read_input_tokens,
|
|
41
|
+
cache_write_tokens: cacheWriteTokens,
|
|
42
|
+
cost_usd: cost,
|
|
43
|
+
});
|
|
44
|
+
totalCost += cost;
|
|
45
|
+
totalInput += result.uncached_input_tokens;
|
|
46
|
+
totalOutput += result.output_tokens;
|
|
47
|
+
}
|
|
36
48
|
}
|
|
37
|
-
return
|
|
49
|
+
return {
|
|
50
|
+
total_cost_usd: totalCost,
|
|
51
|
+
total_input_tokens: totalInput,
|
|
52
|
+
total_output_tokens: totalOutput,
|
|
53
|
+
by_model: byModel,
|
|
54
|
+
};
|
|
38
55
|
}
|
|
39
56
|
//# sourceMappingURL=admin-api.js.map
|
package/dist/admin-api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-api.js","sourceRoot":"","sources":["../src/admin-api.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"admin-api.js","sourceRoot":"","sources":["../src/admin-api.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAgC7C,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAc;IAEd,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC;IAErC,mCAAmC;IACnC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,UAAU,GAAG,IAAI,IAAI,CACzB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE,GAAG,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CACpE,CAAC;IACF,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;IAE5C,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QACjC,WAAW,EAAE,UAAU;QACvB,YAAY,EAAE,IAAI;QAClB,YAAY,EAAE,OAAO;KACtB,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,oEAAoE,MAAM,EAAE,CAAC;IAEzF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,OAAO,EAAE;YACP,WAAW,EAAE,OAAO;YACpB,mBAAmB,EAAE,YAAY;SAClC;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,oBAAoB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAC7D,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAwB,CAAC;IAE5D,MAAM,OAAO,GAAsB,EAAE,CAAC;IACtC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACpC,MAAM,gBAAgB,GACpB,CAAC,MAAM,CAAC,cAAc,EAAE,yBAAyB,IAAI,CAAC,CAAC;gBACvD,CAAC,MAAM,CAAC,cAAc,EAAE,yBAAyB,IAAI,CAAC,CAAC,CAAC;YAE1D,MAAM,IAAI,GAAG,aAAa,CACxB,MAAM,CAAC,KAAK,EACZ,MAAM,CAAC,qBAAqB,EAC5B,MAAM,CAAC,aAAa,EACpB,MAAM,CAAC,uBAAuB,EAC9B,gBAAgB,CACjB,CAAC;YAEF,OAAO,CAAC,IAAI,CAAC;gBACX,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,YAAY,EAAE,MAAM,CAAC,qBAAqB;gBAC1C,aAAa,EAAE,MAAM,CAAC,aAAa;gBACnC,iBAAiB,EAAE,MAAM,CAAC,uBAAuB;gBACjD,kBAAkB,EAAE,gBAAgB;gBACpC,QAAQ,EAAE,IAAI;aACf,CAAC,CAAC;YAEH,SAAS,IAAI,IAAI,CAAC;YAClB,UAAU,IAAI,MAAM,CAAC,qBAAqB,CAAC;YAC3C,WAAW,IAAI,MAAM,CAAC,aAAa,CAAC;QACtC,CAAC;IACH,CAAC;IAED,OAAO;QACL,cAAc,EAAE,SAAS;QACzB,kBAAkB,EAAE,UAAU;QAC9B,mBAAmB,EAAE,WAAW;QAChC,QAAQ,EAAE,OAAO;KAClB,CAAC;AACJ,CAAC"}
|
package/dist/budget.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { BudgetSnapshot, BudgetStatus, Config } from "./types.js";
|
|
2
|
-
export declare function getBudgetStatus(config: Config): BudgetSnapshot
|
|
2
|
+
export declare function getBudgetStatus(config: Config): Promise<BudgetSnapshot>;
|
|
3
3
|
export declare function computeStatus(pctUsed: number, warningPct: number, criticalPct: number): BudgetStatus;
|
|
4
4
|
//# sourceMappingURL=budget.d.ts.map
|
package/dist/budget.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"budget.d.ts","sourceRoot":"","sources":["../src/budget.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"budget.d.ts","sourceRoot":"","sources":["../src/budget.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAIvE,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CA6D7E;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,YAAY,CAKd"}
|
package/dist/budget.js
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
|
-
import { getTodayUsage, getMonthUsage } from "./db.js";
|
|
2
|
-
|
|
1
|
+
import { getTodayUsage, getMonthUsage, ingestHookEvents } from "./db.js";
|
|
2
|
+
import { fetchApiUsage } from "./admin-api.js";
|
|
3
|
+
export async function getBudgetStatus(config) {
|
|
4
|
+
// Ingest any pending hook events before calculating budget
|
|
5
|
+
ingestHookEvents(config);
|
|
3
6
|
const today = getTodayUsage(config);
|
|
4
7
|
const dailyLimit = config.budget.daily_limit_usd;
|
|
5
8
|
const spentToday = today.total_cost_usd;
|
|
6
9
|
const remaining = Math.max(0, dailyLimit - spentToday);
|
|
7
10
|
const pctUsed = dailyLimit > 0 ? (spentToday / dailyLimit) * 100 : 0;
|
|
8
|
-
const status = computeStatus(pctUsed, config.budget.warning_threshold_pct, config.budget.critical_threshold_pct);
|
|
9
11
|
const monthlyLimit = config.budget.monthly_limit_usd;
|
|
10
12
|
const spentThisMonth = monthlyLimit !== null ? getMonthUsage(config) : null;
|
|
11
|
-
|
|
12
|
-
status,
|
|
13
|
+
const snapshot = {
|
|
14
|
+
status: "ok",
|
|
13
15
|
daily_limit_usd: dailyLimit,
|
|
14
16
|
spent_today_usd: Math.round(spentToday * 10000) / 10000,
|
|
15
17
|
remaining_usd: Math.round(remaining * 10000) / 10000,
|
|
@@ -20,6 +22,29 @@ export function getBudgetStatus(config) {
|
|
|
20
22
|
? Math.round(spentThisMonth * 10000) / 10000
|
|
21
23
|
: null,
|
|
22
24
|
};
|
|
25
|
+
// Try to fetch real API usage if configured
|
|
26
|
+
let effectivePctUsed = pctUsed;
|
|
27
|
+
if (config.admin_api) {
|
|
28
|
+
try {
|
|
29
|
+
const apiUsage = await fetchApiUsage(config);
|
|
30
|
+
const apiPctUsed = dailyLimit > 0 ? (apiUsage.total_cost_usd / dailyLimit) * 100 : 0;
|
|
31
|
+
snapshot.api_usage = apiUsage;
|
|
32
|
+
snapshot.api_spent_today_usd =
|
|
33
|
+
Math.round(apiUsage.total_cost_usd * 10000) / 10000;
|
|
34
|
+
snapshot.api_pct_used = Math.round(apiPctUsed * 100) / 100;
|
|
35
|
+
// Use the higher of local estimate or API-reported spend
|
|
36
|
+
effectivePctUsed = Math.max(pctUsed, apiPctUsed);
|
|
37
|
+
// Update remaining based on API data if it's higher
|
|
38
|
+
if (apiUsage.total_cost_usd > spentToday) {
|
|
39
|
+
snapshot.remaining_usd = Math.round(Math.max(0, dailyLimit - apiUsage.total_cost_usd) * 10000) / 10000;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// API fetch failed — fall back to local estimates silently
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
snapshot.status = computeStatus(effectivePctUsed, config.budget.warning_threshold_pct, config.budget.critical_threshold_pct);
|
|
47
|
+
return snapshot;
|
|
23
48
|
}
|
|
24
49
|
export function computeStatus(pctUsed, warningPct, criticalPct) {
|
|
25
50
|
if (pctUsed >= 100)
|
package/dist/budget.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"budget.js","sourceRoot":"","sources":["../src/budget.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"budget.js","sourceRoot":"","sources":["../src/budget.ts"],"names":[],"mappings":"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"}
|
package/dist/db.d.ts
CHANGED
|
@@ -6,5 +6,6 @@ export declare function logUsage(config: Config, entry: UsageLogEntry): void;
|
|
|
6
6
|
export declare function getTodayUsage(config: Config): DailySummary;
|
|
7
7
|
export declare function getUsageHistory(config: Config, days: number): DailySummary[];
|
|
8
8
|
export declare function getMonthUsage(config: Config): number;
|
|
9
|
+
export declare function ingestHookEvents(config: Config): number;
|
|
9
10
|
export declare function closeDb(): void;
|
|
10
11
|
//# sourceMappingURL=db.d.ts.map
|
package/dist/db.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAGtC,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAMzC,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CASvD;AAiCD,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI,CAsBnE;AA6BD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAkB1D;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,YAAY,EAAE,CAWhB;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAYpD;AAQD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA4CvD;AAED,wBAAgB,OAAO,IAAI,IAAI,CAK9B"}
|
package/dist/db.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import Database from "better-sqlite3";
|
|
2
2
|
import path from "node:path";
|
|
3
|
+
import fs from "node:fs";
|
|
3
4
|
import { resolveDataDir } from "./config.js";
|
|
5
|
+
import { estimateToolTokens } from "./hook-estimator.js";
|
|
6
|
+
import { calculateCost } from "./pricing.js";
|
|
4
7
|
let db = null;
|
|
5
8
|
export function getDb(config) {
|
|
6
9
|
if (db)
|
|
@@ -102,6 +105,44 @@ export function getMonthUsage(config) {
|
|
|
102
105
|
.get(monthStart);
|
|
103
106
|
return row.total;
|
|
104
107
|
}
|
|
108
|
+
export function ingestHookEvents(config) {
|
|
109
|
+
const dataDir = resolveDataDir(config);
|
|
110
|
+
const hookFile = path.join(dataDir, "hook_events.jsonl");
|
|
111
|
+
if (!fs.existsSync(hookFile))
|
|
112
|
+
return 0;
|
|
113
|
+
const content = fs.readFileSync(hookFile, "utf-8").trim();
|
|
114
|
+
if (!content)
|
|
115
|
+
return 0;
|
|
116
|
+
const lines = content.split("\n");
|
|
117
|
+
let ingested = 0;
|
|
118
|
+
for (const line of lines) {
|
|
119
|
+
try {
|
|
120
|
+
const event = JSON.parse(line);
|
|
121
|
+
const estimate = estimateToolTokens(event.tool);
|
|
122
|
+
const model = config.default_model;
|
|
123
|
+
const cost = calculateCost(model, estimate.input_tokens, estimate.output_tokens);
|
|
124
|
+
logUsage(config, {
|
|
125
|
+
timestamp: event.timestamp,
|
|
126
|
+
session_id: event.session_id,
|
|
127
|
+
model,
|
|
128
|
+
input_tokens: estimate.input_tokens,
|
|
129
|
+
output_tokens: estimate.output_tokens,
|
|
130
|
+
cache_read_tokens: 0,
|
|
131
|
+
cache_write_tokens: 0,
|
|
132
|
+
estimated_cost_usd: cost,
|
|
133
|
+
task_description: `Auto-logged: ${event.tool} tool use`,
|
|
134
|
+
source: "hook",
|
|
135
|
+
});
|
|
136
|
+
ingested++;
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
// Skip malformed lines
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Truncate the file after ingesting
|
|
143
|
+
fs.writeFileSync(hookFile, "");
|
|
144
|
+
return ingested;
|
|
145
|
+
}
|
|
105
146
|
export function closeDb() {
|
|
106
147
|
if (db) {
|
|
107
148
|
db.close();
|
package/dist/db.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rough token estimates per tool invocation for auto-logging via hooks.
|
|
3
|
+
* These are heuristics — the goal is ballpark tracking without manual input.
|
|
4
|
+
*/
|
|
5
|
+
interface ToolEstimate {
|
|
6
|
+
input_tokens: number;
|
|
7
|
+
output_tokens: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function estimateToolTokens(toolName: string): ToolEstimate;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=hook-estimator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-estimator.d.ts","sourceRoot":"","sources":["../src/hook-estimator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,UAAU,YAAY;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAqBD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAEjE"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rough token estimates per tool invocation for auto-logging via hooks.
|
|
3
|
+
* These are heuristics — the goal is ballpark tracking without manual input.
|
|
4
|
+
*/
|
|
5
|
+
const TOOL_ESTIMATES = {
|
|
6
|
+
Read: { input_tokens: 2000, output_tokens: 500 },
|
|
7
|
+
Write: { input_tokens: 3000, output_tokens: 200 },
|
|
8
|
+
Edit: { input_tokens: 3000, output_tokens: 1000 },
|
|
9
|
+
Bash: { input_tokens: 1500, output_tokens: 800 },
|
|
10
|
+
Grep: { input_tokens: 1000, output_tokens: 500 },
|
|
11
|
+
Glob: { input_tokens: 800, output_tokens: 400 },
|
|
12
|
+
WebFetch: { input_tokens: 2000, output_tokens: 1500 },
|
|
13
|
+
WebSearch: { input_tokens: 1500, output_tokens: 1000 },
|
|
14
|
+
Task: { input_tokens: 5000, output_tokens: 3000 },
|
|
15
|
+
NotebookEdit: { input_tokens: 2500, output_tokens: 800 },
|
|
16
|
+
AskUserQuestion: { input_tokens: 500, output_tokens: 200 },
|
|
17
|
+
};
|
|
18
|
+
const DEFAULT_ESTIMATE = {
|
|
19
|
+
input_tokens: 1500,
|
|
20
|
+
output_tokens: 600,
|
|
21
|
+
};
|
|
22
|
+
export function estimateToolTokens(toolName) {
|
|
23
|
+
return TOOL_ESTIMATES[toolName] ?? DEFAULT_ESTIMATE;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=hook-estimator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-estimator.js","sourceRoot":"","sources":["../src/hook-estimator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,MAAM,cAAc,GAAiC;IACnD,IAAI,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE;IAChD,KAAK,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE;IACjD,IAAI,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;IACjD,IAAI,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE;IAChD,IAAI,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE;IAChD,IAAI,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE;IAC/C,QAAQ,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;IACrD,SAAS,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;IACtD,IAAI,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;IACjD,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE;IACxD,eAAe,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE;CAC3D,CAAC;AAEF,MAAM,gBAAgB,GAAiB;IACrC,YAAY,EAAE,IAAI;IAClB,aAAa,EAAE,GAAG;CACnB,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,OAAO,cAAc,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC;AACtD,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Config } from "../types.js";
|
|
2
|
-
export declare function budgetStatusResource(config: Config): {
|
|
2
|
+
export declare function budgetStatusResource(config: Config): Promise<{
|
|
3
3
|
uri: string;
|
|
4
4
|
mimeType: string;
|
|
5
5
|
text: string;
|
|
6
|
-
}
|
|
6
|
+
}>;
|
|
7
7
|
//# sourceMappingURL=budget-status.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"budget-status.d.ts","sourceRoot":"","sources":["../../src/resources/budget-status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,
|
|
1
|
+
{"version":3,"file":"budget-status.d.ts","sourceRoot":"","sources":["../../src/resources/budget-status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,MAAM;;;;GAOxD"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { getBudgetStatus } from "../budget.js";
|
|
2
|
-
export function budgetStatusResource(config) {
|
|
3
|
-
const snapshot = getBudgetStatus(config);
|
|
2
|
+
export async function budgetStatusResource(config) {
|
|
3
|
+
const snapshot = await getBudgetStatus(config);
|
|
4
4
|
return {
|
|
5
5
|
uri: "budget://status",
|
|
6
6
|
mimeType: "application/json",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"budget-status.js","sourceRoot":"","sources":["../../src/resources/budget-status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,UAAU,oBAAoB,CAAC,MAAc;
|
|
1
|
+
{"version":3,"file":"budget-status.js","sourceRoot":"","sources":["../../src/resources/budget-status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,MAAc;IACvD,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC;IAC/C,OAAO;QACL,GAAG,EAAE,iBAAiB;QACtB,QAAQ,EAAE,kBAAkB;QAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;KACxC,CAAC;AACJ,CAAC"}
|
package/dist/server.js
CHANGED
|
@@ -165,7 +165,7 @@ export function createServer() {
|
|
|
165
165
|
const { name, arguments: args } = request.params;
|
|
166
166
|
switch (name) {
|
|
167
167
|
case "check_budget":
|
|
168
|
-
return checkBudget(config);
|
|
168
|
+
return await checkBudget(config);
|
|
169
169
|
case "estimate_task_cost": {
|
|
170
170
|
const input = estimateTaskCostSchema.parse(args);
|
|
171
171
|
return estimateTaskCostTool(config, input);
|
|
@@ -180,7 +180,7 @@ export function createServer() {
|
|
|
180
180
|
}
|
|
181
181
|
case "get_offload_recommendations": {
|
|
182
182
|
const input = getRecommendationsSchema.parse(args ?? {});
|
|
183
|
-
return getRecommendationsTool(config, input);
|
|
183
|
+
return await getRecommendationsTool(config, input);
|
|
184
184
|
}
|
|
185
185
|
case "configure_budget": {
|
|
186
186
|
const input = configureBudgetSchema.parse(args);
|
|
@@ -220,7 +220,7 @@ export function createServer() {
|
|
|
220
220
|
const { uri } = request.params;
|
|
221
221
|
switch (uri) {
|
|
222
222
|
case "budget://status":
|
|
223
|
-
return { contents: [budgetStatusResource(config)] };
|
|
223
|
+
return { contents: [await budgetStatusResource(config)] };
|
|
224
224
|
case "usage://today":
|
|
225
225
|
return { contents: [usageSummaryResource(config)] };
|
|
226
226
|
case "pricing://models":
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import type { Config } from "../types.js";
|
|
3
3
|
export declare const checkBudgetSchema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
|
|
4
|
-
export declare function checkBudget(config: Config): {
|
|
4
|
+
export declare function checkBudget(config: Config): Promise<{
|
|
5
5
|
content: {
|
|
6
6
|
type: "text";
|
|
7
7
|
text: string;
|
|
8
8
|
}[];
|
|
9
9
|
data: import("../types.js").BudgetSnapshot;
|
|
10
|
-
}
|
|
10
|
+
}>;
|
|
11
11
|
//# sourceMappingURL=check-budget.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-budget.d.ts","sourceRoot":"","sources":["../../src/tools/check-budget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,eAAO,MAAM,iBAAiB,gDAAe,CAAC;AAE9C,
|
|
1
|
+
{"version":3,"file":"check-budget.d.ts","sourceRoot":"","sources":["../../src/tools/check-budget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,eAAO,MAAM,iBAAiB,gDAAe,CAAC;AAE9C,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM;;;;;;GAwC/C"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { getBudgetStatus } from "../budget.js";
|
|
3
3
|
export const checkBudgetSchema = z.object({});
|
|
4
|
-
export function checkBudget(config) {
|
|
5
|
-
const snapshot = getBudgetStatus(config);
|
|
4
|
+
export async function checkBudget(config) {
|
|
5
|
+
const snapshot = await getBudgetStatus(config);
|
|
6
6
|
const lines = [
|
|
7
7
|
`Budget Status: ${snapshot.status.toUpperCase()}`,
|
|
8
8
|
`Daily Limit: $${snapshot.daily_limit_usd.toFixed(2)}`,
|
|
@@ -15,6 +15,19 @@ export function checkBudget(config) {
|
|
|
15
15
|
lines.push(`Monthly Limit: $${snapshot.monthly_limit_usd.toFixed(2)}`);
|
|
16
16
|
lines.push(`Spent This Month: $${snapshot.spent_this_month_usd?.toFixed(4) ?? "0.0000"}`);
|
|
17
17
|
}
|
|
18
|
+
if (snapshot.api_spent_today_usd !== undefined) {
|
|
19
|
+
lines.push("");
|
|
20
|
+
lines.push(`API Reported Spend: $${snapshot.api_spent_today_usd.toFixed(4)}`);
|
|
21
|
+
lines.push(`API Usage: ${snapshot.api_pct_used?.toFixed(1)}% of daily limit`);
|
|
22
|
+
lines.push(`Source: Anthropic Admin API`);
|
|
23
|
+
if (snapshot.api_usage && snapshot.api_usage.by_model.length > 0) {
|
|
24
|
+
lines.push("");
|
|
25
|
+
lines.push("Breakdown by model:");
|
|
26
|
+
for (const m of snapshot.api_usage.by_model) {
|
|
27
|
+
lines.push(` ${m.model}: $${m.cost_usd.toFixed(4)} (${m.input_tokens} in / ${m.output_tokens} out)`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
18
31
|
return {
|
|
19
32
|
content: [{ type: "text", text: lines.join("\n") }],
|
|
20
33
|
data: snapshot,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-budget.js","sourceRoot":"","sources":["../../src/tools/check-budget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAE9C,MAAM,UAAU,WAAW,CAAC,MAAc;
|
|
1
|
+
{"version":3,"file":"check-budget.js","sourceRoot":"","sources":["../../src/tools/check-budget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAE9C,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAc;IAC9C,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC;IAE/C,MAAM,KAAK,GAAG;QACZ,kBAAkB,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE;QACjD,iBAAiB,QAAQ,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QACtD,iBAAiB,QAAQ,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QACtD,eAAe,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QAClD,SAAS,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;QACxC,mBAAmB,QAAQ,CAAC,mBAAmB,EAAE;KAClD,CAAC;IAEF,IAAI,QAAQ,CAAC,iBAAiB,KAAK,IAAI,EAAE,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,mBAAmB,QAAQ,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACvE,KAAK,CAAC,IAAI,CACR,sBAAsB,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,CAC9E,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,CAAC,mBAAmB,KAAK,SAAS,EAAE,CAAC;QAC/C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,wBAAwB,QAAQ,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9E,KAAK,CAAC,IAAI,CAAC,cAAc,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;QAC9E,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAE1C,IAAI,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YAClC,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;gBAC5C,KAAK,CAAC,IAAI,CACR,KAAK,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,SAAS,CAAC,CAAC,aAAa,OAAO,CAC1F,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5D,IAAI,EAAE,QAAQ;KACf,CAAC;AACJ,CAAC"}
|
|
@@ -10,13 +10,13 @@ export declare const estimateTaskCostSchema: z.ZodObject<{
|
|
|
10
10
|
task_description: string;
|
|
11
11
|
file_count: number;
|
|
12
12
|
extended_thinking: boolean;
|
|
13
|
-
complexity?: "trivial" | "simple" | "moderate" | "complex" | "massive" | undefined;
|
|
14
13
|
model?: string | undefined;
|
|
14
|
+
complexity?: "trivial" | "simple" | "moderate" | "complex" | "massive" | undefined;
|
|
15
15
|
}, {
|
|
16
16
|
task_description: string;
|
|
17
|
+
model?: string | undefined;
|
|
17
18
|
complexity?: "trivial" | "simple" | "moderate" | "complex" | "massive" | undefined;
|
|
18
19
|
file_count?: number | undefined;
|
|
19
|
-
model?: string | undefined;
|
|
20
20
|
extended_thinking?: boolean | undefined;
|
|
21
21
|
}>;
|
|
22
22
|
export type EstimateTaskCostInput = z.infer<typeof estimateTaskCostSchema>;
|
|
@@ -14,7 +14,7 @@ export declare const getRecommendationsSchema: z.ZodObject<{
|
|
|
14
14
|
is_urgent?: boolean | undefined;
|
|
15
15
|
}>;
|
|
16
16
|
export type GetRecommendationsInput = z.infer<typeof getRecommendationsSchema>;
|
|
17
|
-
export declare function getRecommendationsTool(config: Config, input: GetRecommendationsInput): {
|
|
17
|
+
export declare function getRecommendationsTool(config: Config, input: GetRecommendationsInput): Promise<{
|
|
18
18
|
content: {
|
|
19
19
|
type: "text";
|
|
20
20
|
text: string;
|
|
@@ -23,5 +23,5 @@ export declare function getRecommendationsTool(config: Config, input: GetRecomme
|
|
|
23
23
|
recommendations: import("../types.js").Recommendation[];
|
|
24
24
|
budget_status: import("../types.js").BudgetStatus;
|
|
25
25
|
};
|
|
26
|
-
}
|
|
26
|
+
}>;
|
|
27
27
|
//# sourceMappingURL=get-recommendations.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-recommendations.d.ts","sourceRoot":"","sources":["../../src/tools/get-recommendations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAI1C,eAAO,MAAM,wBAAwB;;;;;;;;;;;;EAanC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAE/E,
|
|
1
|
+
{"version":3,"file":"get-recommendations.d.ts","sourceRoot":"","sources":["../../src/tools/get-recommendations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAI1C,eAAO,MAAM,wBAAwB;;;;;;;;;;;;EAanC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAE/E,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,uBAAuB;;;;;;;;;GAwC/B"}
|
|
@@ -15,8 +15,8 @@ export const getRecommendationsSchema = z.object({
|
|
|
15
15
|
.default(true)
|
|
16
16
|
.describe("Whether the current task is time-sensitive"),
|
|
17
17
|
});
|
|
18
|
-
export function getRecommendationsTool(config, input) {
|
|
19
|
-
const budget = getBudgetStatus(config);
|
|
18
|
+
export async function getRecommendationsTool(config, input) {
|
|
19
|
+
const budget = await getBudgetStatus(config);
|
|
20
20
|
const model = input.current_model ?? config.default_model;
|
|
21
21
|
const recs = getRecommendations(budget, model, input.task_complexity, input.is_urgent);
|
|
22
22
|
if (recs.length === 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-recommendations.js","sourceRoot":"","sources":["../../src/tools/get-recommendations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,aAAa,EAAE,CAAC;SACb,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,4BAA4B,CAAC;IACzC,eAAe,EAAE,CAAC;SACf,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;SAC7D,QAAQ,EAAE;SACV,QAAQ,CAAC,gCAAgC,CAAC;IAC7C,SAAS,EAAE,CAAC;SACT,OAAO,EAAE;SACT,OAAO,CAAC,IAAI,CAAC;SACb,QAAQ,CAAC,4CAA4C,CAAC;CAC1D,CAAC,CAAC;AAIH,MAAM,UAAU,sBAAsB,
|
|
1
|
+
{"version":3,"file":"get-recommendations.js","sourceRoot":"","sources":["../../src/tools/get-recommendations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,aAAa,EAAE,CAAC;SACb,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,4BAA4B,CAAC;IACzC,eAAe,EAAE,CAAC;SACf,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;SAC7D,QAAQ,EAAE;SACV,QAAQ,CAAC,gCAAgC,CAAC;IAC7C,SAAS,EAAE,CAAC;SACT,OAAO,EAAE;SACT,OAAO,CAAC,IAAI,CAAC;SACb,QAAQ,CAAC,4CAA4C,CAAC;CAC1D,CAAC,CAAC;AAIH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,MAAc,EACd,KAA8B;IAE9B,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,IAAI,MAAM,CAAC,aAAa,CAAC;IAC1D,MAAM,IAAI,GAAG,kBAAkB,CAC7B,MAAM,EACN,KAAK,EACL,KAAK,CAAC,eAAe,EACrB,KAAK,CAAC,SAAS,CAChB,CAAC;IAEF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,uEAAuE;iBAC9E;aACF;YACD,IAAI,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE;SAC5D,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG;QACZ,WAAW,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;QAC7H,EAAE;QACF,kBAAkB;KACnB,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CACR,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,MAAM,MAAM,GAAG,CAAC,qBAAqB,YAAY,CACzF,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5D,IAAI,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE;KAC9D,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-usage-history.d.ts","sourceRoot":"","sources":["../../src/tools/get-usage-history.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,eAAO,MAAM,qBAAqB;;;;;;EAQhC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEzE,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,oBAAoB;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"get-usage-history.d.ts","sourceRoot":"","sources":["../../src/tools/get-usage-history.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,eAAO,MAAM,qBAAqB;;;;;;EAQhC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEzE,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,oBAAoB;;;;;;;;;;;;;;;;;;;;;;EAyC5B"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { getUsageHistory } from "../db.js";
|
|
2
|
+
import { getUsageHistory, ingestHookEvents } from "../db.js";
|
|
3
3
|
export const getUsageHistorySchema = z.object({
|
|
4
4
|
days: z
|
|
5
5
|
.number()
|
|
@@ -10,6 +10,8 @@ export const getUsageHistorySchema = z.object({
|
|
|
10
10
|
.describe("Number of days of history to retrieve"),
|
|
11
11
|
});
|
|
12
12
|
export function getUsageHistoryTool(config, input) {
|
|
13
|
+
// Ingest any pending hook events before returning history
|
|
14
|
+
ingestHookEvents(config);
|
|
13
15
|
const history = getUsageHistory(config, input.days);
|
|
14
16
|
if (history.length === 0) {
|
|
15
17
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-usage-history.js","sourceRoot":"","sources":["../../src/tools/get-usage-history.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"get-usage-history.js","sourceRoot":"","sources":["../../src/tools/get-usage-history.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE7D,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,EAAE,CAAC;SACP,OAAO,CAAC,CAAC,CAAC;SACV,QAAQ,CAAC,uCAAuC,CAAC;CACrD,CAAC,CAAC;AAIH,MAAM,UAAU,mBAAmB,CACjC,MAAc,EACd,KAA2B;IAE3B,0DAA0D;IAC1D,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAEzB,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAEpD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,oCAAoC,KAAK,CAAC,IAAI,QAAQ;iBAC7D;aACF;YACD,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;SACnC,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;IACxE,MAAM,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAE5C,MAAM,KAAK,GAAG;QACZ,uBAAuB,KAAK,CAAC,IAAI,UAAU,OAAO,CAAC,MAAM,mBAAmB;QAC5E,EAAE;KACH,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CACR,GAAG,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,aAAa,cAAc,CAAC,GAAG,CAAC,kBAAkB,GAAG,GAAG,CAAC,mBAAmB,CAAC,CAAC,cAAc,EAAE,UAAU,CAChK,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,WAAW,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC9C,KAAK,CAAC,IAAI,CAAC,mBAAmB,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAErD,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5D,IAAI,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE;KAC9D,CAAC;AACJ,CAAC"}
|
|
@@ -22,8 +22,8 @@ export declare const logUsageSchema: z.ZodObject<{
|
|
|
22
22
|
session_id: string;
|
|
23
23
|
input_tokens: number;
|
|
24
24
|
output_tokens: number;
|
|
25
|
-
task_description?: string | undefined;
|
|
26
25
|
model?: string | undefined;
|
|
26
|
+
task_description?: string | undefined;
|
|
27
27
|
cache_read_tokens?: number | undefined;
|
|
28
28
|
cache_write_tokens?: number | undefined;
|
|
29
29
|
source?: "estimate" | "admin_api" | "hook" | "manual" | undefined;
|
package/dist/types.d.ts
CHANGED
|
@@ -13,7 +13,6 @@ export interface Config {
|
|
|
13
13
|
data_dir: string;
|
|
14
14
|
admin_api?: {
|
|
15
15
|
api_key: string;
|
|
16
|
-
organization_id: string;
|
|
17
16
|
sync_interval_minutes: number;
|
|
18
17
|
};
|
|
19
18
|
}
|
|
@@ -39,6 +38,20 @@ export interface DailySummary {
|
|
|
39
38
|
total_cost_usd: number;
|
|
40
39
|
request_count: number;
|
|
41
40
|
}
|
|
41
|
+
export interface ApiUsageByModel {
|
|
42
|
+
model: string;
|
|
43
|
+
input_tokens: number;
|
|
44
|
+
output_tokens: number;
|
|
45
|
+
cache_read_tokens: number;
|
|
46
|
+
cache_write_tokens: number;
|
|
47
|
+
cost_usd: number;
|
|
48
|
+
}
|
|
49
|
+
export interface ApiUsageSummary {
|
|
50
|
+
total_cost_usd: number;
|
|
51
|
+
total_input_tokens: number;
|
|
52
|
+
total_output_tokens: number;
|
|
53
|
+
by_model: ApiUsageByModel[];
|
|
54
|
+
}
|
|
42
55
|
export interface BudgetSnapshot {
|
|
43
56
|
status: BudgetStatus;
|
|
44
57
|
daily_limit_usd: number;
|
|
@@ -48,6 +61,9 @@ export interface BudgetSnapshot {
|
|
|
48
61
|
request_count_today: number;
|
|
49
62
|
monthly_limit_usd: number | null;
|
|
50
63
|
spent_this_month_usd: number | null;
|
|
64
|
+
api_usage?: ApiUsageSummary;
|
|
65
|
+
api_spent_today_usd?: number;
|
|
66
|
+
api_pct_used?: number;
|
|
51
67
|
}
|
|
52
68
|
export interface CostEstimate {
|
|
53
69
|
estimated_input_tokens: number;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;AAEtE,MAAM,MAAM,cAAc,GACtB,SAAS,GACT,QAAQ,GACR,UAAU,GACV,SAAS,GACT,SAAS,CAAC;AAEd,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,WAAW,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEvE,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE;QACN,eAAe,EAAE,MAAM,CAAC;QACxB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;QACjC,qBAAqB,EAAE,MAAM,CAAC;QAC9B,sBAAsB,EAAE,MAAM,CAAC;KAChC,CAAC;IACF,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE;QACV,OAAO,EAAE,MAAM,CAAC;QAChB,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude-accountant",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"description": "Claude Code plugin that tracks API usage, estimates costs, and recommends budget-aware actions",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"license": "MIT",
|
|
29
29
|
"repository": {
|
|
30
30
|
"type": "git",
|
|
31
|
-
"url": ""
|
|
31
|
+
"url": "git+https://github.com/grantlouisherman/claude-accountant.git"
|
|
32
32
|
},
|
|
33
33
|
"scripts": {
|
|
34
34
|
"build": "tsc",
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
|
-
# PostToolUse hook: logs tool invocations to JSONL for usage tracking
|
|
2
|
+
# PostToolUse hook: logs tool invocations to JSONL for automatic usage tracking
|
|
3
3
|
# Called automatically after each tool use in Claude Code
|
|
4
|
+
# Events are ingested into SQLite by the MCP server on next check_budget or get_usage_history call
|
|
4
5
|
|
|
5
6
|
TOOL_NAME="${1:-unknown}"
|
|
6
7
|
SESSION_ID="${2:-unknown}"
|
|
@@ -11,4 +12,5 @@ mkdir -p "$DATA_DIR"
|
|
|
11
12
|
|
|
12
13
|
LOG_FILE="${DATA_DIR}/hook_events.jsonl"
|
|
13
14
|
|
|
15
|
+
# Log tool name, session, and timestamp — the MCP server estimates tokens per tool type
|
|
14
16
|
echo "{\"timestamp\":\"${TIMESTAMP}\",\"tool\":\"${TOOL_NAME}\",\"session_id\":\"${SESSION_ID}\"}" >> "$LOG_FILE"
|
|
@@ -12,9 +12,9 @@ You have access to a usage tracking plugin. Follow these rules to stay budget-aw
|
|
|
12
12
|
- Call `get_offload_recommendations` when budget is above 60% used.
|
|
13
13
|
|
|
14
14
|
## After Completing Work
|
|
15
|
-
-
|
|
15
|
+
- Tool usage is automatically logged via the PostToolUse hook — you do not need to manually call `log_usage` after every tool call.
|
|
16
|
+
- For significant multi-step tasks, you may still call `log_usage` with a summary if you want to add a human-readable description.
|
|
16
17
|
- Use session_id to group related work within a conversation.
|
|
17
|
-
- Include a brief task_description so the user can see what each charge was for.
|
|
18
18
|
|
|
19
19
|
## Budget Thresholds
|
|
20
20
|
- **OK** (<80%): Work normally.
|
|
@@ -22,6 +22,11 @@ You have access to a usage tracking plugin. Follow these rules to stay budget-aw
|
|
|
22
22
|
- **Critical** (95-100%): Only handle urgent requests. Recommend switching to a cheaper model. Strongly suggest deferring.
|
|
23
23
|
- **Exceeded** (>100%): Inform the user their daily budget is spent. Suggest waiting until tomorrow or increasing the limit.
|
|
24
24
|
|
|
25
|
+
## API Usage Data
|
|
26
|
+
- When `check_budget` returns "API Reported Spend" data, this is real usage from Anthropic's Admin API — prefer it over local estimates for budget decisions.
|
|
27
|
+
- The budget status uses the **higher** of local estimates and API-reported spend, so you always get the more conservative view.
|
|
28
|
+
- If API data shows significantly higher spend than local estimates, mention this discrepancy to the user.
|
|
29
|
+
|
|
25
30
|
## Cost-Saving Habits
|
|
26
31
|
- Prefer concise answers when budget is above 60%.
|
|
27
32
|
- Suggest Haiku for simple lookups and formatting tasks.
|