@salimassili/ai-costguard 2.0.1 → 2.1.1
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/CHANGELOG.md +18 -4
- package/README.md +70 -23
- package/benchmarks/token-accuracy.mjs +102 -4
- package/dist/cli.d.ts +11 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +63 -2
- package/dist/cli.js.map +1 -1
- package/dist/core/CostGuard.d.ts +4 -2
- package/dist/core/CostGuard.d.ts.map +1 -1
- package/dist/core/CostGuard.js +2 -1
- package/dist/core/CostGuard.js.map +1 -1
- package/dist/core/GuardCore.d.ts +2 -0
- package/dist/core/GuardCore.d.ts.map +1 -1
- package/dist/core/GuardCore.js +37 -5
- package/dist/core/GuardCore.js.map +1 -1
- package/dist/core/tokenizer.d.ts +19 -1
- package/dist/core/tokenizer.d.ts.map +1 -1
- package/dist/core/tokenizer.js +132 -75
- package/dist/core/tokenizer.js.map +1 -1
- package/dist/core/types.d.ts +11 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/pricing/index.d.ts +17 -0
- package/dist/pricing/index.d.ts.map +1 -1
- package/dist/pricing/index.js +24 -5
- package/dist/pricing/index.js.map +1 -1
- package/docs/BENCHMARKS.md +16 -16
- package/package.json +1 -1
package/dist/pricing/index.js
CHANGED
|
@@ -142,6 +142,20 @@ export function registerPricing(entries) {
|
|
|
142
142
|
runtimePricing.set(normalizeModel(entry.model), entry);
|
|
143
143
|
}
|
|
144
144
|
}
|
|
145
|
+
/**
|
|
146
|
+
* Returns freshness metadata for the pricing entry resolved for a model.
|
|
147
|
+
*/
|
|
148
|
+
export function getPricingMeta(model, overrides = []) {
|
|
149
|
+
const pricing = getPricing(model, overrides);
|
|
150
|
+
if (!pricing)
|
|
151
|
+
return undefined;
|
|
152
|
+
return {
|
|
153
|
+
pricing,
|
|
154
|
+
registryLastUpdated: BUILTIN_PRICING_LAST_UPDATED,
|
|
155
|
+
ageDays: getPricingAgeDays(pricing),
|
|
156
|
+
stale: isPricingStale(pricing, STALE_PRICING_DAYS),
|
|
157
|
+
};
|
|
158
|
+
}
|
|
145
159
|
/**
|
|
146
160
|
* Lists built-in and runtime pricing entries, deduplicated by normalized model name.
|
|
147
161
|
*/
|
|
@@ -176,15 +190,20 @@ function warnIfAnyStale(entries) {
|
|
|
176
190
|
}
|
|
177
191
|
}
|
|
178
192
|
function warnIfStale(entry) {
|
|
179
|
-
const lastUpdatedMs = Date.parse(`${entry.lastUpdated}T00:00:00.000Z`);
|
|
180
|
-
if (!Number.isFinite(lastUpdatedMs))
|
|
181
|
-
return;
|
|
182
|
-
const ageDays = (Date.now() - lastUpdatedMs) / 86_400_000;
|
|
183
193
|
const warningKey = `${normalizeModel(entry.model)}:${entry.lastUpdated}`;
|
|
184
|
-
if (
|
|
194
|
+
if (isPricingStale(entry, STALE_PRICING_DAYS) && !staleWarnings.has(warningKey)) {
|
|
185
195
|
staleWarnings.add(warningKey);
|
|
186
196
|
console.warn(`[AI CostGuard] Pricing for "${entry.model}" is older than ${STALE_PRICING_DAYS} days. ` +
|
|
187
197
|
`Last checked ${entry.lastUpdated}; verify ${entry.source}.`);
|
|
188
198
|
}
|
|
189
199
|
}
|
|
200
|
+
function getPricingAgeDays(entry) {
|
|
201
|
+
const lastUpdatedMs = Date.parse(`${entry.lastUpdated}T00:00:00.000Z`);
|
|
202
|
+
if (!Number.isFinite(lastUpdatedMs))
|
|
203
|
+
return Number.POSITIVE_INFINITY;
|
|
204
|
+
return Math.max(0, Math.floor((Date.now() - lastUpdatedMs) / 86_400_000));
|
|
205
|
+
}
|
|
206
|
+
function isPricingStale(entry, staleAfterDays) {
|
|
207
|
+
return getPricingAgeDays(entry) > staleAfterDays;
|
|
208
|
+
}
|
|
190
209
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pricing/index.ts"],"names":[],"mappings":"AAAA,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAE9B;;;;;GAKG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pricing/index.ts"],"names":[],"mappings":"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"}
|
package/docs/BENCHMARKS.md
CHANGED
|
@@ -34,16 +34,16 @@ npm run benchmark:tokens
|
|
|
34
34
|
|
|
35
35
|
Current local run:
|
|
36
36
|
|
|
37
|
-
- Date: `2026-06-
|
|
38
|
-
- Node: `v24.14.1`
|
|
39
|
-
- Platform: `win32`
|
|
40
|
-
- Iterations: `5000`
|
|
41
|
-
- Direct mocked async call: `0.
|
|
42
|
-
- Guarded mocked async call: `0.
|
|
43
|
-
- Added overhead: `0.
|
|
44
|
-
- Benign repeated "again" prompts blocked: `0`
|
|
45
|
-
- Repeated loop prompt blocked at step: `3`
|
|
46
|
-
- GC exposed for memory run: `false`
|
|
37
|
+
- Date: `2026-06-08T19:54:52.399Z`
|
|
38
|
+
- Node: `v24.14.1`
|
|
39
|
+
- Platform: `win32`
|
|
40
|
+
- Iterations: `5000`
|
|
41
|
+
- Direct mocked async call: `0.000409 ms/call`
|
|
42
|
+
- Guarded mocked async call: `0.024346 ms/call`
|
|
43
|
+
- Added overhead: `0.023937 ms/call`
|
|
44
|
+
- Benign repeated "again" prompts blocked: `0`
|
|
45
|
+
- Repeated loop prompt blocked at step: `3`
|
|
46
|
+
- GC exposed for memory run: `false`
|
|
47
47
|
|
|
48
48
|
Do not quote benchmark numbers without the Node version, platform, iteration count, and date.
|
|
49
49
|
|
|
@@ -53,13 +53,13 @@ Generated benchmark output is intentionally not published in the npm package. Re
|
|
|
53
53
|
|
|
54
54
|
Current fixed-corpus token accuracy run:
|
|
55
55
|
|
|
56
|
-
- Reference:
|
|
57
|
-
- Samples: `
|
|
58
|
-
- Average error: `
|
|
59
|
-
- Median error: `
|
|
60
|
-
- Max error: `
|
|
56
|
+
- Reference: dependency-free fixed proxy fixture counts, not a live provider tokenizer
|
|
57
|
+
- Samples: `24`
|
|
58
|
+
- Average error: `9.68%`
|
|
59
|
+
- Median error: `11.43%`
|
|
60
|
+
- Max error: `28.57%`
|
|
61
61
|
|
|
62
|
-
This shows the
|
|
62
|
+
This shows the calibrated dependency-free estimator is much closer on this proxy corpus. Treat AI CostGuard estimates as pre-call guardrails, not exact provider tokenizer counts. For production budgets that need tighter input-token estimates, register an exact tokenizer with `registerTokenizer()`.
|
|
63
63
|
|
|
64
64
|
## Interpreting Results
|
|
65
65
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@salimassili/ai-costguard",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.1.1",
|
|
4
4
|
"description": "Local-first runtime safety layer for AI agents that blocks runaway costs, loops, retries, and budget overruns before API calls execute.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|