@trazum/core 1.10.0 → 1.26.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/dist/against.d.ts +32 -0
- package/dist/against.d.ts.map +1 -0
- package/dist/against.js +34 -0
- package/dist/against.js.map +1 -0
- package/dist/config-schema.d.ts +42 -1
- package/dist/config-schema.d.ts.map +1 -1
- package/dist/config-schema.js +61 -0
- package/dist/config-schema.js.map +1 -1
- package/dist/conversation.d.ts +121 -0
- package/dist/conversation.d.ts.map +1 -0
- package/dist/conversation.js +157 -0
- package/dist/conversation.js.map +1 -0
- package/dist/csv.d.ts +61 -0
- package/dist/csv.d.ts.map +1 -0
- package/dist/csv.js +149 -0
- package/dist/csv.js.map +1 -0
- package/dist/evaluate.d.ts +24 -0
- package/dist/evaluate.d.ts.map +1 -1
- package/dist/evaluate.js +5 -2
- package/dist/evaluate.js.map +1 -1
- package/dist/index.d.ts +25 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +28 -1
- package/dist/index.js.map +1 -1
- package/dist/input-shape.d.ts +104 -0
- package/dist/input-shape.d.ts.map +1 -0
- package/dist/input-shape.js +132 -0
- package/dist/input-shape.js.map +1 -0
- package/dist/levers.d.ts +151 -0
- package/dist/levers.d.ts.map +1 -0
- package/dist/levers.js +160 -0
- package/dist/levers.js.map +1 -0
- package/dist/node.d.ts +1 -1
- package/dist/node.d.ts.map +1 -1
- package/dist/output-shape.d.ts +96 -0
- package/dist/output-shape.d.ts.map +1 -0
- package/dist/output-shape.js +145 -0
- package/dist/output-shape.js.map +1 -0
- package/dist/pricing-overlay.d.ts +1 -1
- package/dist/pricing-overlay.d.ts.map +1 -1
- package/dist/pricing-overlay.js +46 -0
- package/dist/pricing-overlay.js.map +1 -1
- package/dist/repeats.d.ts +75 -0
- package/dist/repeats.d.ts.map +1 -0
- package/dist/repeats.js +82 -0
- package/dist/repeats.js.map +1 -0
- package/dist/reprice.d.ts +143 -0
- package/dist/reprice.d.ts.map +1 -0
- package/dist/reprice.js +82 -0
- package/dist/reprice.js.map +1 -0
- package/dist/session-cost.d.ts +70 -0
- package/dist/session-cost.d.ts.map +1 -0
- package/dist/session-cost.js +90 -0
- package/dist/session-cost.js.map +1 -0
- package/dist/session-ledger.d.ts +77 -0
- package/dist/session-ledger.d.ts.map +1 -0
- package/dist/session-ledger.js +99 -0
- package/dist/session-ledger.js.map +1 -0
- package/dist/ttl-fit.d.ts +103 -0
- package/dist/ttl-fit.d.ts.map +1 -0
- package/dist/ttl-fit.js +184 -0
- package/dist/ttl-fit.js.map +1 -0
- package/dist/usage.d.ts +434 -16
- package/dist/usage.d.ts.map +1 -1
- package/dist/usage.js +383 -23
- package/dist/usage.js.map +1 -1
- package/package.json +1 -1
- package/src/against.ts +48 -0
- package/src/config-schema.ts +106 -0
- package/src/conversation.ts +305 -0
- package/src/csv.ts +184 -0
- package/src/evaluate.ts +33 -3
- package/src/index.ts +51 -1
- package/src/input-shape.ts +259 -0
- package/src/levers.ts +331 -0
- package/src/node.ts +1 -1
- package/src/output-shape.ts +254 -0
- package/src/pricing-overlay.ts +52 -1
- package/src/repeats.ts +166 -0
- package/src/reprice.ts +227 -0
- package/src/session-cost.ts +170 -0
- package/src/session-ledger.ts +189 -0
- package/src/ttl-fit.ts +251 -0
- package/src/usage.ts +795 -7
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The drivers of a change between two bills.
|
|
3
|
+
*
|
|
4
|
+
* One implementation, exported from core, because the sign convention here —
|
|
5
|
+
* **positive means the bill grew**, the diff convention — has already flipped
|
|
6
|
+
* once in this repository's history when restated by hand. The CLI, the MCP
|
|
7
|
+
* and the web all render these rows; three inline computations of the same
|
|
8
|
+
* union-and-subtract is three chances for one of them to disagree about what
|
|
9
|
+
* a vanished workload contributed.
|
|
10
|
+
*
|
|
11
|
+
* Derived over the **union** of keys, so an appeared or vanished workload is
|
|
12
|
+
* named rather than folded silently into the total: `was: null` is a key the
|
|
13
|
+
* previous log did not have, `now: null` one this log no longer has. Both are
|
|
14
|
+
* different statements from `$0.00`, and the renderings say which.
|
|
15
|
+
*/
|
|
16
|
+
export interface AgainstDriver {
|
|
17
|
+
key: string;
|
|
18
|
+
/** What this key cost in the previous log, or null when it was not there. */
|
|
19
|
+
was: number | null;
|
|
20
|
+
/** What it costs now, or null when it is gone. */
|
|
21
|
+
now: number | null;
|
|
22
|
+
/** `(now ?? 0) - (was ?? 0)` — positive means the bill grew. */
|
|
23
|
+
delta: number;
|
|
24
|
+
}
|
|
25
|
+
export declare function driversBetween(before: ReadonlyArray<{
|
|
26
|
+
key: string;
|
|
27
|
+
usd: number;
|
|
28
|
+
}>, after: ReadonlyArray<{
|
|
29
|
+
key: string;
|
|
30
|
+
usd: number;
|
|
31
|
+
}>): AgainstDriver[];
|
|
32
|
+
//# sourceMappingURL=against.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"against.d.ts","sourceRoot":"","sources":["../src/against.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,6EAA6E;IAC7E,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,kDAAkD;IAClD,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,gEAAgE;IAChE,KAAK,EAAE,MAAM,CAAC;CACf;AAQD,wBAAgB,cAAc,CAC5B,MAAM,EAAE,aAAa,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,EACnD,KAAK,EAAE,aAAa,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,GACjD,aAAa,EAAE,CAYjB"}
|
package/dist/against.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The drivers of a change between two bills.
|
|
3
|
+
*
|
|
4
|
+
* One implementation, exported from core, because the sign convention here —
|
|
5
|
+
* **positive means the bill grew**, the diff convention — has already flipped
|
|
6
|
+
* once in this repository's history when restated by hand. The CLI, the MCP
|
|
7
|
+
* and the web all render these rows; three inline computations of the same
|
|
8
|
+
* union-and-subtract is three chances for one of them to disagree about what
|
|
9
|
+
* a vanished workload contributed.
|
|
10
|
+
*
|
|
11
|
+
* Derived over the **union** of keys, so an appeared or vanished workload is
|
|
12
|
+
* named rather than folded silently into the total: `was: null` is a key the
|
|
13
|
+
* previous log did not have, `now: null` one this log no longer has. Both are
|
|
14
|
+
* different statements from `$0.00`, and the renderings say which.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Noise floor, not a judgement threshold: the same accumulated-double drift
|
|
18
|
+
* `cacheEconomics` refuses to report as a finding.
|
|
19
|
+
*/
|
|
20
|
+
const DRIVER_NOISE_USD = 1e-9;
|
|
21
|
+
export function driversBetween(before, after) {
|
|
22
|
+
const wasBy = new Map(before.map((row) => [row.key, row.usd]));
|
|
23
|
+
const nowBy = new Map(after.map((row) => [row.key, row.usd]));
|
|
24
|
+
return [...new Set([...wasBy.keys(), ...nowBy.keys()])]
|
|
25
|
+
.map((key) => ({
|
|
26
|
+
key,
|
|
27
|
+
was: wasBy.has(key) ? wasBy.get(key) : null,
|
|
28
|
+
now: nowBy.has(key) ? nowBy.get(key) : null,
|
|
29
|
+
}))
|
|
30
|
+
.map((driver) => ({ ...driver, delta: (driver.now ?? 0) - (driver.was ?? 0) }))
|
|
31
|
+
.filter((driver) => Math.abs(driver.delta) > DRIVER_NOISE_USD)
|
|
32
|
+
.sort((a, b) => Math.abs(b.delta) - Math.abs(a.delta));
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=against.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"against.js","sourceRoot":"","sources":["../src/against.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAYH;;;GAGG;AACH,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAE9B,MAAM,UAAU,cAAc,CAC5B,MAAmD,EACnD,KAAkD;IAElD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;SACpD,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACb,GAAG;QACH,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,CAAC,CAAC,IAAI;QAC5C,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,CAAC,CAAC,IAAI;KAC7C,CAAC,CAAC;SACF,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;SAC9E,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,gBAAgB,CAAC;SAC7D,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3D,CAAC"}
|
package/dist/config-schema.d.ts
CHANGED
|
@@ -37,6 +37,20 @@ export interface BaselineConfig {
|
|
|
37
37
|
maxGrowthTokens?: number;
|
|
38
38
|
maxGrowthPct?: number;
|
|
39
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* Money budgets, in dollars, for the log-reading side of the tool.
|
|
42
|
+
*
|
|
43
|
+
* A budget for a workload that made no calls is **not** a pass and not a
|
|
44
|
+
* failure: it is a measurement that did not happen, and the report says so
|
|
45
|
+
* rather than reporting green over an absence. That is the same three-state
|
|
46
|
+
* rule the counts, the timestamps and the stop reasons all follow.
|
|
47
|
+
*/
|
|
48
|
+
export interface SpendConfig {
|
|
49
|
+
/** Whole-log budget. `--max-usd` overrides it. */
|
|
50
|
+
maxUsd?: number;
|
|
51
|
+
/** Per-label budgets, each gated against that label's own spend. */
|
|
52
|
+
byLabel?: Record<string, number>;
|
|
53
|
+
}
|
|
40
54
|
export interface TrazumConfig {
|
|
41
55
|
level?: RuleLevel;
|
|
42
56
|
locale?: Locale;
|
|
@@ -48,6 +62,32 @@ export interface TrazumConfig {
|
|
|
48
62
|
* leaving it to be inferred.
|
|
49
63
|
*/
|
|
50
64
|
budgets?: Record<string, number>;
|
|
65
|
+
/**
|
|
66
|
+
* Which prompt file each usage-log label sends, so `profile` can close the
|
|
67
|
+
* loop it opens.
|
|
68
|
+
*
|
|
69
|
+
* `profile` can say "caching loses money on `support-rag`" and nothing more —
|
|
70
|
+
* the log carries counts, not content. With this map it reads the named file
|
|
71
|
+
* and says *why*: where the first placeholder sits, how many stable tokens
|
|
72
|
+
* never reach the cacheable prefix, and whether the model's minimum is met at
|
|
73
|
+
* all. The file is whatever is in the repository today, which may not be what
|
|
74
|
+
* produced the log, and the report says so.
|
|
75
|
+
*/
|
|
76
|
+
labels?: Record<string, string>;
|
|
77
|
+
/**
|
|
78
|
+
* Money budgets for `trazum profile`, in dollars.
|
|
79
|
+
*
|
|
80
|
+
* `budgets` gates the tokens a prompt file may hold; this gates the dollars
|
|
81
|
+
* a usage log records — the same difference `check` and `profile` have
|
|
82
|
+
* everywhere else. Written in the repository rather than passed as a flag
|
|
83
|
+
* because a per-workload budget is a policy several people agree on, and a
|
|
84
|
+
* policy that lives in one CI invocation is a policy nobody can read.
|
|
85
|
+
*
|
|
86
|
+
* `maxUsd` is the default for `--max-usd`; `byLabel` gates each named
|
|
87
|
+
* workload against its own limit in the same run. A flag still wins over
|
|
88
|
+
* the config, as everywhere in this tool.
|
|
89
|
+
*/
|
|
90
|
+
spend?: SpendConfig;
|
|
51
91
|
/** Default for `trazum diff --max-growth`, in tokens. */
|
|
52
92
|
maxGrowth?: number;
|
|
53
93
|
/**
|
|
@@ -76,8 +116,9 @@ export interface TrazumConfig {
|
|
|
76
116
|
* against it rather than against a second hand-maintained list — a setting the
|
|
77
117
|
* help never mentions is one only the changelog knows about.
|
|
78
118
|
*/
|
|
79
|
-
export declare const CONFIG_KEYS: readonly ['level', 'locale', 'disable', 'usage', 'budgets', 'maxGrowth', 'baseline', 'extensions', 'pricing'];
|
|
119
|
+
export declare const CONFIG_KEYS: readonly ['level', 'locale', 'disable', 'usage', 'budgets', 'labels', 'spend', 'maxGrowth', 'baseline', 'extensions', 'pricing'];
|
|
80
120
|
export declare const CONFIG_BASELINE_KEYS: readonly ['path', 'maxGrowthTokens', 'maxGrowthPct'];
|
|
121
|
+
export declare const CONFIG_SPEND_KEYS: readonly ['maxUsd', 'byLabel'];
|
|
81
122
|
export declare const CONFIG_USAGE_KEYS: readonly ['model', 'callsPerMonth', 'avgOutputTokens', 'cacheHitRate', 'batchEligible'];
|
|
82
123
|
/** Extensions directory mode reads when the config does not say otherwise. */
|
|
83
124
|
export declare const DEFAULT_EXTENSIONS: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-schema.d.ts","sourceRoot":"","sources":["../src/config-schema.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAIrD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAElE;;;;;;;;;;;;;;;GAeG;AAEH,eAAO,MAAM,eAAe,uBAAuB,CAAC;AAEpD;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,QAAY,CAAC;AAE1C,kEAAkE;AAClE,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAE1C,MAAM,WAAW,cAAc;IAC7B,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC9B;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;;;;OASG;IACH,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,eAAO,MAAM,WAAW,YACtB,OAAO,EACP,QAAQ,EACR,SAAS,EACT,OAAO,EACP,SAAS,EACT,WAAW,EACX,UAAU,EACV,YAAY,EACZ,SAAS,CACD,CAAC;AAEX,eAAO,MAAM,oBAAoB,YAAI,MAAM,EAAE,iBAAiB,EAAE,cAAc,CAAU,CAAC;AAEzF,eAAO,MAAM,iBAAiB,YAC5B,OAAO,EACP,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,eAAe,CACP,CAAC;AAKX,8EAA8E;AAC9E,eAAO,MAAM,kBAAkB,UAAsC,CAAC;AAEtE,qBAAa,WAAY,SAAQ,KAAK;IAGlC,QAAQ,CAAC,MAAM,EAAE,MAAM;IAFzB,YACE,OAAO,EAAE,MAAM,EACN,MAAM,EAAE,MAAM,EAIxB;CACF;
|
|
1
|
+
{"version":3,"file":"config-schema.d.ts","sourceRoot":"","sources":["../src/config-schema.ts"],"names":[],"mappings":"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"}
|
package/dist/config-schema.js
CHANGED
|
@@ -40,12 +40,15 @@ export const CONFIG_KEYS = [
|
|
|
40
40
|
'disable',
|
|
41
41
|
'usage',
|
|
42
42
|
'budgets',
|
|
43
|
+
'labels',
|
|
44
|
+
'spend',
|
|
43
45
|
'maxGrowth',
|
|
44
46
|
'baseline',
|
|
45
47
|
'extensions',
|
|
46
48
|
'pricing',
|
|
47
49
|
];
|
|
48
50
|
export const CONFIG_BASELINE_KEYS = ['path', 'maxGrowthTokens', 'maxGrowthPct'];
|
|
51
|
+
export const CONFIG_SPEND_KEYS = ['maxUsd', 'byLabel'];
|
|
49
52
|
export const CONFIG_USAGE_KEYS = [
|
|
50
53
|
'model',
|
|
51
54
|
'callsPerMonth',
|
|
@@ -137,6 +140,27 @@ function parseUsage(raw, source) {
|
|
|
137
140
|
* nothing. A config should be judged the same way everywhere it is checked.
|
|
138
141
|
*/
|
|
139
142
|
const IS_ABSOLUTE = /^(?:[/\\]|[A-Za-z]:[/\\])/;
|
|
143
|
+
function parseLabels(raw, source) {
|
|
144
|
+
if (!isPlainObject(raw))
|
|
145
|
+
throw new ConfigError('"labels" must be an object', source);
|
|
146
|
+
const labels = {};
|
|
147
|
+
for (const [label, value] of Object.entries(raw)) {
|
|
148
|
+
if (label.length === 0) {
|
|
149
|
+
throw new ConfigError('"labels" has an empty label', source);
|
|
150
|
+
}
|
|
151
|
+
if (typeof value !== 'string' || value.length === 0) {
|
|
152
|
+
throw new ConfigError(`labels["${label}"] must be a file path`, source);
|
|
153
|
+
}
|
|
154
|
+
// Same boundary as budgets, for the same reason: an absolute path or one
|
|
155
|
+
// that climbs out with ".." points outside the project, and both are
|
|
156
|
+
// mistakes worth naming rather than files worth reading.
|
|
157
|
+
if (IS_ABSOLUTE.test(value) || value.includes('..')) {
|
|
158
|
+
throw new ConfigError(`labels["${label}"] must be a relative path inside the project`, source);
|
|
159
|
+
}
|
|
160
|
+
labels[label] = value;
|
|
161
|
+
}
|
|
162
|
+
return labels;
|
|
163
|
+
}
|
|
140
164
|
function parseBudgets(raw, source) {
|
|
141
165
|
if (!isPlainObject(raw))
|
|
142
166
|
throw new ConfigError('"budgets" must be an object', source);
|
|
@@ -159,6 +183,39 @@ function parseBudgets(raw, source) {
|
|
|
159
183
|
}
|
|
160
184
|
return budgets;
|
|
161
185
|
}
|
|
186
|
+
/**
|
|
187
|
+
* Validates the `spend` block.
|
|
188
|
+
*
|
|
189
|
+
* Dollars, not tokens, so non-integers are legitimate — $0.50 is a budget
|
|
190
|
+
* somebody means. Negative is not: a budget below zero can only fail, which
|
|
191
|
+
* makes it a mistake dressed as a policy. An empty label is rejected for the
|
|
192
|
+
* reason the empty string is the unlabelled bucket's sentinel: a config that
|
|
193
|
+
* meant "calls with no label" should say so through a real key, not through a
|
|
194
|
+
* value that collides with an internal one.
|
|
195
|
+
*/
|
|
196
|
+
function parseSpend(raw, source) {
|
|
197
|
+
if (!isPlainObject(raw))
|
|
198
|
+
throw new ConfigError('"spend" must be an object', source);
|
|
199
|
+
rejectUnknownKeys(raw, CONFIG_SPEND_KEYS, source, 'spend.');
|
|
200
|
+
const spend = {};
|
|
201
|
+
if (raw.maxUsd !== undefined) {
|
|
202
|
+
spend.maxUsd = requireNonNegativeNumber(raw.maxUsd, 'spend.maxUsd', source);
|
|
203
|
+
}
|
|
204
|
+
if (raw.byLabel !== undefined) {
|
|
205
|
+
if (!isPlainObject(raw.byLabel)) {
|
|
206
|
+
throw new ConfigError('"spend.byLabel" must be an object', source);
|
|
207
|
+
}
|
|
208
|
+
const byLabel = {};
|
|
209
|
+
for (const [label, value] of Object.entries(raw.byLabel)) {
|
|
210
|
+
if (label.trim().length === 0) {
|
|
211
|
+
throw new ConfigError('"spend.byLabel" has an empty label', source);
|
|
212
|
+
}
|
|
213
|
+
byLabel[label] = requireNonNegativeNumber(value, `spend.byLabel["${label}"]`, source);
|
|
214
|
+
}
|
|
215
|
+
spend.byLabel = byLabel;
|
|
216
|
+
}
|
|
217
|
+
return spend;
|
|
218
|
+
}
|
|
162
219
|
/**
|
|
163
220
|
* Validates the `baseline` block.
|
|
164
221
|
*
|
|
@@ -272,6 +329,10 @@ export function parseConfig(raw, source = CONFIG_FILENAME) {
|
|
|
272
329
|
config.usage = parseUsage(document.usage, source);
|
|
273
330
|
if (document.budgets !== undefined)
|
|
274
331
|
config.budgets = parseBudgets(document.budgets, source);
|
|
332
|
+
if (document.labels !== undefined)
|
|
333
|
+
config.labels = parseLabels(document.labels, source);
|
|
334
|
+
if (document.spend !== undefined)
|
|
335
|
+
config.spend = parseSpend(document.spend, source);
|
|
275
336
|
if (document.baseline !== undefined) {
|
|
276
337
|
config.baseline = parseBaselineConfig(document.baseline, source);
|
|
277
338
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-schema.js","sourceRoot":"","sources":["../src/config-schema.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config-schema.js","sourceRoot":"","sources":["../src/config-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import type { PricingCatalogue } from './pricing.js';
|
|
2
|
+
import type { UsageRecord } from './usage.js';
|
|
3
|
+
/**
|
|
4
|
+
* What re-sending the conversation costs.
|
|
5
|
+
*
|
|
6
|
+
* ## The line nothing was watching
|
|
7
|
+
*
|
|
8
|
+
* A chat or agent workload sends the whole conversation back on every turn. Turn
|
|
9
|
+
* one is a system prompt and a question; turn twenty is a system prompt and
|
|
10
|
+
* nineteen previous exchanges and a question. The input grows linearly with the
|
|
11
|
+
* turn count, and on an agent bill that growth is routinely the largest single
|
|
12
|
+
* line — larger than the prompt, larger than the answers.
|
|
13
|
+
*
|
|
14
|
+
* Nothing in this package could see it. A prompt file shows the system prompt and
|
|
15
|
+
* not the history. A total shows the sum and not the shape. Even `profile` reported
|
|
16
|
+
* "input is 71% of this bill" without being able to say that most of that input was
|
|
17
|
+
* the same sentences, sent again.
|
|
18
|
+
*
|
|
19
|
+
* ## What it will and will not claim
|
|
20
|
+
*
|
|
21
|
+
* The honest figure is a **ceiling**, and the token half of it is exact: the
|
|
22
|
+
* input tokens beyond every turn being the size of the session's smallest turn.
|
|
23
|
+
* That quantity is order-independent — the first-seen anchor made the identical
|
|
24
|
+
* workload vanish when exported newest-first — and it is immune to billing
|
|
25
|
+
* rates: a cost-based anchor charged an ordinary 5-minute-TTL agent 77.5%
|
|
26
|
+
* "growth" on a conversation that never grew, because a cache-miss turn costs
|
|
27
|
+
* 12.5x a cache-hit turn of the same size. The dollars are that token share of
|
|
28
|
+
* what the session actually spent, at its own blended rate.
|
|
29
|
+
*
|
|
30
|
+
* It is a ceiling and not a saving because part of that growth is the user's own
|
|
31
|
+
* new messages, which nobody can truncate away, and this module cannot tell those
|
|
32
|
+
* apart from re-sent history — it sees counts, not content. Reporting the ceiling
|
|
33
|
+
* as an opportunity would be the flattering direction; reporting nothing because
|
|
34
|
+
* the exact split is unknowable would be worse. So it reports the bound and says
|
|
35
|
+
* what it is.
|
|
36
|
+
*
|
|
37
|
+
* ## The session key never leaves this module
|
|
38
|
+
*
|
|
39
|
+
* A session identifier is somebody's conversation, and in a real log it is often an
|
|
40
|
+
* account id, a ticket number or an email. It is used to group calls and count
|
|
41
|
+
* turns; **no figure reported anywhere carries it**, and every result is aggregated
|
|
42
|
+
* per label. The promise that a usage log handed to Trazum contains no content is
|
|
43
|
+
* only worth something if nothing identifying comes back out either.
|
|
44
|
+
*/
|
|
45
|
+
/** How one label-and-model slice grows across a conversation. */
|
|
46
|
+
export interface ConversationGrowth {
|
|
47
|
+
label: string;
|
|
48
|
+
model: string;
|
|
49
|
+
modelName: string;
|
|
50
|
+
/** How many distinct conversations were seen. Never which ones. */
|
|
51
|
+
sessions: number;
|
|
52
|
+
calls: number;
|
|
53
|
+
/** Mean input tokens on the smallest turn of a conversation. */
|
|
54
|
+
minTurnTokens: number;
|
|
55
|
+
/** Mean input tokens on the largest turn. */
|
|
56
|
+
maxTurnTokens: number;
|
|
57
|
+
/** Turns in the longest conversation seen. */
|
|
58
|
+
longestSession: number;
|
|
59
|
+
/** Input-side spend: plain input, cache reads and cache writes. */
|
|
60
|
+
inputUsd: number;
|
|
61
|
+
/** What that would have been if every turn had cost what its cheapest turn did. */
|
|
62
|
+
flatUsd: number;
|
|
63
|
+
/**
|
|
64
|
+
* `inputUsd - flatUsd`. **A ceiling on what removing conversation growth could
|
|
65
|
+
* be worth, not a saving** — part of it is the user's own new messages.
|
|
66
|
+
*/
|
|
67
|
+
growthUsd: number;
|
|
68
|
+
/** `growthUsd` as a fraction of the whole bill in the log. */
|
|
69
|
+
shareOfBill: number;
|
|
70
|
+
}
|
|
71
|
+
export interface ConversationOptions {
|
|
72
|
+
catalogue: PricingCatalogue;
|
|
73
|
+
on?: Date;
|
|
74
|
+
/**
|
|
75
|
+
* Slices whose growth is below this share of the bill are dropped, and slices
|
|
76
|
+
* shorter than `minTurns` never count as conversations at all.
|
|
77
|
+
*/
|
|
78
|
+
minShare?: number;
|
|
79
|
+
/**
|
|
80
|
+
* Conversations shorter than this are ignored.
|
|
81
|
+
*
|
|
82
|
+
* Two turns is not a conversation, it is a retry — and a workload that never
|
|
83
|
+
* exceeds two turns has no growth to measure, so including it would put a row on
|
|
84
|
+
* screen whose figure is arithmetic noise. Default 3.
|
|
85
|
+
*/
|
|
86
|
+
minTurns?: number;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Measures what conversation growth costs, from records that carry a session.
|
|
90
|
+
*
|
|
91
|
+
* Records without one are skipped rather than lumped together: calls from
|
|
92
|
+
* different conversations pushed into a single bucket would report a turn count
|
|
93
|
+
* that is really a call count, and a growth figure derived from it would be
|
|
94
|
+
* arithmetic performed on a fiction.
|
|
95
|
+
*
|
|
96
|
+
* Takes records rather than a report because turn order is the whole measurement,
|
|
97
|
+
* and a breakdown has already thrown it away.
|
|
98
|
+
*/
|
|
99
|
+
export interface ConversationTracker {
|
|
100
|
+
/** Feed one parsed record. Records without a session are ignored. */
|
|
101
|
+
add(record: UsageRecord): void;
|
|
102
|
+
/** The finished measurement, once the whole bill is known. */
|
|
103
|
+
finish(totalUsd: number): ConversationGrowth[];
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* An accumulator, so a profile can measure this in the pass it already makes.
|
|
107
|
+
*
|
|
108
|
+
* The alternative was holding every record to hand to a pure function afterwards,
|
|
109
|
+
* and a usage log is measured in megabytes — a profile that needs the whole file in
|
|
110
|
+
* memory to answer one question is a profile that stops working on the logs most
|
|
111
|
+
* worth reading. What this holds is bounded by the number of **conversations**, and
|
|
112
|
+
* only ever four numbers each.
|
|
113
|
+
*/
|
|
114
|
+
export declare function createConversationTracker(options: ConversationOptions): ConversationTracker;
|
|
115
|
+
/**
|
|
116
|
+
* The same measurement over a list of records, for a caller holding one already.
|
|
117
|
+
*
|
|
118
|
+
* `profileUsage` uses the tracker instead, so it never has to keep the log.
|
|
119
|
+
*/
|
|
120
|
+
export declare function conversationGrowth(records: readonly UsageRecord[], totalUsd: number, options: ConversationOptions): ConversationGrowth[];
|
|
121
|
+
//# sourceMappingURL=conversation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../src/conversation.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAEH,iEAAiE;AACjE,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,mEAAmE;IACnE,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,aAAa,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,aAAa,EAAE,MAAM,CAAC;IACtB,8CAA8C;IAC9C,cAAc,EAAE,MAAM,CAAC;IACvB,mEAAmE;IACnE,QAAQ,EAAE,MAAM,CAAC;IACjB,mFAAmF;IACnF,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB,8DAA8D;IAC9D,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,gBAAgB,CAAC;IAC5B,EAAE,CAAC,EAAE,IAAI,CAAC;IACV;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA6CD;;;;;;;;;;GAUG;AACH,MAAM,WAAW,mBAAmB;IAClC,qEAAqE;IACrE,GAAG,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC/B,8DAA8D;IAC9D,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,EAAE,CAAC;CAChD;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,mBAAmB,GAAG,mBAAmB,CA8H3F;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,SAAS,WAAW,EAAE,EAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,mBAAmB,GAC3B,kBAAkB,EAAE,CAItB"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { effectivePricing, multipliersFor } from './pricing.js';
|
|
2
|
+
import { UNLABELLED } from './usage.js';
|
|
3
|
+
/** Input-side cost of one call at its own model's rates. */
|
|
4
|
+
function inputCostOf(record, catalogue, on) {
|
|
5
|
+
const model = catalogue.byId.get(record.model);
|
|
6
|
+
if (!model)
|
|
7
|
+
return null;
|
|
8
|
+
const { inputPerMTok } = effectivePricing(model, on);
|
|
9
|
+
const rates = multipliersFor(model);
|
|
10
|
+
const per = (tokens, rate) => (tokens / 1_000_000) * rate;
|
|
11
|
+
return (per(record.inputTokens, inputPerMTok) +
|
|
12
|
+
per(record.cacheReadTokens, inputPerMTok * rates.cacheRead) +
|
|
13
|
+
per(record.cacheWrite5mTokens, inputPerMTok * rates.cacheWrite5m) +
|
|
14
|
+
per(record.cacheWrite1hTokens, inputPerMTok * rates.cacheWrite1h));
|
|
15
|
+
}
|
|
16
|
+
/** Every input-side token of one call, whatever rate it was billed at. */
|
|
17
|
+
const inputTokensOf = (r) => r.inputTokens + r.cacheReadTokens + r.cacheWrite5mTokens + r.cacheWrite1hTokens;
|
|
18
|
+
/**
|
|
19
|
+
* An accumulator, so a profile can measure this in the pass it already makes.
|
|
20
|
+
*
|
|
21
|
+
* The alternative was holding every record to hand to a pure function afterwards,
|
|
22
|
+
* and a usage log is measured in megabytes — a profile that needs the whole file in
|
|
23
|
+
* memory to answer one question is a profile that stops working on the logs most
|
|
24
|
+
* worth reading. What this holds is bounded by the number of **conversations**, and
|
|
25
|
+
* only ever four numbers each.
|
|
26
|
+
*/
|
|
27
|
+
export function createConversationTracker(options) {
|
|
28
|
+
const { catalogue, on = new Date(), minShare = 0.01, minTurns = 3 } = options;
|
|
29
|
+
// Keyed on the pair, then on the session inside it. A newline cannot occur in a
|
|
30
|
+
// model id, and both halves are trimmed strings.
|
|
31
|
+
const slices = new Map();
|
|
32
|
+
const add = (record) => {
|
|
33
|
+
if (record.session === null)
|
|
34
|
+
return;
|
|
35
|
+
const cost = inputCostOf(record, catalogue, on);
|
|
36
|
+
// An unpriced model contributes no dollars anywhere else either; including it
|
|
37
|
+
// here would report growth of zero on a workload that grew.
|
|
38
|
+
if (cost === null)
|
|
39
|
+
return;
|
|
40
|
+
const sliceKey = `${record.label ?? UNLABELLED}\n${record.model}`;
|
|
41
|
+
let sessions = slices.get(sliceKey);
|
|
42
|
+
if (!sessions) {
|
|
43
|
+
sessions = new Map();
|
|
44
|
+
slices.set(sliceKey, sessions);
|
|
45
|
+
}
|
|
46
|
+
const tokens = inputTokensOf(record);
|
|
47
|
+
const existing = sessions.get(record.session);
|
|
48
|
+
if (!existing) {
|
|
49
|
+
sessions.set(record.session, {
|
|
50
|
+
turns: 1,
|
|
51
|
+
minTokens: tokens,
|
|
52
|
+
maxTokens: tokens,
|
|
53
|
+
totalTokens: tokens,
|
|
54
|
+
totalUsd: cost,
|
|
55
|
+
});
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
existing.turns += 1;
|
|
59
|
+
existing.minTokens = Math.min(existing.minTokens, tokens);
|
|
60
|
+
existing.maxTokens = Math.max(existing.maxTokens, tokens);
|
|
61
|
+
existing.totalTokens += tokens;
|
|
62
|
+
existing.totalUsd += cost;
|
|
63
|
+
};
|
|
64
|
+
const finish = (totalUsd) => {
|
|
65
|
+
const out = [];
|
|
66
|
+
for (const [sliceKey, sessions] of slices) {
|
|
67
|
+
const split = sliceKey.indexOf('\n');
|
|
68
|
+
const label = sliceKey.slice(0, split);
|
|
69
|
+
const modelId = sliceKey.slice(split + 1);
|
|
70
|
+
const model = catalogue.byId.get(modelId);
|
|
71
|
+
if (!model)
|
|
72
|
+
continue;
|
|
73
|
+
/**
|
|
74
|
+
* Only conversations long enough to have grown. A two-turn session has one
|
|
75
|
+
* step of growth and is as likely to be a retry, and averaging it in drags the
|
|
76
|
+
* measured shape towards flat — understating the real thing, which is the
|
|
77
|
+
* direction that flatters.
|
|
78
|
+
*/
|
|
79
|
+
const long = [...sessions.values()].filter((s) => s.turns >= minTurns);
|
|
80
|
+
if (long.length === 0)
|
|
81
|
+
continue;
|
|
82
|
+
let inputUsd = 0;
|
|
83
|
+
let flatUsd = 0;
|
|
84
|
+
let minTokens = 0;
|
|
85
|
+
let maxTokens = 0;
|
|
86
|
+
let calls = 0;
|
|
87
|
+
let longestSession = 0;
|
|
88
|
+
for (const session of long) {
|
|
89
|
+
inputUsd += session.totalUsd;
|
|
90
|
+
/**
|
|
91
|
+
* The growth is measured in tokens — `totalTokens - minTokens·turns`,
|
|
92
|
+
* which is exact, order-independent, and zero for a conversation whose
|
|
93
|
+
* turns never change size however each one was billed. The money is that
|
|
94
|
+
* token share of what the session actually spent: pricing the excess at
|
|
95
|
+
* any single rate would either overstate it (full input rate, when most
|
|
96
|
+
* re-sent history is cache-read cheap) or move with billing noise (the
|
|
97
|
+
* cheapest turn's rate, which is what mis-billed a flat cached agent).
|
|
98
|
+
*/
|
|
99
|
+
const flatTokens = session.minTokens * session.turns;
|
|
100
|
+
flatUsd +=
|
|
101
|
+
session.totalTokens > 0
|
|
102
|
+
? session.totalUsd * (flatTokens / session.totalTokens)
|
|
103
|
+
: session.totalUsd;
|
|
104
|
+
minTokens += session.minTokens;
|
|
105
|
+
maxTokens += session.maxTokens;
|
|
106
|
+
calls += session.turns;
|
|
107
|
+
longestSession = Math.max(longestSession, session.turns);
|
|
108
|
+
}
|
|
109
|
+
const growthUsd = inputUsd - flatUsd;
|
|
110
|
+
const shareOfBill = totalUsd > 0 ? growthUsd / totalUsd : 0;
|
|
111
|
+
/**
|
|
112
|
+
* Below the attention threshold — **and that covers shrinking conversations
|
|
113
|
+
* too**, because a negative share is below any threshold at or above zero.
|
|
114
|
+
*
|
|
115
|
+
* There was a separate `growthUsd <= 0` check here. No mutation could break
|
|
116
|
+
* it: every case it caught, this one caught first. A guard nothing can
|
|
117
|
+
* distinguish is not defence in depth, it is a second place for the intent to
|
|
118
|
+
* drift from the code, so the intent lives in this comment instead.
|
|
119
|
+
*
|
|
120
|
+
* The case it was written for is ordinary: an opening turn carrying an
|
|
121
|
+
* attachment or a retrieved document is bigger than everything after it, and
|
|
122
|
+
* reporting that as "conversation growth" would be a negative ceiling
|
|
123
|
+
* presented as an opportunity.
|
|
124
|
+
*/
|
|
125
|
+
if (shareOfBill < minShare)
|
|
126
|
+
continue;
|
|
127
|
+
out.push({
|
|
128
|
+
label,
|
|
129
|
+
model: modelId,
|
|
130
|
+
modelName: model.displayName,
|
|
131
|
+
sessions: long.length,
|
|
132
|
+
calls,
|
|
133
|
+
minTurnTokens: minTokens / long.length,
|
|
134
|
+
maxTurnTokens: maxTokens / long.length,
|
|
135
|
+
longestSession,
|
|
136
|
+
inputUsd,
|
|
137
|
+
flatUsd,
|
|
138
|
+
growthUsd,
|
|
139
|
+
shareOfBill,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
return out.sort((a, b) => b.growthUsd - a.growthUsd);
|
|
143
|
+
};
|
|
144
|
+
return { add, finish };
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* The same measurement over a list of records, for a caller holding one already.
|
|
148
|
+
*
|
|
149
|
+
* `profileUsage` uses the tracker instead, so it never has to keep the log.
|
|
150
|
+
*/
|
|
151
|
+
export function conversationGrowth(records, totalUsd, options) {
|
|
152
|
+
const tracker = createConversationTracker(options);
|
|
153
|
+
for (const record of records)
|
|
154
|
+
tracker.add(record);
|
|
155
|
+
return tracker.finish(totalUsd);
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=conversation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation.js","sourceRoot":"","sources":["../src/conversation.ts"],"names":[],"mappings":"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"}
|