@amalgm/chat 0.1.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/PURPOSE.md +107 -0
- package/README.md +41 -0
- package/dist/contract/chat-input.d.ts +144 -0
- package/dist/contract/chat-input.d.ts.map +1 -0
- package/dist/contract/chat-input.js +261 -0
- package/dist/contract/chat-input.js.map +1 -0
- package/dist/contract/create.d.ts +191 -0
- package/dist/contract/create.d.ts.map +1 -0
- package/dist/contract/create.js +249 -0
- package/dist/contract/create.js.map +1 -0
- package/dist/contract/freeze.d.ts +85 -0
- package/dist/contract/freeze.d.ts.map +1 -0
- package/dist/contract/freeze.js +151 -0
- package/dist/contract/freeze.js.map +1 -0
- package/dist/contract/harnesses.d.ts +21 -0
- package/dist/contract/harnesses.d.ts.map +1 -0
- package/dist/contract/harnesses.js +39 -0
- package/dist/contract/harnesses.js.map +1 -0
- package/dist/contract/index.d.ts +17 -0
- package/dist/contract/index.d.ts.map +1 -0
- package/dist/contract/index.js +17 -0
- package/dist/contract/index.js.map +1 -0
- package/dist/contract/input.d.ts +45 -0
- package/dist/contract/input.d.ts.map +1 -0
- package/dist/contract/input.js +78 -0
- package/dist/contract/input.js.map +1 -0
- package/dist/contract/models.d.ts +57 -0
- package/dist/contract/models.d.ts.map +1 -0
- package/dist/contract/models.js +380 -0
- package/dist/contract/models.js.map +1 -0
- package/dist/contract/payload-merge.d.ts +76 -0
- package/dist/contract/payload-merge.d.ts.map +1 -0
- package/dist/contract/payload-merge.js +215 -0
- package/dist/contract/payload-merge.js.map +1 -0
- package/dist/events/constructors.d.ts +53 -0
- package/dist/events/constructors.d.ts.map +1 -0
- package/dist/events/constructors.js +217 -0
- package/dist/events/constructors.js.map +1 -0
- package/dist/events/index.d.ts +12 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +12 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/schema.d.ts +455 -0
- package/dist/events/schema.d.ts.map +1 -0
- package/dist/events/schema.js +228 -0
- package/dist/events/schema.js.map +1 -0
- package/dist/events/tool-display.d.ts +22 -0
- package/dist/events/tool-display.d.ts.map +1 -0
- package/dist/events/tool-display.js +60 -0
- package/dist/events/tool-display.js.map +1 -0
- package/dist/events/tool-shape.d.ts +48 -0
- package/dist/events/tool-shape.d.ts.map +1 -0
- package/dist/events/tool-shape.js +225 -0
- package/dist/events/tool-shape.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/normalizers/claude.d.ts +628 -0
- package/dist/normalizers/claude.d.ts.map +1 -0
- package/dist/normalizers/claude.js +603 -0
- package/dist/normalizers/claude.js.map +1 -0
- package/dist/normalizers/codex.d.ts +352 -0
- package/dist/normalizers/codex.d.ts.map +1 -0
- package/dist/normalizers/codex.js +485 -0
- package/dist/normalizers/codex.js.map +1 -0
- package/dist/normalizers/cursor.d.ts +34 -0
- package/dist/normalizers/cursor.d.ts.map +1 -0
- package/dist/normalizers/cursor.js +197 -0
- package/dist/normalizers/cursor.js.map +1 -0
- package/dist/normalizers/index.d.ts +13 -0
- package/dist/normalizers/index.d.ts.map +1 -0
- package/dist/normalizers/index.js +13 -0
- package/dist/normalizers/index.js.map +1 -0
- package/dist/normalizers/opencode.d.ts +81 -0
- package/dist/normalizers/opencode.d.ts.map +1 -0
- package/dist/normalizers/opencode.js +640 -0
- package/dist/normalizers/opencode.js.map +1 -0
- package/dist/normalizers/pi.d.ts +28 -0
- package/dist/normalizers/pi.d.ts.map +1 -0
- package/dist/normalizers/pi.js +160 -0
- package/dist/normalizers/pi.js.map +1 -0
- package/dist/ports.d.ts +14 -0
- package/dist/ports.d.ts.map +1 -0
- package/dist/ports.js +7 -0
- package/dist/ports.js.map +1 -0
- package/dist/transcript/index.d.ts +14 -0
- package/dist/transcript/index.d.ts.map +1 -0
- package/dist/transcript/index.js +12 -0
- package/dist/transcript/index.js.map +1 -0
- package/dist/transcript/message-reducer.d.ts +167 -0
- package/dist/transcript/message-reducer.d.ts.map +1 -0
- package/dist/transcript/message-reducer.js +400 -0
- package/dist/transcript/message-reducer.js.map +1 -0
- package/dist/transcript/part-accumulator.d.ts +24 -0
- package/dist/transcript/part-accumulator.d.ts.map +1 -0
- package/dist/transcript/part-accumulator.js +30 -0
- package/dist/transcript/part-accumulator.js.map +1 -0
- package/dist/transcript/tool-display.d.ts +14 -0
- package/dist/transcript/tool-display.d.ts.map +1 -0
- package/dist/transcript/tool-display.js +125 -0
- package/dist/transcript/tool-display.js.map +1 -0
- package/dist/transcript/tool-shape.d.ts +34 -0
- package/dist/transcript/tool-shape.d.ts.map +1 -0
- package/dist/transcript/tool-shape.js +216 -0
- package/dist/transcript/tool-shape.js.map +1 -0
- package/dist/turns/index.d.ts +11 -0
- package/dist/turns/index.d.ts.map +1 -0
- package/dist/turns/index.js +11 -0
- package/dist/turns/index.js.map +1 -0
- package/dist/turns/queries.d.ts +36 -0
- package/dist/turns/queries.d.ts.map +1 -0
- package/dist/turns/queries.js +37 -0
- package/dist/turns/queries.js.map +1 -0
- package/dist/turns/replay.d.ts +105 -0
- package/dist/turns/replay.d.ts.map +1 -0
- package/dist/turns/replay.js +163 -0
- package/dist/turns/replay.js.map +1 -0
- package/dist/turns/status.d.ts +49 -0
- package/dist/turns/status.d.ts.map +1 -0
- package/dist/turns/status.js +56 -0
- package/dist/turns/status.js.map +1 -0
- package/dist/turns/turn-store.d.ts +109 -0
- package/dist/turns/turn-store.d.ts.map +1 -0
- package/dist/turns/turn-store.js +169 -0
- package/dist/turns/turn-store.js.map +1 -0
- package/dist/usage/finalize.d.ts +57 -0
- package/dist/usage/finalize.d.ts.map +1 -0
- package/dist/usage/finalize.js +139 -0
- package/dist/usage/finalize.js.map +1 -0
- package/dist/usage/index.d.ts +11 -0
- package/dist/usage/index.d.ts.map +1 -0
- package/dist/usage/index.js +11 -0
- package/dist/usage/index.js.map +1 -0
- package/dist/usage/model-catalog.d.ts +50 -0
- package/dist/usage/model-catalog.d.ts.map +1 -0
- package/dist/usage/model-catalog.js +344 -0
- package/dist/usage/model-catalog.js.map +1 -0
- package/dist/usage/normalize.d.ts +103 -0
- package/dist/usage/normalize.d.ts.map +1 -0
- package/dist/usage/normalize.js +71 -0
- package/dist/usage/normalize.js.map +1 -0
- package/dist/usage/ports.d.ts +141 -0
- package/dist/usage/ports.d.ts.map +1 -0
- package/dist/usage/ports.js +113 -0
- package/dist/usage/ports.js.map +1 -0
- package/dist/usage/tokens.d.ts +79 -0
- package/dist/usage/tokens.d.ts.map +1 -0
- package/dist/usage/tokens.js +98 -0
- package/dist/usage/tokens.js.map +1 -0
- package/dist/warm/client-cache.d.ts +47 -0
- package/dist/warm/client-cache.d.ts.map +1 -0
- package/dist/warm/client-cache.js +48 -0
- package/dist/warm/client-cache.js.map +1 -0
- package/dist/warm/envelope-cache.d.ts +79 -0
- package/dist/warm/envelope-cache.d.ts.map +1 -0
- package/dist/warm/envelope-cache.js +85 -0
- package/dist/warm/envelope-cache.js.map +1 -0
- package/dist/warm/index.d.ts +16 -0
- package/dist/warm/index.d.ts.map +1 -0
- package/dist/warm/index.js +11 -0
- package/dist/warm/index.js.map +1 -0
- package/dist/warm/payload.d.ts +137 -0
- package/dist/warm/payload.d.ts.map +1 -0
- package/dist/warm/payload.js +112 -0
- package/dist/warm/payload.js.map +1 -0
- package/dist/warm/revision.d.ts +70 -0
- package/dist/warm/revision.d.ts.map +1 -0
- package/dist/warm/revision.js +63 -0
- package/dist/warm/revision.js.map +1 -0
- package/dist/warm/store-policy.d.ts +57 -0
- package/dist/warm/store-policy.d.ts.map +1 -0
- package/dist/warm/store-policy.js +89 -0
- package/dist/warm/store-policy.js.map +1 -0
- package/dist/wire/frames.d.ts +208 -0
- package/dist/wire/frames.d.ts.map +1 -0
- package/dist/wire/frames.js +245 -0
- package/dist/wire/frames.js.map +1 -0
- package/dist/wire/index.d.ts +7 -0
- package/dist/wire/index.d.ts.map +1 -0
- package/dist/wire/index.js +7 -0
- package/dist/wire/index.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Turn-usage finalization — engine `chat-core/usage.js:208-323`, ported
|
|
3
|
+
* byte-exact. A turn accumulates per-step usage records; finalization
|
|
4
|
+
* collapses them into the single record that gets billed:
|
|
5
|
+
*
|
|
6
|
+
* - pi: sum of exact billable steps, native provider USD cost preserved.
|
|
7
|
+
* - codex: cumulative-meter delta (last cumulative − first baseline,
|
|
8
|
+
* clamped per bucket so compaction resets never go negative), falling
|
|
9
|
+
* back to summing exact steps.
|
|
10
|
+
* - everyone else: prefer an exact `chat_turn` record, else sum the exact
|
|
11
|
+
* billable steps.
|
|
12
|
+
*/
|
|
13
|
+
import { addTokenLists, hasTokenListBuckets, normalizeTokenList, subtractTokenLists, zeroTokenList, } from './tokens.js';
|
|
14
|
+
import { normalizeUsage } from './normalize.js';
|
|
15
|
+
/**
|
|
16
|
+
* Engine `usageFromTokenList()`: promote a token list to an exact,
|
|
17
|
+
* billable `chat_turn` usage record.
|
|
18
|
+
*/
|
|
19
|
+
export function usageFromTokenList(tokenList, base = {}) {
|
|
20
|
+
const normalized = normalizeTokenList({ tokenList });
|
|
21
|
+
return normalizeUsage({
|
|
22
|
+
...base,
|
|
23
|
+
tokenList: normalized,
|
|
24
|
+
inputTokens: normalized.input,
|
|
25
|
+
outputTokens: normalized.output,
|
|
26
|
+
cacheReadTokens: normalized.cacheRead,
|
|
27
|
+
cacheWriteTokens: normalized.cacheWrite,
|
|
28
|
+
thoughtTokens: normalized.thought,
|
|
29
|
+
inputContextSize: base.inputContextSize ?? normalized.total,
|
|
30
|
+
operation: 'chat_turn',
|
|
31
|
+
billable: true,
|
|
32
|
+
exact: true,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Engine `summedTurnUsage()`: bucket-wise sum of the records' token lists,
|
|
37
|
+
* or null when the sum carries no tokens.
|
|
38
|
+
*/
|
|
39
|
+
export function summedTurnUsage(records, base = {}) {
|
|
40
|
+
const sum = records.reduce((acc, entry) => addTokenLists(acc, entry.tokenList), zeroTokenList());
|
|
41
|
+
if (!hasTokenListBuckets(sum) || sum.total <= 0)
|
|
42
|
+
return null;
|
|
43
|
+
return usageFromTokenList(sum, {
|
|
44
|
+
...base,
|
|
45
|
+
source: base.source || 'turn_sum',
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Engine `codexTurnUsage()`: codex reports a cumulative meter per step.
|
|
50
|
+
* The turn's usage is `last cumulative − first record's baseline`
|
|
51
|
+
* (`previousCumulativeTokenList`, else zero), subtracted with per-bucket
|
|
52
|
+
* clamping so a meter reset across compaction never yields negative
|
|
53
|
+
* deltas. When no cumulative meter exists (or the delta is empty), fall
|
|
54
|
+
* back to summing exact step records.
|
|
55
|
+
*/
|
|
56
|
+
function codexTurnUsage(records, base = {}) {
|
|
57
|
+
const cumulativeRecords = records.filter((entry) => (entry?.cumulativeTokenList
|
|
58
|
+
&& hasTokenListBuckets(entry.cumulativeTokenList)
|
|
59
|
+
&& entry.cumulativeTokenList.total > 0));
|
|
60
|
+
if (cumulativeRecords.length > 0) {
|
|
61
|
+
const first = cumulativeRecords[0];
|
|
62
|
+
const last = cumulativeRecords[cumulativeRecords.length - 1];
|
|
63
|
+
const baseline = first.previousCumulativeTokenList && hasTokenListBuckets(first.previousCumulativeTokenList)
|
|
64
|
+
? first.previousCumulativeTokenList
|
|
65
|
+
: zeroTokenList();
|
|
66
|
+
const delta = subtractTokenLists(last.cumulativeTokenList, baseline);
|
|
67
|
+
if (delta.total > 0) {
|
|
68
|
+
return usageFromTokenList(delta, {
|
|
69
|
+
...base,
|
|
70
|
+
inputContextSize: last.inputContextSize,
|
|
71
|
+
contextLimit: last.contextLimit,
|
|
72
|
+
totalProcessedTokens: last.cumulativeTokenList.total,
|
|
73
|
+
source: 'codex_app_server_turn_delta',
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return summedTurnUsage(records.filter((entry) => entry.exact === true), {
|
|
78
|
+
...base,
|
|
79
|
+
source: 'codex_app_server_step_sum',
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
/** Engine `finalizeTurnUsage()`, byte-exact. Null = nothing billable. */
|
|
83
|
+
export function finalizeTurnUsage({ contract, usage, usageRecords } = {}) {
|
|
84
|
+
const records = Array.isArray(usageRecords) && usageRecords.length > 0
|
|
85
|
+
? usageRecords
|
|
86
|
+
: usage
|
|
87
|
+
? [usage]
|
|
88
|
+
: [];
|
|
89
|
+
if (contract?.harness === 'pi') {
|
|
90
|
+
// Pi reports exact per-message usage including native USD cost; a turn is
|
|
91
|
+
// the sum of its assistant messages, and the summed provider cost survives
|
|
92
|
+
// into the turn record instead of being re-derived from the catalog.
|
|
93
|
+
const exactRecords = records.filter((entry) => entry?.exact === true && entry.billable !== false);
|
|
94
|
+
const summed = summedTurnUsage(exactRecords, {
|
|
95
|
+
contextLimit: usage?.contextLimit,
|
|
96
|
+
inputContextSize: usage?.inputContextSize,
|
|
97
|
+
source: 'pi_rpc_step_sum',
|
|
98
|
+
});
|
|
99
|
+
if (summed) {
|
|
100
|
+
const costUsd = exactRecords.reduce((total, entry) => {
|
|
101
|
+
const cost = Number(entry.costUsd);
|
|
102
|
+
return Number.isFinite(cost) ? (total ?? 0) + cost : total;
|
|
103
|
+
}, null);
|
|
104
|
+
return { ...summed, costUsd, marketCostUsd: costUsd ?? summed.marketCostUsd };
|
|
105
|
+
}
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
if (contract?.harness === 'codex') {
|
|
109
|
+
const codexUsage = codexTurnUsage(records, {
|
|
110
|
+
contextLimit: usage?.contextLimit,
|
|
111
|
+
inputContextSize: usage?.inputContextSize,
|
|
112
|
+
costUsd: null,
|
|
113
|
+
marketCostUsd: null,
|
|
114
|
+
});
|
|
115
|
+
if (codexUsage)
|
|
116
|
+
return codexUsage;
|
|
117
|
+
}
|
|
118
|
+
const billableRecords = records.filter((entry) => entry && entry.billable !== false);
|
|
119
|
+
if (billableRecords.length === 0)
|
|
120
|
+
return null;
|
|
121
|
+
const base = {
|
|
122
|
+
contextLimit: usage?.contextLimit,
|
|
123
|
+
inputContextSize: usage?.inputContextSize,
|
|
124
|
+
costUsd: null,
|
|
125
|
+
marketCostUsd: null,
|
|
126
|
+
};
|
|
127
|
+
const exactTurnRecord = billableRecords.find((entry) => (entry.exact === true && entry.operation === 'chat_turn' && (entry.tokenList?.total ?? 0) > 0));
|
|
128
|
+
if (exactTurnRecord) {
|
|
129
|
+
return usageFromTokenList(exactTurnRecord.tokenList, {
|
|
130
|
+
...base,
|
|
131
|
+
inputContextSize: exactTurnRecord.inputContextSize,
|
|
132
|
+
contextLimit: exactTurnRecord.contextLimit,
|
|
133
|
+
totalProcessedTokens: exactTurnRecord.totalProcessedTokens,
|
|
134
|
+
source: exactTurnRecord.source || 'native_chat_turn',
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
return summedTurnUsage(billableRecords.filter((entry) => entry.exact === true), base);
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=finalize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finalize.js","sourceRoot":"","sources":["../../src/usage/finalize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @amalgm/chat usage module — the usage/billing law, ported byte-exact
|
|
3
|
+
* from engine `chat-core/usage.js` + `chat-server/model-catalog.js`
|
|
4
|
+
* (+ the `usage_logs` row shape from `chat-server/db.js`).
|
|
5
|
+
*/
|
|
6
|
+
export { n, nonNegativeOrNull, normalizeTokenList, hasTokenListBuckets, zeroTokenList, addTokenLists, subtractTokenLists, totalUsageTokens, type TokenList, type TokenListInput, type UsageLike, } from './tokens.js';
|
|
7
|
+
export { positiveOrNull, normalizeUsage, providerFromModel, type UsageInput, type NormalizedUsage, } from './normalize.js';
|
|
8
|
+
export { usageFromTokenList, summedTurnUsage, finalizeTurnUsage, type UsageContract, type TurnUsageRecord, type FinalizeTurnUsageArgs, } from './finalize.js';
|
|
9
|
+
export { decideBeginProxyTurn, decideTurnUsageLog, buildUsageLogRow, type BeginProxyTurnBody, type BeginProxyTurnDecision, type BillingPort, type UsageLogPayload, type UsageLogRow, type UsageLogPort, type TurnUsageLogDecision, type DecideTurnUsageLogArgs, } from './ports.js';
|
|
10
|
+
export { MODEL_CATALOG, getModel, calculateCost, getModelsByProvider, getProviders, type CatalogModel, } from './model-catalog.js';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/usage/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,CAAC,EACD,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,SAAS,GACf,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,KAAK,UAAU,EACf,KAAK,eAAe,GACrB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,qBAAqB,GAC3B,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,EAC3B,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,GAC5B,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,aAAa,EACb,QAAQ,EACR,aAAa,EACb,mBAAmB,EACnB,YAAY,EACZ,KAAK,YAAY,GAClB,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @amalgm/chat usage module — the usage/billing law, ported byte-exact
|
|
3
|
+
* from engine `chat-core/usage.js` + `chat-server/model-catalog.js`
|
|
4
|
+
* (+ the `usage_logs` row shape from `chat-server/db.js`).
|
|
5
|
+
*/
|
|
6
|
+
export { n, nonNegativeOrNull, normalizeTokenList, hasTokenListBuckets, zeroTokenList, addTokenLists, subtractTokenLists, totalUsageTokens, } from './tokens.js';
|
|
7
|
+
export { positiveOrNull, normalizeUsage, providerFromModel, } from './normalize.js';
|
|
8
|
+
export { usageFromTokenList, summedTurnUsage, finalizeTurnUsage, } from './finalize.js';
|
|
9
|
+
export { decideBeginProxyTurn, decideTurnUsageLog, buildUsageLogRow, } from './ports.js';
|
|
10
|
+
export { MODEL_CATALOG, getModel, calculateCost, getModelsByProvider, getProviders, } from './model-catalog.js';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/usage/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,CAAC,EACD,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,gBAAgB,GAIjB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,cAAc,EACd,cAAc,EACd,iBAAiB,GAGlB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,iBAAiB,GAIlB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,GASjB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,aAAa,EACb,QAAQ,EACR,aAAa,EACb,mBAAmB,EACnB,YAAY,GAEb,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model catalog — engine `chat-server/model-catalog.js`, ported byte-exact.
|
|
3
|
+
*
|
|
4
|
+
* Complete pricing & specs for all Vercel AI Gateway language models,
|
|
5
|
+
* auto-generated upstream from https://ai-gateway.vercel.sh/v1/models on
|
|
6
|
+
* 2026-05-07. 197 language models across 23 providers (Opus 1M variants
|
|
7
|
+
* split out). Pricing is per 1M tokens (USD). `null` = not
|
|
8
|
+
* available/applicable — never zero (a pricing miss must surface as
|
|
9
|
+
* `null`, not a free model).
|
|
10
|
+
*
|
|
11
|
+
* The `MODEL_CATALOG` entries and `MODEL_ALIASES` map below are copied
|
|
12
|
+
* verbatim from the engine source; do not hand-edit rates here.
|
|
13
|
+
*/
|
|
14
|
+
/** One catalog entry. Prices are USD per 1M tokens; `null` = not offered. */
|
|
15
|
+
export interface CatalogModel {
|
|
16
|
+
id: string;
|
|
17
|
+
name: string;
|
|
18
|
+
provider: string;
|
|
19
|
+
contextWindow: number;
|
|
20
|
+
maxOutput: number;
|
|
21
|
+
inputPrice: number | null;
|
|
22
|
+
outputPrice: number | null;
|
|
23
|
+
cacheRead: number | null;
|
|
24
|
+
cacheWrite: number | null;
|
|
25
|
+
tags: string[];
|
|
26
|
+
released: string | null;
|
|
27
|
+
}
|
|
28
|
+
export declare const MODEL_CATALOG: readonly CatalogModel[];
|
|
29
|
+
/**
|
|
30
|
+
* Find model by exact ID or fuzzy match (strips provider prefix, date
|
|
31
|
+
* suffixes, normalizes `-4-6` → `-4.6`). Engine `getModel`, byte-exact.
|
|
32
|
+
*/
|
|
33
|
+
export declare function getModel(modelId: string | null | undefined): CatalogModel | null;
|
|
34
|
+
/**
|
|
35
|
+
* Calculate cost in USD for a given model and token counts, rounded to 6
|
|
36
|
+
* decimal places. Engine `calculateCost`, byte-exact.
|
|
37
|
+
*
|
|
38
|
+
* - `inputTokens` = non-cached input tokens (charged at inputPrice)
|
|
39
|
+
* - `cacheReadTokens` = tokens served from cache (charged at cacheRead price)
|
|
40
|
+
* - `cacheWriteTokens` = tokens written to cache (charged at cacheWrite price)
|
|
41
|
+
*
|
|
42
|
+
* Returns `null` (never zero) when the model is not in the catalog —
|
|
43
|
+
* a pricing miss is not a free turn.
|
|
44
|
+
*/
|
|
45
|
+
export declare function calculateCost(modelId: string | null | undefined, inputTokens: number, outputTokens: number, cacheReadTokens?: number, cacheWriteTokens?: number): number | null;
|
|
46
|
+
/** Get all models for a provider. */
|
|
47
|
+
export declare function getModelsByProvider(provider: string): CatalogModel[];
|
|
48
|
+
/** Get list of all providers. */
|
|
49
|
+
export declare function getProviders(): string[];
|
|
50
|
+
//# sourceMappingURL=model-catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-catalog.d.ts","sourceRoot":"","sources":["../../src/usage/model-catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,6EAA6E;AAC7E,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,eAAO,MAAM,aAAa,EAAE,SAAS,YAAY,EAoOhD,CAAC;AAwBF;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,YAAY,GAAG,IAAI,CAuChF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAClC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,eAAe,SAAI,EACnB,gBAAgB,SAAI,GACnB,MAAM,GAAG,IAAI,CAef;AAED,qCAAqC;AACrC,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,EAAE,CAEpE;AAED,iCAAiC;AACjC,wBAAgB,YAAY,IAAI,MAAM,EAAE,CAEvC"}
|