@claudexor/budget 3.9.7 → 3.9.8
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/dist/metrics.d.ts +2 -0
- package/dist/metrics.d.ts.map +1 -1
- package/dist/metrics.js +18 -5
- package/dist/metrics.js.map +1 -1
- package/package.json +3 -3
package/dist/metrics.d.ts
CHANGED
|
@@ -19,6 +19,8 @@ export declare function loadHarnessMetrics(configDir: string): HarnessMetrics;
|
|
|
19
19
|
* sample: an auth-only record (no cost/duration) refreshes `last_auth_mode`
|
|
20
20
|
* WITHOUT counting a sample, so errored attempts can still disclose the route
|
|
21
21
|
* they burned without earning a flattering latency average.
|
|
22
|
+
* An explicit null cost means the settled attempt was unpriced and invalidates
|
|
23
|
+
* the prior cost average; an omitted cost leaves compatible history unchanged.
|
|
22
24
|
*/
|
|
23
25
|
export declare function recordHarnessMetric(configDir: string, harnessId: string, sample: {
|
|
24
26
|
costUsd?: number | null;
|
package/dist/metrics.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB;;;;;OAKG;IACH,cAAc,EAAE,eAAe,GAAG,SAAS,GAAG,IAAI,CAAC;CACpD;AAED,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB;;;;;OAKG;IACH,cAAc,EAAE,eAAe,GAAG,SAAS,GAAG,IAAI,CAAC;CACpD;AAED,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAS3D,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAsCpE;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE;IACN,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,CAAC,EAAE,eAAe,GAAG,SAAS,GAAG,IAAI,CAAC;CAC/C,GACA,IAAI,CAyCN"}
|
package/dist/metrics.js
CHANGED
|
@@ -3,14 +3,17 @@
|
|
|
3
3
|
* attempt cost and duration, persisted under the Claudexor config dir. ONE
|
|
4
4
|
* producer (the orchestrator records after each settled attempt) and ONE
|
|
5
5
|
* consumer (pool ordering fills RouterCandidate.costPerCall/latencyMs).
|
|
6
|
-
* Evidence-based inputs only — never pricing guesses; an
|
|
7
|
-
*
|
|
6
|
+
* Evidence-based inputs only — never pricing guesses; an explicitly unknown
|
|
7
|
+
* attempt cost clears the cost average while still recording duration.
|
|
8
8
|
*/
|
|
9
9
|
import { mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
10
10
|
import { dirname, join } from "node:path";
|
|
11
11
|
/** Exponential moving average weight for new samples (recent runs dominate). */
|
|
12
12
|
const EMA_ALPHA = 0.3;
|
|
13
13
|
const MAX_SAMPLES_COUNTED = 1_000_000;
|
|
14
|
+
// Older rows mixed observed usage with removed adapter fallback tariffs. They
|
|
15
|
+
// cannot prove cost provenance; keep their latency, sample count, and auth route.
|
|
16
|
+
const COST_EVIDENCE_VERSION = 1;
|
|
14
17
|
export function metricsPath(configDir) {
|
|
15
18
|
return join(configDir, "telemetry", "harness-metrics.json");
|
|
16
19
|
}
|
|
@@ -23,7 +26,11 @@ export function loadHarnessMetrics(configDir) {
|
|
|
23
26
|
for (const [id, v] of Object.entries(raw)) {
|
|
24
27
|
const m = v;
|
|
25
28
|
out[id] = {
|
|
26
|
-
avg_cost_usd:
|
|
29
|
+
avg_cost_usd: m.cost_evidence_version === COST_EVIDENCE_VERSION &&
|
|
30
|
+
typeof m.avg_cost_usd === "number" &&
|
|
31
|
+
m.avg_cost_usd >= 0
|
|
32
|
+
? m.avg_cost_usd
|
|
33
|
+
: null,
|
|
27
34
|
avg_duration_ms: typeof m.avg_duration_ms === "number" && m.avg_duration_ms >= 0
|
|
28
35
|
? m.avg_duration_ms
|
|
29
36
|
: null,
|
|
@@ -47,6 +54,8 @@ export function loadHarnessMetrics(configDir) {
|
|
|
47
54
|
* sample: an auth-only record (no cost/duration) refreshes `last_auth_mode`
|
|
48
55
|
* WITHOUT counting a sample, so errored attempts can still disclose the route
|
|
49
56
|
* they burned without earning a flattering latency average.
|
|
57
|
+
* An explicit null cost means the settled attempt was unpriced and invalidates
|
|
58
|
+
* the prior cost average; an omitted cost leaves compatible history unchanged.
|
|
50
59
|
*/
|
|
51
60
|
export function recordHarnessMetric(configDir, harnessId, sample) {
|
|
52
61
|
const all = loadHarnessMetrics(configDir);
|
|
@@ -65,7 +74,7 @@ export function recordHarnessMetric(configDir, harnessId, sample) {
|
|
|
65
74
|
};
|
|
66
75
|
const isPerfSample = typeof sample.costUsd === "number" || typeof sample.durationMs === "number";
|
|
67
76
|
all[harnessId] = {
|
|
68
|
-
avg_cost_usd: ema(prev.avg_cost_usd, sample.costUsd),
|
|
77
|
+
avg_cost_usd: sample.costUsd === null ? null : ema(prev.avg_cost_usd, sample.costUsd),
|
|
69
78
|
avg_duration_ms: ema(prev.avg_duration_ms, sample.durationMs),
|
|
70
79
|
samples: isPerfSample ? Math.min(prev.samples + 1, MAX_SAMPLES_COUNTED) : prev.samples,
|
|
71
80
|
last_auth_mode: sample.authMode === "local_session" || sample.authMode === "api_key"
|
|
@@ -79,7 +88,11 @@ export function recordHarnessMetric(configDir, harnessId, sample) {
|
|
|
79
88
|
// one daemon collide on a pid-only name (the second rename ENOENTs and
|
|
80
89
|
// silently drops the sample).
|
|
81
90
|
const tmp = `${path}.tmp-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
82
|
-
|
|
91
|
+
const persisted = Object.fromEntries(Object.entries(all).map(([id, metric]) => [
|
|
92
|
+
id,
|
|
93
|
+
{ ...metric, cost_evidence_version: COST_EVIDENCE_VERSION },
|
|
94
|
+
]));
|
|
95
|
+
writeFileSync(tmp, JSON.stringify(persisted, null, 2) + "\n");
|
|
83
96
|
renameSync(tmp, path);
|
|
84
97
|
}
|
|
85
98
|
catch {
|
package/dist/metrics.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAiB1C,gFAAgF;AAChF,MAAM,SAAS,GAAG,GAAG,CAAC;AACtB,MAAM,mBAAmB,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@claudexor/budget",
|
|
3
|
-
"version": "3.9.
|
|
3
|
+
"version": "3.9.8",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Budget governor: pre-call leases, circuit breaker, evidence-based routing goals, and multi-window quota pacing.",
|
|
6
6
|
"type": "module",
|
|
@@ -16,8 +16,8 @@
|
|
|
16
16
|
"dist"
|
|
17
17
|
],
|
|
18
18
|
"dependencies": {
|
|
19
|
-
"@claudexor/schema": "3.9.
|
|
20
|
-
"@claudexor/util": "3.9.
|
|
19
|
+
"@claudexor/schema": "3.9.8",
|
|
20
|
+
"@claudexor/util": "3.9.8"
|
|
21
21
|
},
|
|
22
22
|
"repository": {
|
|
23
23
|
"type": "git",
|