@trazum/core 1.10.0 → 1.25.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,145 @@
|
|
|
1
|
+
import { effectivePricing } from './pricing.js';
|
|
2
|
+
import { UNLABELLED } from './usage.js';
|
|
3
|
+
/**
|
|
4
|
+
* Bucket edges, fine where answers actually land and coarse in the tail.
|
|
5
|
+
*
|
|
6
|
+
* 64 tokens up to 8,192 covers ordinary answers at a resolution finer than anybody
|
|
7
|
+
* would act on; past that the buckets widen, because the difference between a
|
|
8
|
+
* 40,000-token answer and a 41,000-token one changes no decision. The last bucket is
|
|
9
|
+
* open-ended so nothing falls off the end — an answer longer than the largest edge
|
|
10
|
+
* still counts, in the group where it belongs.
|
|
11
|
+
*/
|
|
12
|
+
const EDGES = (() => {
|
|
13
|
+
const edges = [];
|
|
14
|
+
for (let t = 0; t < 8192; t += 64)
|
|
15
|
+
edges.push(t);
|
|
16
|
+
for (let t = 8192; t < 131_072; t += 1024)
|
|
17
|
+
edges.push(t);
|
|
18
|
+
return edges;
|
|
19
|
+
})();
|
|
20
|
+
/** Index of the bucket a count falls in. The last bucket is open-ended. */
|
|
21
|
+
function bucketOf(tokens) {
|
|
22
|
+
if (tokens >= EDGES[EDGES.length - 1])
|
|
23
|
+
return EDGES.length - 1;
|
|
24
|
+
if (tokens < 8192)
|
|
25
|
+
return Math.floor(tokens / 64);
|
|
26
|
+
return 128 + Math.floor((tokens - 8192) / 1024);
|
|
27
|
+
}
|
|
28
|
+
/** A bucket's upper edge, or `null` for the open-ended last one. */
|
|
29
|
+
function upperEdgeOf(bucket) {
|
|
30
|
+
if (bucket >= EDGES.length - 1)
|
|
31
|
+
return null;
|
|
32
|
+
return EDGES[bucket + 1];
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* The bucket ceiling covering `share` of the calls, walking up from the
|
|
36
|
+
* shortest answers. Exact over the histogram: every call at or below the
|
|
37
|
+
* returned ceiling is counted, none is interpolated.
|
|
38
|
+
*/
|
|
39
|
+
function ceilingFor(buckets, totalCalls, share) {
|
|
40
|
+
const ascending = [...buckets.keys()].sort((a, b) => a - b);
|
|
41
|
+
const target = totalCalls * share;
|
|
42
|
+
let covered = 0;
|
|
43
|
+
for (const b of ascending) {
|
|
44
|
+
covered += buckets.get(b).calls;
|
|
45
|
+
if (covered >= target)
|
|
46
|
+
return upperEdgeOf(b);
|
|
47
|
+
}
|
|
48
|
+
return upperEdgeOf(ascending[ascending.length - 1]);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* An accumulator, fed in the pass a profile already makes.
|
|
52
|
+
*
|
|
53
|
+
* What it holds is bounded by the number of slices times the number of buckets any
|
|
54
|
+
* of them actually touches, not by the size of the log.
|
|
55
|
+
*/
|
|
56
|
+
export function createOutputShapeTracker(options) {
|
|
57
|
+
const { catalogue, on = new Date(), minShare = 0.05 } = options;
|
|
58
|
+
const slices = new Map();
|
|
59
|
+
const add = (record) => {
|
|
60
|
+
const model = catalogue.byId.get(record.model);
|
|
61
|
+
// An unpriced model contributes no dollars anywhere else; a shape drawn from
|
|
62
|
+
// one would be a distribution of a bill that was never computed.
|
|
63
|
+
if (!model)
|
|
64
|
+
return;
|
|
65
|
+
if (record.outputTokens <= 0)
|
|
66
|
+
return;
|
|
67
|
+
const key = `${record.label ?? UNLABELLED}\n${record.model}`;
|
|
68
|
+
let slice = slices.get(key);
|
|
69
|
+
if (!slice) {
|
|
70
|
+
slice = { calls: 0, outputTokens: 0, outputUsd: 0, buckets: new Map() };
|
|
71
|
+
slices.set(key, slice);
|
|
72
|
+
}
|
|
73
|
+
const { outputPerMTok } = effectivePricing(model, on);
|
|
74
|
+
slice.calls += 1;
|
|
75
|
+
slice.outputTokens += record.outputTokens;
|
|
76
|
+
slice.outputUsd += (record.outputTokens / 1_000_000) * outputPerMTok;
|
|
77
|
+
const b = bucketOf(record.outputTokens);
|
|
78
|
+
const cell = slice.buckets.get(b);
|
|
79
|
+
if (cell) {
|
|
80
|
+
cell.calls += 1;
|
|
81
|
+
cell.tokens += record.outputTokens;
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
slice.buckets.set(b, { calls: 1, tokens: record.outputTokens });
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
const finish = (totalUsd) => {
|
|
88
|
+
const out = [];
|
|
89
|
+
for (const [key, slice] of slices) {
|
|
90
|
+
const split = key.indexOf('\n');
|
|
91
|
+
const label = key.slice(0, split);
|
|
92
|
+
const modelId = key.slice(split + 1);
|
|
93
|
+
const model = catalogue.byId.get(modelId);
|
|
94
|
+
if (!model || slice.outputTokens === 0)
|
|
95
|
+
continue;
|
|
96
|
+
const shareOfBill = totalUsd > 0 ? slice.outputUsd / totalUsd : 0;
|
|
97
|
+
if (shareOfBill < minShare)
|
|
98
|
+
continue;
|
|
99
|
+
/**
|
|
100
|
+
* Walk down from the longest answers until half the output spend is
|
|
101
|
+
* covered. Spend is proportional to tokens inside one slice — one model,
|
|
102
|
+
* one rate — so the tokens are the money here and no second accumulator is
|
|
103
|
+
* needed.
|
|
104
|
+
*/
|
|
105
|
+
const target = slice.outputTokens / 2;
|
|
106
|
+
const descending = [...slice.buckets.keys()].sort((a, b) => b - a);
|
|
107
|
+
let tokens = 0;
|
|
108
|
+
let heavyCalls = 0;
|
|
109
|
+
let lastBucket = descending[0];
|
|
110
|
+
for (const b of descending) {
|
|
111
|
+
const cell = slice.buckets.get(b);
|
|
112
|
+
tokens += cell.tokens;
|
|
113
|
+
heavyCalls += cell.calls;
|
|
114
|
+
lastBucket = b;
|
|
115
|
+
if (tokens >= target)
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
out.push({
|
|
119
|
+
label,
|
|
120
|
+
model: modelId,
|
|
121
|
+
modelName: model.displayName,
|
|
122
|
+
calls: slice.calls,
|
|
123
|
+
outputTokens: slice.outputTokens,
|
|
124
|
+
outputUsd: slice.outputUsd,
|
|
125
|
+
aboveTokens: EDGES[lastBucket],
|
|
126
|
+
heavyCalls,
|
|
127
|
+
heavyCallShare: heavyCalls / slice.calls,
|
|
128
|
+
heavySpendShare: tokens / slice.outputTokens,
|
|
129
|
+
shareOfBill,
|
|
130
|
+
medianWithinTokens: ceilingFor(slice.buckets, slice.calls, 0.5),
|
|
131
|
+
p95WithinTokens: ceilingFor(slice.buckets, slice.calls, 0.95),
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
return out.sort((a, b) => b.outputUsd - a.outputUsd);
|
|
135
|
+
};
|
|
136
|
+
return { add, finish };
|
|
137
|
+
}
|
|
138
|
+
/** The same measurement over a list of records, for a caller holding one. */
|
|
139
|
+
export function outputShapes(records, totalUsd, options) {
|
|
140
|
+
const tracker = createOutputShapeTracker(options);
|
|
141
|
+
for (const record of records)
|
|
142
|
+
tracker.add(record);
|
|
143
|
+
return tracker.finish(totalUsd);
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=output-shape.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-shape.js","sourceRoot":"","sources":["../src/output-shape.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,7 +18,7 @@ import type { ModelPricing } from './types.js';
|
|
|
18
18
|
* exists to prevent.
|
|
19
19
|
*/
|
|
20
20
|
export declare const PRICING_OVERLAY_KEYS: readonly ['lastReviewed', 'models'];
|
|
21
|
-
export declare const PRICING_MODEL_KEYS: readonly ['displayName', 'inputPerMTok', 'outputPerMTok', 'contextWindow', 'cacheMinTokens', 'tier', 'capability', 'caching', 'notes', 'promo'];
|
|
21
|
+
export declare const PRICING_MODEL_KEYS: readonly ['displayName', 'inputPerMTok', 'outputPerMTok', 'contextWindow', 'cacheMinTokens', 'tier', 'capability', 'caching', 'notes', 'promo', 'multipliers'];
|
|
22
22
|
/** Largest overlay this will read — a price list, not a dataset. */
|
|
23
23
|
export declare const MAX_PRICING_BYTES: number;
|
|
24
24
|
export interface PricingOverlay {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pricing-overlay.d.ts","sourceRoot":"","sources":["../src/pricing-overlay.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"pricing-overlay.d.ts","sourceRoot":"","sources":["../src/pricing-overlay.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,EAA4C,YAAY,EAAE,MAAM,YAAY,CAAC;AAEzF;;;;;;;;;;;;;;;;GAgBG;AAEH,eAAO,MAAM,oBAAoB,YAAI,cAAc,EAAE,QAAQ,CAAU,CAAC;AAExE,eAAO,MAAM,kBAAkB,YAC7B,aAAa,EACb,cAAc,EACd,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,MAAM,EACN,YAAY,EACZ,SAAS,EACT,OAAO,EACP,OAAO,EACP,aAAa,CACL,CAAC;AAyBX,oEAAoE;AACpE,eAAO,MAAM,iBAAiB,QAAY,CAAC;AAE3C,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB,gDAAgD;IAChD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;CAC3D;AAED,qBAAa,mBAAoB,SAAQ,KAAK;IAG1C,QAAQ,CAAC,MAAM,EAAE,MAAM;IAFzB,YACE,OAAO,EAAE,MAAM,EACN,MAAM,EAAE,MAAM,EAIxB;CACF;AAsLD,kFAAkF;AAClF,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,SAAoB,GAAG,cAAc,CAkC3F;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,gBAAgB,EACtB,OAAO,EAAE,cAAc,EACvB,MAAM,SAAoB,GACzB,gBAAgB,CA6ClB;AAED,2EAA2E;AAC3E,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,SAAoB,GAAG,gBAAgB,CAE9F"}
|
package/dist/pricing-overlay.js
CHANGED
|
@@ -29,8 +29,25 @@ export const PRICING_MODEL_KEYS = [
|
|
|
29
29
|
'caching',
|
|
30
30
|
'notes',
|
|
31
31
|
'promo',
|
|
32
|
+
'multipliers',
|
|
32
33
|
];
|
|
33
34
|
const PROMO_KEYS = ['inputPerMTok', 'outputPerMTok', 'until'];
|
|
35
|
+
/**
|
|
36
|
+
* Cache and batch rates, which an overlay had no way to state — and had to.
|
|
37
|
+
*
|
|
38
|
+
* Without this, a model added through `--pricing` silently inherited Anthropic's
|
|
39
|
+
* multipliers: a cache write at 1.25x input, or 2x at the long TTL. Most
|
|
40
|
+
* providers charge plain input for a write, so `trazum profile` computed a
|
|
41
|
+
* premium that model never charged, accused the workload of a caching loss it
|
|
42
|
+
* could not have, and told the reader to turn caching off. Three documents
|
|
43
|
+
* claimed that could not happen to a provider whose writes cost what input costs,
|
|
44
|
+
* and for an overlay model it was exactly what happened.
|
|
45
|
+
*
|
|
46
|
+
* `batch` accepts `null`, which is not the same as leaving it out: "this provider
|
|
47
|
+
* has no batch API" should stop the advisory offering a discount nobody sells,
|
|
48
|
+
* while "nobody has said" should fall back to the default.
|
|
49
|
+
*/
|
|
50
|
+
const MULTIPLIER_KEYS = ['cacheRead', 'cacheWrite5m', 'cacheWrite1h', 'batch'];
|
|
34
51
|
const TIERS = ['frontier', 'opus', 'sonnet', 'haiku', 'unknown'];
|
|
35
52
|
const CAPABILITIES = ['small', 'mid', 'large', 'frontier', 'unknown'];
|
|
36
53
|
const CACHING_MODES = ['explicit', 'automatic', 'none', 'unknown'];
|
|
@@ -88,6 +105,32 @@ function parsePromo(raw, label, source) {
|
|
|
88
105
|
until: raw.until,
|
|
89
106
|
};
|
|
90
107
|
}
|
|
108
|
+
function parseMultipliers(raw, label, source) {
|
|
109
|
+
if (!isPlainObject(raw)) {
|
|
110
|
+
throw new PricingOverlayError(`"${label}" must be an object`, source);
|
|
111
|
+
}
|
|
112
|
+
rejectUnknownKeys(raw, MULTIPLIER_KEYS, source, `${label}.`);
|
|
113
|
+
if (Object.keys(raw).length === 0) {
|
|
114
|
+
throw new PricingOverlayError(`"${label}" is empty — remove it, or say which rate it changes`, source);
|
|
115
|
+
}
|
|
116
|
+
const multipliers = {};
|
|
117
|
+
for (const key of ['cacheRead', 'cacheWrite5m', 'cacheWrite1h']) {
|
|
118
|
+
if (raw[key] === undefined)
|
|
119
|
+
continue;
|
|
120
|
+
/**
|
|
121
|
+
* Zero is refused along with the negatives. A free cache read is not a price
|
|
122
|
+
* anybody publishes, and admitting one would let an overlay typo turn a real
|
|
123
|
+
* cost into no cost — the flattering direction, and the one this whole file
|
|
124
|
+
* exists to keep out of a report.
|
|
125
|
+
*/
|
|
126
|
+
multipliers[key] = positiveNumber(raw[key], `${label}.${key}`, source);
|
|
127
|
+
}
|
|
128
|
+
if (raw.batch !== undefined) {
|
|
129
|
+
multipliers.batch =
|
|
130
|
+
raw.batch === null ? null : positiveNumber(raw.batch, `${label}.batch`, source);
|
|
131
|
+
}
|
|
132
|
+
return multipliers;
|
|
133
|
+
}
|
|
91
134
|
function parseModel(raw, id, source) {
|
|
92
135
|
if (!isPlainObject(raw)) {
|
|
93
136
|
throw new PricingOverlayError(`"models.${id}" must be an object`, source);
|
|
@@ -150,6 +193,9 @@ function parseModel(raw, id, source) {
|
|
|
150
193
|
// `null` is how you cancel a bundled promotion that has been withdrawn.
|
|
151
194
|
model.promo = raw.promo === null ? undefined : parsePromo(raw.promo, `models.${id}.promo`, source);
|
|
152
195
|
}
|
|
196
|
+
if (raw.multipliers !== undefined) {
|
|
197
|
+
model.multipliers = parseMultipliers(raw.multipliers, `models.${id}.multipliers`, source);
|
|
198
|
+
}
|
|
153
199
|
return model;
|
|
154
200
|
}
|
|
155
201
|
/** Validates an overlay document. Every failure throws, with the source named. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pricing-overlay.js","sourceRoot":"","sources":["../src/pricing-overlay.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pricing-overlay.js","sourceRoot":"","sources":["../src/pricing-overlay.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { PricingCatalogue } from './pricing.js';
|
|
2
|
+
import type { UsageRecord } from './usage.js';
|
|
3
|
+
/**
|
|
4
|
+
* The same request, sent again a moment later.
|
|
5
|
+
*
|
|
6
|
+
* ## The failure mode nothing else here can see
|
|
7
|
+
*
|
|
8
|
+
* A conversation's input **grows with every turn** — that is the finding
|
|
9
|
+
* `conversations` exists for. So two consecutive calls in one conversation
|
|
10
|
+
* carrying *exactly* the same input size, seconds apart, is the shape of
|
|
11
|
+
* something going wrong rather than something working: a retry after a
|
|
12
|
+
* timeout, an agent step repeating because a tool call failed, a loop that
|
|
13
|
+
* re-sends the whole context and gets nowhere.
|
|
14
|
+
*
|
|
15
|
+
* That is expensive in a way a total hides completely. The retried call is
|
|
16
|
+
* billed in full, and on an agent workload the input is the bill.
|
|
17
|
+
* `duplicateLines` catches the same line recorded twice; this catches two
|
|
18
|
+
* *different* calls that sent the same thing.
|
|
19
|
+
*
|
|
20
|
+
* ## What it compares, and why only that
|
|
21
|
+
*
|
|
22
|
+
* Each call is compared to **the one immediately before it in the same
|
|
23
|
+
* session**, and only when the log carries both a session and a clock. Not to
|
|
24
|
+
* every earlier call: a workload that legitimately sends a fixed-size prompt
|
|
25
|
+
* would light up under a looser rule, and holding every size a session has
|
|
26
|
+
* ever sent would grow without bound on a log measured in megabytes. One
|
|
27
|
+
* previous call per session is bounded and is where a retry actually sits.
|
|
28
|
+
*
|
|
29
|
+
* The gap must be **non-negative and under the window** (a minute by default).
|
|
30
|
+
* Non-negative because a log is not guaranteed to be in time order, and a
|
|
31
|
+
* negative gap means the two records arrived out of order rather than that a
|
|
32
|
+
* call repeated.
|
|
33
|
+
*
|
|
34
|
+
* ## What it refuses to conclude
|
|
35
|
+
*
|
|
36
|
+
* It cannot see content, so it cannot tell a retry from two genuinely
|
|
37
|
+
* identical requests a second apart. It reports the count and the money and
|
|
38
|
+
* stops — the same rule `duplicateLines` follows. Every rendering says the
|
|
39
|
+
* pattern is *usually* a retry or a loop, never that it is one.
|
|
40
|
+
*/
|
|
41
|
+
/** Consecutive same-size calls in one conversation, per slice. */
|
|
42
|
+
export interface RepeatedTurns {
|
|
43
|
+
label: string;
|
|
44
|
+
model: string;
|
|
45
|
+
modelName: string;
|
|
46
|
+
/** How many calls repeated the previous call's input size inside the window. */
|
|
47
|
+
repeats: number;
|
|
48
|
+
/** Calls in this slice that could be checked at all — the denominator. */
|
|
49
|
+
checkedCalls: number;
|
|
50
|
+
/** What those repeated calls cost, in full. */
|
|
51
|
+
usd: number;
|
|
52
|
+
/** The window they had to fall inside, in milliseconds. */
|
|
53
|
+
withinMs: number;
|
|
54
|
+
}
|
|
55
|
+
export interface RepeatsOptions {
|
|
56
|
+
catalogue: PricingCatalogue;
|
|
57
|
+
on?: Date;
|
|
58
|
+
/**
|
|
59
|
+
* How close two calls have to be. A minute by default: long enough to cover
|
|
60
|
+
* a timeout and a retry, short enough that an ordinary next turn — which
|
|
61
|
+
* needs a human or a tool to produce it — rarely lands inside it.
|
|
62
|
+
*/
|
|
63
|
+
withinMs?: number;
|
|
64
|
+
/** Slices below this many repeats are dropped. Default 2. */
|
|
65
|
+
minRepeats?: number;
|
|
66
|
+
}
|
|
67
|
+
export interface RepeatsTracker {
|
|
68
|
+
add(record: UsageRecord): void;
|
|
69
|
+
finish(): RepeatedTurns[];
|
|
70
|
+
}
|
|
71
|
+
/** An accumulator, fed in the pass a profile already makes. */
|
|
72
|
+
export declare function createRepeatsTracker(options: RepeatsOptions): RepeatsTracker;
|
|
73
|
+
/** The same measurement over a list of records, for a caller holding one. */
|
|
74
|
+
export declare function repeatedTurns(records: readonly UsageRecord[], options: RepeatsOptions): RepeatedTurns[];
|
|
75
|
+
//# sourceMappingURL=repeats.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repeats.d.ts","sourceRoot":"","sources":["../src/repeats.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,kEAAkE;AAClE,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,OAAO,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,YAAY,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,GAAG,EAAE,MAAM,CAAC;IACZ,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,gBAAgB,CAAC;IAC5B,EAAE,CAAC,EAAE,IAAI,CAAC;IACV;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC/B,MAAM,IAAI,aAAa,EAAE,CAAC;CAC3B;AAQD,+DAA+D;AAC/D,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,cAAc,GAAG,cAAc,CAuE5E;AAED,6EAA6E;AAC7E,wBAAgB,aAAa,CAC3B,OAAO,EAAE,SAAS,WAAW,EAAE,EAC/B,OAAO,EAAE,cAAc,GACtB,aAAa,EAAE,CAIjB"}
|
package/dist/repeats.js
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { effectivePricing, multipliersFor } from './pricing.js';
|
|
2
|
+
import { UNLABELLED } from './usage.js';
|
|
3
|
+
/** An accumulator, fed in the pass a profile already makes. */
|
|
4
|
+
export function createRepeatsTracker(options) {
|
|
5
|
+
const { catalogue, on = new Date(), withinMs = 60_000, minRepeats = 2 } = options;
|
|
6
|
+
const slices = new Map();
|
|
7
|
+
/** The previous call of each session: its input size and when it happened. */
|
|
8
|
+
const previous = new Map();
|
|
9
|
+
const add = (record) => {
|
|
10
|
+
const model = catalogue.byId.get(record.model);
|
|
11
|
+
// An unpriced model has no dollars anywhere else; naming money here that
|
|
12
|
+
// no total contains would be a figure with nothing behind it.
|
|
13
|
+
if (!model)
|
|
14
|
+
return;
|
|
15
|
+
if (record.session === null || record.ts === null)
|
|
16
|
+
return;
|
|
17
|
+
const tokens = record.inputTokens +
|
|
18
|
+
record.cacheReadTokens +
|
|
19
|
+
record.cacheWrite5mTokens +
|
|
20
|
+
record.cacheWrite1hTokens;
|
|
21
|
+
if (tokens <= 0)
|
|
22
|
+
return;
|
|
23
|
+
const key = `${record.label ?? UNLABELLED}\n${record.model}`;
|
|
24
|
+
let slice = slices.get(key);
|
|
25
|
+
if (!slice) {
|
|
26
|
+
slice = { repeats: 0, checkedCalls: 0, usd: 0 };
|
|
27
|
+
slices.set(key, slice);
|
|
28
|
+
}
|
|
29
|
+
slice.checkedCalls += 1;
|
|
30
|
+
const before = previous.get(record.session);
|
|
31
|
+
previous.set(record.session, { tokens, ts: record.ts });
|
|
32
|
+
if (before === undefined)
|
|
33
|
+
return;
|
|
34
|
+
const gap = record.ts - before.ts;
|
|
35
|
+
// Out of order is not a repeat, and neither is a call an hour later.
|
|
36
|
+
if (gap < 0 || gap >= withinMs)
|
|
37
|
+
return;
|
|
38
|
+
if (before.tokens !== tokens)
|
|
39
|
+
return;
|
|
40
|
+
const { inputPerMTok, outputPerMTok } = effectivePricing(model, on);
|
|
41
|
+
const rates = multipliersFor(model);
|
|
42
|
+
const per = (count, rate) => (count / 1_000_000) * rate;
|
|
43
|
+
slice.repeats += 1;
|
|
44
|
+
slice.usd +=
|
|
45
|
+
per(record.inputTokens, inputPerMTok) +
|
|
46
|
+
per(record.cacheReadTokens, inputPerMTok * rates.cacheRead) +
|
|
47
|
+
per(record.cacheWrite5mTokens, inputPerMTok * rates.cacheWrite5m) +
|
|
48
|
+
per(record.cacheWrite1hTokens, inputPerMTok * rates.cacheWrite1h) +
|
|
49
|
+
per(record.outputTokens, outputPerMTok);
|
|
50
|
+
};
|
|
51
|
+
const finish = () => {
|
|
52
|
+
const out = [];
|
|
53
|
+
for (const [key, slice] of slices) {
|
|
54
|
+
if (slice.repeats < minRepeats)
|
|
55
|
+
continue;
|
|
56
|
+
const split = key.indexOf('\n');
|
|
57
|
+
const modelId = key.slice(split + 1);
|
|
58
|
+
const model = catalogue.byId.get(modelId);
|
|
59
|
+
if (!model)
|
|
60
|
+
continue;
|
|
61
|
+
out.push({
|
|
62
|
+
label: key.slice(0, split),
|
|
63
|
+
model: modelId,
|
|
64
|
+
modelName: model.displayName,
|
|
65
|
+
repeats: slice.repeats,
|
|
66
|
+
checkedCalls: slice.checkedCalls,
|
|
67
|
+
usd: slice.usd,
|
|
68
|
+
withinMs,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
return out.sort((a, b) => b.usd - a.usd);
|
|
72
|
+
};
|
|
73
|
+
return { add, finish };
|
|
74
|
+
}
|
|
75
|
+
/** The same measurement over a list of records, for a caller holding one. */
|
|
76
|
+
export function repeatedTurns(records, options) {
|
|
77
|
+
const tracker = createRepeatsTracker(options);
|
|
78
|
+
for (const record of records)
|
|
79
|
+
tracker.add(record);
|
|
80
|
+
return tracker.finish();
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=repeats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repeats.js","sourceRoot":"","sources":["../src/repeats.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import type { PricingCatalogue } from './pricing.js';
|
|
2
|
+
import type { ModelPricing } from './types.js';
|
|
3
|
+
import type { UsageBreakdown, UsageProfileReport } from './usage.js';
|
|
4
|
+
/**
|
|
5
|
+
* The same tokens at another model's rates.
|
|
6
|
+
*
|
|
7
|
+
* ## Why this is allowed to exist
|
|
8
|
+
*
|
|
9
|
+
* `usage.ts` refuses to report a saving, and the reason is that a saving
|
|
10
|
+
* requires imagining a prompt nobody wrote. This does not. Every token here
|
|
11
|
+
* was actually billed; the only thing being changed is the rate card it is
|
|
12
|
+
* multiplied by, which is the same move `cacheEconomics` makes and is
|
|
13
|
+
* arithmetic rather than a guess.
|
|
14
|
+
*
|
|
15
|
+
* What it answers is the question a bill provokes and a total cannot settle:
|
|
16
|
+
* `classify` spent $4,000 on a frontier model — what would those exact calls
|
|
17
|
+
* have cost on the small one? That is a number, and it is the number a routing
|
|
18
|
+
* decision is argued over.
|
|
19
|
+
*
|
|
20
|
+
* ## The four things it refuses
|
|
21
|
+
*
|
|
22
|
+
* **It says nothing about whether the answers would be as good.** This is
|
|
23
|
+
* multiplication. Whether the cheap model can do the work is a question about
|
|
24
|
+
* the work, and Trazum has never seen the prompts — by design, there is nowhere
|
|
25
|
+
* in a usage record to put one. Every rendering states this next to the figure,
|
|
26
|
+
* because a dollar number with no caveat attached reads as a recommendation.
|
|
27
|
+
*
|
|
28
|
+
* **It refuses to price traffic that would not fit.** A cheaper model with a
|
|
29
|
+
* smaller context window does not make a 400k-token call cheaper; it makes it
|
|
30
|
+
* impossible. Slices holding a call larger than the target's window are pulled
|
|
31
|
+
* out into `overContext` and their money is excluded from every total here —
|
|
32
|
+
* counting an impossible call's price difference as a saving is exactly the
|
|
33
|
+
* flattering direction this repository refuses. `maxCallInputTokens` is the
|
|
34
|
+
* maximum rather than an average for the same reason: one call over the ceiling
|
|
35
|
+
* is a failed call, and a mean hides it.
|
|
36
|
+
*
|
|
37
|
+
* **It excludes what is already there.** Calls billed on the target model
|
|
38
|
+
* reprice to themselves, and folding them in would pad both totals with money
|
|
39
|
+
* that cannot move — a $10,000 bill of which $9,900 is already on the cheap
|
|
40
|
+
* model would report a 1% difference and read as "not worth doing". They are
|
|
41
|
+
* counted in `alreadyOnTarget` instead, so the reader sees the shape.
|
|
42
|
+
*
|
|
43
|
+
* **It assumes the token counts survive the move, and says so.** A different
|
|
44
|
+
* model tokenizes differently, and one that is worse at the task may answer at
|
|
45
|
+
* greater length or be retried. The counts are the ones that were billed, not a
|
|
46
|
+
* prediction; that makes this an exact restatement of the past at another price
|
|
47
|
+
* and an approximation of the future. Stated, not hidden — `sameTokensAssumed`
|
|
48
|
+
* exists so no rendering can forget to say it.
|
|
49
|
+
*
|
|
50
|
+
* ## Why the write TTLs are kept apart
|
|
51
|
+
*
|
|
52
|
+
* A cache write costs 1.25x input at five minutes and 2x at an hour, and that
|
|
53
|
+
* ratio is not a constant across providers. Repricing a combined write total
|
|
54
|
+
* would mean picking one of the two rates for tokens that were billed at both,
|
|
55
|
+
* so `UsageBreakdown` carries the split and this reads it. Writes whose TTL the
|
|
56
|
+
* log never stated are in the 5-minute bucket, the same assumption
|
|
57
|
+
* `cacheWriteUsdIfAssumed1h` prices — `assumedWriteTtlCalls` is carried through
|
|
58
|
+
* so a reader knows the comparison inherits it.
|
|
59
|
+
*/
|
|
60
|
+
/** One label-and-model slice, as billed and as it would have been billed. */
|
|
61
|
+
export interface RepricedSlice {
|
|
62
|
+
label: string;
|
|
63
|
+
/** The model these calls were actually billed on. */
|
|
64
|
+
model: string;
|
|
65
|
+
calls: number;
|
|
66
|
+
/** What the log says this slice cost. */
|
|
67
|
+
currentUsd: number;
|
|
68
|
+
/** What the same tokens cost at the target's rates. */
|
|
69
|
+
targetUsd: number;
|
|
70
|
+
/** `targetUsd - currentUsd`. Negative is cheaper on the target. */
|
|
71
|
+
deltaUsd: number;
|
|
72
|
+
/** The slice's largest single call, cache reads and writes included. */
|
|
73
|
+
maxCallInputTokens: number;
|
|
74
|
+
}
|
|
75
|
+
/** A slice holding a call the target model could not have accepted. */
|
|
76
|
+
export interface OverContextSlice {
|
|
77
|
+
label: string;
|
|
78
|
+
model: string;
|
|
79
|
+
calls: number;
|
|
80
|
+
currentUsd: number;
|
|
81
|
+
/** The call that does not fit, in tokens. */
|
|
82
|
+
maxCallInputTokens: number;
|
|
83
|
+
}
|
|
84
|
+
export interface RepriceReport {
|
|
85
|
+
target: {
|
|
86
|
+
id: string;
|
|
87
|
+
displayName: string;
|
|
88
|
+
/** The ceiling `overContext` was judged against. */
|
|
89
|
+
contextWindow: number;
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* Slices that could move, largest saving first. Ties break on the larger
|
|
93
|
+
* bill, so the row somebody would act on comes first.
|
|
94
|
+
*/
|
|
95
|
+
slices: RepricedSlice[];
|
|
96
|
+
/** Totals over `slices` only — the money that would actually change hands. */
|
|
97
|
+
currentUsd: number;
|
|
98
|
+
targetUsd: number;
|
|
99
|
+
deltaUsd: number;
|
|
100
|
+
/**
|
|
101
|
+
* Slices excluded because at least one of their calls is larger than the
|
|
102
|
+
* target's context window. Their money is in none of the totals above.
|
|
103
|
+
*/
|
|
104
|
+
overContext: OverContextSlice[];
|
|
105
|
+
/** Calls already billed on the target, and what they cost. Not repriced. */
|
|
106
|
+
alreadyOnTarget: {
|
|
107
|
+
calls: number;
|
|
108
|
+
usd: number;
|
|
109
|
+
};
|
|
110
|
+
/**
|
|
111
|
+
* Repriced calls whose write TTL the log did not state. Non-zero means both
|
|
112
|
+
* sides of the comparison rest on the cheaper assumption.
|
|
113
|
+
*/
|
|
114
|
+
assumedWriteTtlCalls: number;
|
|
115
|
+
/**
|
|
116
|
+
* Models in the log the catalogue could not price, and how many calls they
|
|
117
|
+
* made. Their tokens could be priced on the target, but the difference
|
|
118
|
+
* cannot be — there is no current figure to subtract from. Named rather
|
|
119
|
+
* than dropped, so a comparison covering half a bill cannot look complete.
|
|
120
|
+
*/
|
|
121
|
+
unpricedModels: string[];
|
|
122
|
+
unpricedCalls: number;
|
|
123
|
+
/** Always true. A field, not a comment, so a rendering can print it. */
|
|
124
|
+
sameTokensAssumed: true;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* What a set of token counts costs on one model, at the rates in force on a
|
|
128
|
+
* date.
|
|
129
|
+
*
|
|
130
|
+
* The same arithmetic `profileUsage` does per call, over an aggregate — which
|
|
131
|
+
* is only sound because every token class is priced independently of the
|
|
132
|
+
* others and of how many calls produced them.
|
|
133
|
+
*/
|
|
134
|
+
export declare function priceTokensOn(breakdown: Pick<UsageBreakdown, 'inputTokens' | 'cacheReadTokens' | 'cacheWrite5mTokens' | 'cacheWrite1hTokens' | 'outputTokens'>, model: ModelPricing, on?: Date): number;
|
|
135
|
+
/**
|
|
136
|
+
* Reprices a profile's label-and-model slices onto one target model.
|
|
137
|
+
*
|
|
138
|
+
* Returns `null` when the catalogue does not know the target: a comparison
|
|
139
|
+
* against a price nobody has is worse than no comparison, and the caller is
|
|
140
|
+
* better placed to say so in its own words than this is to invent a zero.
|
|
141
|
+
*/
|
|
142
|
+
export declare function repriceProfile(report: UsageProfileReport, targetId: string, catalogue: PricingCatalogue, on?: Date): RepriceReport | null;
|
|
143
|
+
//# sourceMappingURL=reprice.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reprice.d.ts","sourceRoot":"","sources":["../src/reprice.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AAEH,6EAA6E;AAC7E,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,SAAS,EAAE,MAAM,CAAC;IAClB,mEAAmE;IACnE,QAAQ,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,uEAAuE;AACvE,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE;QACN,EAAE,EAAE,MAAM,CAAC;QACX,WAAW,EAAE,MAAM,CAAC;QACpB,oDAAoD;QACpD,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IACF;;;OAGG;IACH,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,8EAA8E;IAC9E,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAChC,4EAA4E;IAC5E,eAAe,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAChD;;;OAGG;IACH,oBAAoB,EAAE,MAAM,CAAC;IAC7B;;;;;OAKG;IACH,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,wEAAwE;IACxE,iBAAiB,EAAE,IAAI,CAAC;CACzB;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,IAAI,CACb,cAAc,EACd,aAAa,GAAG,iBAAiB,GAAG,oBAAoB,GAAG,oBAAoB,GAAG,cAAc,CACjG,EACD,KAAK,EAAE,YAAY,EACnB,EAAE,GAAE,IAAiB,GACpB,MAAM,CAWR;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,kBAAkB,EAC1B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,gBAAgB,EAC3B,EAAE,GAAE,IAAiB,GACpB,aAAa,GAAG,IAAI,CA0DtB"}
|