@tokenbuddy/tokenbuddy 1.0.31 → 1.0.34
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/src/buyer-store.d.ts +26 -0
- package/dist/src/buyer-store.d.ts.map +1 -1
- package/dist/src/buyer-store.js +61 -8
- package/dist/src/buyer-store.js.map +1 -1
- package/dist/src/daemon.d.ts +24 -0
- package/dist/src/daemon.d.ts.map +1 -1
- package/dist/src/daemon.js +1259 -9
- package/dist/src/daemon.js.map +1 -1
- package/dist/src/doctor-diagnostics.d.ts +12 -0
- package/dist/src/doctor-diagnostics.d.ts.map +1 -1
- package/dist/src/doctor-diagnostics.js +71 -2
- package/dist/src/doctor-diagnostics.js.map +1 -1
- package/dist/src/prewarm-cache.js +4 -1
- package/dist/src/prewarm-cache.js.map +1 -1
- package/dist/src/provider-routing-config.d.ts +91 -0
- package/dist/src/provider-routing-config.d.ts.map +1 -0
- package/dist/src/provider-routing-config.js +292 -0
- package/dist/src/provider-routing-config.js.map +1 -0
- package/package.json +1 -1
- package/src/buyer-store.ts +113 -8
- package/src/daemon.ts +1389 -16
- package/src/doctor-diagnostics.ts +100 -1
- package/src/prewarm-cache.ts +5 -1
- package/src/provider-routing-config.ts +410 -0
- package/static/ui/assets/index-0MVXD7bH.css +1 -0
- package/static/ui/assets/index-Mt3BZFuP.js +266 -0
- package/static/ui/assets/index-Mt3BZFuP.js.map +1 -0
- package/static/ui/icons/apple-touch-icon.png +0 -0
- package/static/ui/icons/tokenbuddy-192.png +0 -0
- package/static/ui/icons/tokenbuddy-512.png +0 -0
- package/static/ui/icons/tokenbuddy.svg +6 -0
- package/static/ui/index.html +3 -2
- package/static/ui/tool-logos/cc-switch.png +0 -0
- package/static/ui/tool-logos/claude.svg +1 -0
- package/static/ui/tool-logos/cline.svg +1 -0
- package/static/ui/tool-logos/codex.svg +1 -0
- package/static/ui/tool-logos/cursor.svg +1 -0
- package/static/ui/tool-logos/dirac.ico +18 -0
- package/static/ui/tool-logos/factory.svg +4 -0
- package/static/ui/tool-logos/fast-agent.svg +6 -0
- package/static/ui/tool-logos/glm.svg +1 -0
- package/static/ui/tool-logos/goose.svg +1 -0
- package/static/ui/tool-logos/hermes.svg +1 -0
- package/static/ui/tool-logos/kilocode.svg +1 -0
- package/static/ui/tool-logos/opencode.svg +1 -0
- package/static/ui/tool-logos/pi.svg +28 -0
- package/static/ui/tool-logos/qwen-code.png +0 -0
- package/tests/cli-routing.test.ts +43 -0
- package/tests/control-plane-ui-endpoints.test.ts +776 -0
- package/tests/daemon-classify.test.ts +5 -1
- package/tests/e2e.test.ts +5 -0
- package/tests/prewarm-cache.test.ts +15 -0
- package/tests/provider-routing-config.test.ts +150 -0
- package/tests/tokenbuddy.test.ts +27 -0
- package/static/ui/assets/index-Bzbrp7Qe.css +0 -1
- package/static/ui/assets/index-DEDEl8o2.js +0 -236
- package/static/ui/assets/index-DEDEl8o2.js.map +0 -1
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
export const PROVIDER_MODE_CONFIG_KEY = "provider-mode";
|
|
2
|
+
export const MANUAL_PROVIDER_CONFIG_KEY = "manual-providers";
|
|
3
|
+
export const AUTO_PROVIDER_CONFIG_KEY = "auto-provider";
|
|
4
|
+
export const MANUAL_PROVIDER_OBSERVATIONS_CONFIG_KEY = "manual-provider-observations";
|
|
5
|
+
const VALID_PROTOCOLS = new Set(["chat_completions", "responses", "messages"]);
|
|
6
|
+
const VALID_SCORERS = new Set(["balanced", "speed", "discount"]);
|
|
7
|
+
export function defaultProviderModeConfig(now = new Date().toISOString()) {
|
|
8
|
+
return {
|
|
9
|
+
mode: "manual",
|
|
10
|
+
updatedAt: now
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export function normalizeProviderModeConfig(value, now = new Date().toISOString()) {
|
|
14
|
+
if (!isRecord(value)) {
|
|
15
|
+
return defaultProviderModeConfig(now);
|
|
16
|
+
}
|
|
17
|
+
return {
|
|
18
|
+
mode: readProviderMode(value.mode),
|
|
19
|
+
updatedAt: readOptionalString(value.updatedAt) ?? now
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export function normalizeManualProvidersConfig(value, now = new Date().toISOString()) {
|
|
23
|
+
if (!isRecord(value)) {
|
|
24
|
+
return {
|
|
25
|
+
version: 1,
|
|
26
|
+
providers: [],
|
|
27
|
+
routing: defaultManualProviderRoutingConfig(),
|
|
28
|
+
updatedAt: now
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
const providersValue = Array.isArray(value.providers) ? value.providers : [];
|
|
32
|
+
const seen = new Set();
|
|
33
|
+
const providers = providersValue.map((providerValue) => {
|
|
34
|
+
const provider = normalizeManualProviderConfig(providerValue, { now });
|
|
35
|
+
if (seen.has(provider.id)) {
|
|
36
|
+
throw new Error(`manual provider id is duplicated: ${provider.id}`);
|
|
37
|
+
}
|
|
38
|
+
seen.add(provider.id);
|
|
39
|
+
return provider;
|
|
40
|
+
});
|
|
41
|
+
return {
|
|
42
|
+
version: 1,
|
|
43
|
+
providers,
|
|
44
|
+
routing: normalizeManualProviderRoutingConfig(value.routing),
|
|
45
|
+
updatedAt: readOptionalString(value.updatedAt) ?? now
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export function defaultManualProviderRoutingConfig() {
|
|
49
|
+
return {
|
|
50
|
+
policy: "fallback"
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
export function normalizeManualProviderRoutingConfig(value) {
|
|
54
|
+
if (!isRecord(value)) {
|
|
55
|
+
return defaultManualProviderRoutingConfig();
|
|
56
|
+
}
|
|
57
|
+
const policy = readManualProviderRoutingPolicy(value.policy);
|
|
58
|
+
const lockedProviderId = readOptionalString(value.lockedProviderId);
|
|
59
|
+
if (policy === "locked" && !lockedProviderId) {
|
|
60
|
+
throw new Error("manual provider locked routing requires lockedProviderId");
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
policy,
|
|
64
|
+
lockedProviderId: policy === "locked" ? readProviderId(lockedProviderId) : undefined
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export function normalizeManualProviderConfig(value, options = {}) {
|
|
68
|
+
if (!isRecord(value)) {
|
|
69
|
+
throw new Error("manual provider config must be an object");
|
|
70
|
+
}
|
|
71
|
+
if ("apiKey" in value) {
|
|
72
|
+
throw new Error("manual provider config must not contain a raw apiKey; use apiKeyEnv or secretRef");
|
|
73
|
+
}
|
|
74
|
+
const now = options.now ?? new Date().toISOString();
|
|
75
|
+
const id = readProviderId(options.id ?? value.id);
|
|
76
|
+
if (options.existingIds?.has(id)) {
|
|
77
|
+
throw new Error(`manual provider id is duplicated: ${id}`);
|
|
78
|
+
}
|
|
79
|
+
const apiKeyEnv = readOptionalString(value.apiKeyEnv);
|
|
80
|
+
const secretRef = readOptionalString(value.secretRef);
|
|
81
|
+
if (!apiKeyEnv && !secretRef) {
|
|
82
|
+
throw new Error("manual provider requires apiKeyEnv or secretRef");
|
|
83
|
+
}
|
|
84
|
+
if (apiKeyEnv && !/^[A-Za-z_][A-Za-z0-9_]*$/.test(apiKeyEnv)) {
|
|
85
|
+
throw new Error("manual provider apiKeyEnv must be a valid environment variable name");
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
id,
|
|
89
|
+
name: readRequiredString(value.name, "manual provider name"),
|
|
90
|
+
kind: readManualProviderKind(value.kind),
|
|
91
|
+
baseUrl: normalizeProviderBaseUrl(value.baseUrl),
|
|
92
|
+
apiKeyEnv,
|
|
93
|
+
secretRef,
|
|
94
|
+
models: readNonEmptyStringList(value.models, "manual provider models"),
|
|
95
|
+
supportedProtocols: readProtocols(value.supportedProtocols),
|
|
96
|
+
enabled: value.enabled === undefined ? true : value.enabled === true,
|
|
97
|
+
notes: readOptionalString(value.notes),
|
|
98
|
+
createdAt: readOptionalString(value.createdAt) ?? now,
|
|
99
|
+
updatedAt: now
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
export function normalizeAutoProviderConfig(value, now = new Date().toISOString()) {
|
|
103
|
+
if (!isRecord(value)) {
|
|
104
|
+
return defaultAutoProviderConfig(now);
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
enabled: value.enabled === true,
|
|
108
|
+
range: readAutoProviderRange(value.range),
|
|
109
|
+
scorer: readScorer(value.scorer),
|
|
110
|
+
modelIds: readStringList(value.modelIds),
|
|
111
|
+
sellerIds: readStringList(value.sellerIds),
|
|
112
|
+
maxConcurrentProviders: 10,
|
|
113
|
+
updatedAt: readOptionalString(value.updatedAt) ?? now
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
export function defaultAutoProviderConfig(now = new Date().toISOString()) {
|
|
117
|
+
return {
|
|
118
|
+
enabled: false,
|
|
119
|
+
range: "recommended",
|
|
120
|
+
scorer: "balanced",
|
|
121
|
+
modelIds: [],
|
|
122
|
+
sellerIds: [],
|
|
123
|
+
maxConcurrentProviders: 10,
|
|
124
|
+
updatedAt: now
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
export function normalizeManualProviderObservationsConfig(value, now = new Date().toISOString()) {
|
|
128
|
+
if (!isRecord(value)) {
|
|
129
|
+
return {
|
|
130
|
+
version: 1,
|
|
131
|
+
observations: [],
|
|
132
|
+
updatedAt: now
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
const observationsValue = Array.isArray(value.observations) ? value.observations : [];
|
|
136
|
+
const seen = new Set();
|
|
137
|
+
const observations = observationsValue
|
|
138
|
+
.filter(isRecord)
|
|
139
|
+
.map((entry) => normalizeManualProviderObservation(entry, now))
|
|
140
|
+
.filter((entry) => {
|
|
141
|
+
if (seen.has(entry.providerId)) {
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
seen.add(entry.providerId);
|
|
145
|
+
return true;
|
|
146
|
+
});
|
|
147
|
+
return {
|
|
148
|
+
version: 1,
|
|
149
|
+
observations,
|
|
150
|
+
updatedAt: readOptionalString(value.updatedAt) ?? now
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
export function publicManualProviderConfig(provider, observation, env = process.env) {
|
|
154
|
+
const keyRef = provider.apiKeyEnv
|
|
155
|
+
? { kind: "env", name: provider.apiKeyEnv, configured: Boolean(env[provider.apiKeyEnv]) }
|
|
156
|
+
: provider.secretRef
|
|
157
|
+
? { kind: "secret", name: provider.secretRef, configured: true }
|
|
158
|
+
: undefined;
|
|
159
|
+
const { apiKeyEnv: _apiKeyEnv, secretRef: _secretRef, ...publicProvider } = provider;
|
|
160
|
+
return {
|
|
161
|
+
...publicProvider,
|
|
162
|
+
keyRef,
|
|
163
|
+
current: observation?.current,
|
|
164
|
+
lastAccess: observation?.lastAccess,
|
|
165
|
+
status: observation?.status,
|
|
166
|
+
errorClass: observation?.errorClass,
|
|
167
|
+
errorMessage: observation?.errorMessage,
|
|
168
|
+
ttftMs: observation?.ttftMs,
|
|
169
|
+
avgTokensPerSecond: observation?.avgTokensPerSecond
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
function normalizeManualProviderObservation(value, now) {
|
|
173
|
+
return {
|
|
174
|
+
providerId: readRequiredString(value.providerId, "manual provider observation providerId"),
|
|
175
|
+
current: value.current === true,
|
|
176
|
+
lastAccess: readOptionalString(value.lastAccess) ?? now,
|
|
177
|
+
status: readObservationStatus(value.status),
|
|
178
|
+
errorClass: readOptionalString(value.errorClass),
|
|
179
|
+
errorMessage: readOptionalString(value.errorMessage),
|
|
180
|
+
ttftMs: readOptionalNumber(value.ttftMs),
|
|
181
|
+
avgTokensPerSecond: readOptionalNumber(value.avgTokensPerSecond)
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
function readObservationStatus(value) {
|
|
185
|
+
if (value === "healthy" || value === "degraded" || value === "unhealthy" || value === "unknown") {
|
|
186
|
+
return value;
|
|
187
|
+
}
|
|
188
|
+
return "unknown";
|
|
189
|
+
}
|
|
190
|
+
function readProviderMode(value) {
|
|
191
|
+
if (value === "manual" || value === "auto") {
|
|
192
|
+
return value;
|
|
193
|
+
}
|
|
194
|
+
throw new Error("provider mode must be manual or auto");
|
|
195
|
+
}
|
|
196
|
+
function readManualProviderRoutingPolicy(value) {
|
|
197
|
+
if (value === undefined || value === null || value === "" || value === "fallback") {
|
|
198
|
+
return "fallback";
|
|
199
|
+
}
|
|
200
|
+
if (value === "locked") {
|
|
201
|
+
return "locked";
|
|
202
|
+
}
|
|
203
|
+
throw new Error("manual provider routing policy must be fallback or locked");
|
|
204
|
+
}
|
|
205
|
+
function readManualProviderKind(value) {
|
|
206
|
+
if (value === undefined || value === null || value === "" || value === "openai-compatible") {
|
|
207
|
+
return "openai-compatible";
|
|
208
|
+
}
|
|
209
|
+
throw new Error("manual provider kind must be openai-compatible");
|
|
210
|
+
}
|
|
211
|
+
function readAutoProviderRange(value) {
|
|
212
|
+
if (value === undefined || value === null || value === "" || value === "recommended") {
|
|
213
|
+
return "recommended";
|
|
214
|
+
}
|
|
215
|
+
if (value === "custom") {
|
|
216
|
+
return "custom";
|
|
217
|
+
}
|
|
218
|
+
throw new Error("auto provider range must be recommended or custom");
|
|
219
|
+
}
|
|
220
|
+
function readScorer(value) {
|
|
221
|
+
if (value === undefined || value === null || value === "") {
|
|
222
|
+
return "balanced";
|
|
223
|
+
}
|
|
224
|
+
if (typeof value === "string" && VALID_SCORERS.has(value)) {
|
|
225
|
+
return value;
|
|
226
|
+
}
|
|
227
|
+
throw new Error("auto provider scorer must be balanced, speed, or discount");
|
|
228
|
+
}
|
|
229
|
+
function readProtocols(value) {
|
|
230
|
+
const protocols = readStringList(value);
|
|
231
|
+
if (protocols.length === 0) {
|
|
232
|
+
return ["chat_completions"];
|
|
233
|
+
}
|
|
234
|
+
const invalid = protocols.find((protocol) => !VALID_PROTOCOLS.has(protocol));
|
|
235
|
+
if (invalid) {
|
|
236
|
+
throw new Error(`manual provider protocol is invalid: ${invalid}`);
|
|
237
|
+
}
|
|
238
|
+
return protocols;
|
|
239
|
+
}
|
|
240
|
+
function normalizeProviderBaseUrl(value) {
|
|
241
|
+
const raw = readRequiredString(value, "manual provider baseUrl");
|
|
242
|
+
let parsed;
|
|
243
|
+
try {
|
|
244
|
+
parsed = new URL(raw);
|
|
245
|
+
}
|
|
246
|
+
catch {
|
|
247
|
+
throw new Error("manual provider baseUrl must be a valid URL");
|
|
248
|
+
}
|
|
249
|
+
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
|
|
250
|
+
throw new Error("manual provider baseUrl must use http or https");
|
|
251
|
+
}
|
|
252
|
+
return parsed.toString().replace(/\/+$/, "");
|
|
253
|
+
}
|
|
254
|
+
function readProviderId(value) {
|
|
255
|
+
const id = readRequiredString(value, "manual provider id");
|
|
256
|
+
if (!/^[A-Za-z0-9][A-Za-z0-9_-]{1,63}$/.test(id)) {
|
|
257
|
+
throw new Error("manual provider id must be 2-64 characters of letters, numbers, underscore, or dash");
|
|
258
|
+
}
|
|
259
|
+
return id;
|
|
260
|
+
}
|
|
261
|
+
function readRequiredString(value, label) {
|
|
262
|
+
if (typeof value !== "string" || value.trim().length === 0) {
|
|
263
|
+
throw new Error(`${label} is required`);
|
|
264
|
+
}
|
|
265
|
+
return value.trim();
|
|
266
|
+
}
|
|
267
|
+
function readOptionalString(value) {
|
|
268
|
+
return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
|
|
269
|
+
}
|
|
270
|
+
function readOptionalNumber(value) {
|
|
271
|
+
return typeof value === "number" && Number.isFinite(value) ? value : undefined;
|
|
272
|
+
}
|
|
273
|
+
function readNonEmptyStringList(value, label) {
|
|
274
|
+
const entries = readStringList(value);
|
|
275
|
+
if (entries.length === 0) {
|
|
276
|
+
throw new Error(`${label} must contain at least one value`);
|
|
277
|
+
}
|
|
278
|
+
return entries;
|
|
279
|
+
}
|
|
280
|
+
function readStringList(value) {
|
|
281
|
+
if (!Array.isArray(value)) {
|
|
282
|
+
return [];
|
|
283
|
+
}
|
|
284
|
+
return value
|
|
285
|
+
.filter((entry) => typeof entry === "string")
|
|
286
|
+
.map((entry) => entry.trim())
|
|
287
|
+
.filter((entry, index, all) => entry.length > 0 && all.indexOf(entry) === index);
|
|
288
|
+
}
|
|
289
|
+
function isRecord(value) {
|
|
290
|
+
return Boolean(value && typeof value === "object" && !Array.isArray(value));
|
|
291
|
+
}
|
|
292
|
+
//# sourceMappingURL=provider-routing-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-routing-config.js","sourceRoot":"","sources":["../../src/provider-routing-config.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/buyer-store.ts
CHANGED
|
@@ -64,6 +64,9 @@ export interface PurchaseLedgerInput {
|
|
|
64
64
|
status: string;
|
|
65
65
|
creditMicros: number;
|
|
66
66
|
currency: string;
|
|
67
|
+
paymentAmount?: string;
|
|
68
|
+
paymentAmountMinor?: number;
|
|
69
|
+
paymentCurrency?: string;
|
|
67
70
|
paymentReference?: string;
|
|
68
71
|
completedAt?: string;
|
|
69
72
|
}
|
|
@@ -80,6 +83,9 @@ export interface SafePurchaseLedgerEntry {
|
|
|
80
83
|
status: string;
|
|
81
84
|
creditMicros: number;
|
|
82
85
|
currency: string;
|
|
86
|
+
paymentAmount?: string;
|
|
87
|
+
paymentAmountMinor?: number;
|
|
88
|
+
paymentCurrency?: string;
|
|
83
89
|
paymentReferenceHash?: string;
|
|
84
90
|
createdAt: string;
|
|
85
91
|
completedAt?: string;
|
|
@@ -106,11 +112,21 @@ export interface InferenceLedgerInput {
|
|
|
106
112
|
status: string;
|
|
107
113
|
promptTokens: number;
|
|
108
114
|
completionTokens: number;
|
|
115
|
+
cacheReadTokens?: number;
|
|
109
116
|
billedMicros: number;
|
|
110
117
|
estimatedMicros?: number;
|
|
111
118
|
settledMicros?: number;
|
|
112
119
|
settledUsdMicros?: number;
|
|
113
120
|
priceVersion?: string;
|
|
121
|
+
inputPriceMicrosPer1m?: number;
|
|
122
|
+
outputPriceMicrosPer1m?: number;
|
|
123
|
+
cacheReadPriceMicrosPer1m?: number;
|
|
124
|
+
inputCostMicros?: number;
|
|
125
|
+
outputCostMicros?: number;
|
|
126
|
+
cacheReadCostMicros?: number;
|
|
127
|
+
originalUsdMicros?: number;
|
|
128
|
+
billingMultiplier?: number;
|
|
129
|
+
serviceTier?: string;
|
|
114
130
|
balanceSnapshotMicros?: number;
|
|
115
131
|
balanceSource?: string;
|
|
116
132
|
prompt?: string;
|
|
@@ -136,11 +152,21 @@ export interface SafeInferenceLedgerEntry {
|
|
|
136
152
|
status: string;
|
|
137
153
|
promptTokens: number;
|
|
138
154
|
completionTokens: number;
|
|
155
|
+
cacheReadTokens: number;
|
|
139
156
|
billedMicros: number;
|
|
140
157
|
estimatedMicros?: number;
|
|
141
158
|
settledMicros?: number;
|
|
142
159
|
settledUsdMicros?: number;
|
|
143
160
|
priceVersion?: string;
|
|
161
|
+
inputPriceMicrosPer1m?: number;
|
|
162
|
+
outputPriceMicrosPer1m?: number;
|
|
163
|
+
cacheReadPriceMicrosPer1m?: number;
|
|
164
|
+
inputCostMicros?: number;
|
|
165
|
+
outputCostMicros?: number;
|
|
166
|
+
cacheReadCostMicros?: number;
|
|
167
|
+
originalUsdMicros?: number;
|
|
168
|
+
billingMultiplier?: number;
|
|
169
|
+
serviceTier?: string;
|
|
144
170
|
balanceSnapshotMicros?: number;
|
|
145
171
|
balanceSource?: string;
|
|
146
172
|
promptHash?: string;
|
|
@@ -609,8 +635,9 @@ export class BuyerStore {
|
|
|
609
635
|
this.db.prepare(
|
|
610
636
|
`INSERT INTO purchase_ledger (
|
|
611
637
|
purchase_id, seller_key, model_id, payment_method, status, credit_micros,
|
|
612
|
-
currency,
|
|
613
|
-
|
|
638
|
+
currency, payment_amount, payment_amount_minor, payment_currency,
|
|
639
|
+
payment_reference_hash, created_at, completed_at
|
|
640
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`
|
|
614
641
|
).run(
|
|
615
642
|
input.purchaseId,
|
|
616
643
|
input.sellerKey,
|
|
@@ -619,6 +646,9 @@ export class BuyerStore {
|
|
|
619
646
|
input.status,
|
|
620
647
|
input.creditMicros,
|
|
621
648
|
input.currency,
|
|
649
|
+
input.paymentAmount ?? null,
|
|
650
|
+
input.paymentAmountMinor ?? null,
|
|
651
|
+
input.paymentCurrency ?? null,
|
|
622
652
|
safeHash(input.paymentReference) || null,
|
|
623
653
|
createdAt,
|
|
624
654
|
input.completedAt || null
|
|
@@ -628,7 +658,8 @@ export class BuyerStore {
|
|
|
628
658
|
public listPurchaseLedger(): SafePurchaseLedgerEntry[] {
|
|
629
659
|
const rows = this.db.prepare(
|
|
630
660
|
`SELECT purchase_id, seller_key, model_id, payment_method, status, credit_micros,
|
|
631
|
-
currency,
|
|
661
|
+
currency, payment_amount, payment_amount_minor, payment_currency,
|
|
662
|
+
payment_reference_hash, created_at, completed_at
|
|
632
663
|
FROM purchase_ledger
|
|
633
664
|
ORDER BY id ASC`
|
|
634
665
|
).all() as Array<{
|
|
@@ -639,6 +670,9 @@ export class BuyerStore {
|
|
|
639
670
|
status: string;
|
|
640
671
|
credit_micros: number;
|
|
641
672
|
currency: string;
|
|
673
|
+
payment_amount: string | null;
|
|
674
|
+
payment_amount_minor: number | null;
|
|
675
|
+
payment_currency: string | null;
|
|
642
676
|
payment_reference_hash: string | null;
|
|
643
677
|
created_at: string;
|
|
644
678
|
completed_at: string | null;
|
|
@@ -652,6 +686,9 @@ export class BuyerStore {
|
|
|
652
686
|
status: row.status,
|
|
653
687
|
creditMicros: row.credit_micros,
|
|
654
688
|
currency: row.currency,
|
|
689
|
+
paymentAmount: row.payment_amount || undefined,
|
|
690
|
+
paymentAmountMinor: row.payment_amount_minor ?? undefined,
|
|
691
|
+
paymentCurrency: row.payment_currency || undefined,
|
|
655
692
|
paymentReferenceHash: row.payment_reference_hash || undefined,
|
|
656
693
|
createdAt: row.created_at,
|
|
657
694
|
completedAt: row.completed_at || undefined
|
|
@@ -662,12 +699,16 @@ export class BuyerStore {
|
|
|
662
699
|
this.db.prepare(
|
|
663
700
|
`INSERT INTO inference_ledger (
|
|
664
701
|
request_id, seller_key, model_id, endpoint, status, prompt_tokens,
|
|
665
|
-
completion_tokens, billed_micros, estimated_micros, settled_micros,
|
|
666
|
-
settled_usd_micros, price_version,
|
|
702
|
+
completion_tokens, cache_read_tokens, billed_micros, estimated_micros, settled_micros,
|
|
703
|
+
settled_usd_micros, price_version,
|
|
704
|
+
input_price_micros_per_1m, output_price_micros_per_1m, cache_read_price_micros_per_1m,
|
|
705
|
+
input_cost_micros, output_cost_micros, cache_read_cost_micros,
|
|
706
|
+
original_usd_micros, billing_multiplier, service_tier,
|
|
707
|
+
balance_snapshot_micros, balance_source,
|
|
667
708
|
prompt_hash, response_hash, created_at,
|
|
668
709
|
ttft_ms, fallback_count, route_reason, fallover_chain_json, upstream_status,
|
|
669
710
|
duration_ms, payment_method
|
|
670
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`
|
|
711
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`
|
|
671
712
|
).run(
|
|
672
713
|
input.requestId,
|
|
673
714
|
input.sellerKey,
|
|
@@ -676,11 +717,21 @@ export class BuyerStore {
|
|
|
676
717
|
input.status,
|
|
677
718
|
input.promptTokens,
|
|
678
719
|
input.completionTokens,
|
|
720
|
+
input.cacheReadTokens ?? 0,
|
|
679
721
|
input.billedMicros,
|
|
680
722
|
input.estimatedMicros ?? input.billedMicros,
|
|
681
723
|
input.settledMicros ?? null,
|
|
682
724
|
input.settledUsdMicros ?? null,
|
|
683
725
|
input.priceVersion || null,
|
|
726
|
+
input.inputPriceMicrosPer1m ?? null,
|
|
727
|
+
input.outputPriceMicrosPer1m ?? null,
|
|
728
|
+
input.cacheReadPriceMicrosPer1m ?? null,
|
|
729
|
+
input.inputCostMicros ?? null,
|
|
730
|
+
input.outputCostMicros ?? null,
|
|
731
|
+
input.cacheReadCostMicros ?? null,
|
|
732
|
+
input.originalUsdMicros ?? null,
|
|
733
|
+
input.billingMultiplier ?? null,
|
|
734
|
+
input.serviceTier ?? null,
|
|
684
735
|
input.balanceSnapshotMicros ?? null,
|
|
685
736
|
input.balanceSource || "unknown",
|
|
686
737
|
safeHash(input.prompt) || null,
|
|
@@ -699,8 +750,12 @@ export class BuyerStore {
|
|
|
699
750
|
public listInferenceLedger(): SafeInferenceLedgerEntry[] {
|
|
700
751
|
const rows = this.db.prepare(
|
|
701
752
|
`SELECT request_id, seller_key, model_id, endpoint, status, prompt_tokens,
|
|
702
|
-
completion_tokens, billed_micros, estimated_micros, settled_micros,
|
|
703
|
-
settled_usd_micros, price_version,
|
|
753
|
+
completion_tokens, cache_read_tokens, billed_micros, estimated_micros, settled_micros,
|
|
754
|
+
settled_usd_micros, price_version,
|
|
755
|
+
input_price_micros_per_1m, output_price_micros_per_1m, cache_read_price_micros_per_1m,
|
|
756
|
+
input_cost_micros, output_cost_micros, cache_read_cost_micros,
|
|
757
|
+
original_usd_micros, billing_multiplier, service_tier,
|
|
758
|
+
balance_snapshot_micros, balance_source,
|
|
704
759
|
prompt_hash, response_hash, created_at,
|
|
705
760
|
ttft_ms, fallback_count, route_reason, fallover_chain_json, upstream_status,
|
|
706
761
|
duration_ms, payment_method
|
|
@@ -714,11 +769,21 @@ export class BuyerStore {
|
|
|
714
769
|
status: string;
|
|
715
770
|
prompt_tokens: number;
|
|
716
771
|
completion_tokens: number;
|
|
772
|
+
cache_read_tokens: number;
|
|
717
773
|
billed_micros: number;
|
|
718
774
|
estimated_micros: number | null;
|
|
719
775
|
settled_micros: number | null;
|
|
720
776
|
settled_usd_micros: number | null;
|
|
721
777
|
price_version: string | null;
|
|
778
|
+
input_price_micros_per_1m: number | null;
|
|
779
|
+
output_price_micros_per_1m: number | null;
|
|
780
|
+
cache_read_price_micros_per_1m: number | null;
|
|
781
|
+
input_cost_micros: number | null;
|
|
782
|
+
output_cost_micros: number | null;
|
|
783
|
+
cache_read_cost_micros: number | null;
|
|
784
|
+
original_usd_micros: number | null;
|
|
785
|
+
billing_multiplier: number | null;
|
|
786
|
+
service_tier: string | null;
|
|
722
787
|
balance_snapshot_micros: number | null;
|
|
723
788
|
balance_source: string | null;
|
|
724
789
|
prompt_hash: string | null;
|
|
@@ -741,11 +806,21 @@ export class BuyerStore {
|
|
|
741
806
|
status: row.status,
|
|
742
807
|
promptTokens: row.prompt_tokens,
|
|
743
808
|
completionTokens: row.completion_tokens,
|
|
809
|
+
cacheReadTokens: row.cache_read_tokens,
|
|
744
810
|
billedMicros: row.billed_micros,
|
|
745
811
|
estimatedMicros: row.estimated_micros ?? undefined,
|
|
746
812
|
settledMicros: row.settled_micros ?? undefined,
|
|
747
813
|
settledUsdMicros: row.settled_usd_micros ?? undefined,
|
|
748
814
|
priceVersion: row.price_version || undefined,
|
|
815
|
+
inputPriceMicrosPer1m: row.input_price_micros_per_1m ?? undefined,
|
|
816
|
+
outputPriceMicrosPer1m: row.output_price_micros_per_1m ?? undefined,
|
|
817
|
+
cacheReadPriceMicrosPer1m: row.cache_read_price_micros_per_1m ?? undefined,
|
|
818
|
+
inputCostMicros: row.input_cost_micros ?? undefined,
|
|
819
|
+
outputCostMicros: row.output_cost_micros ?? undefined,
|
|
820
|
+
cacheReadCostMicros: row.cache_read_cost_micros ?? undefined,
|
|
821
|
+
originalUsdMicros: row.original_usd_micros ?? undefined,
|
|
822
|
+
billingMultiplier: row.billing_multiplier ?? undefined,
|
|
823
|
+
serviceTier: row.service_tier || undefined,
|
|
749
824
|
balanceSnapshotMicros: row.balance_snapshot_micros ?? undefined,
|
|
750
825
|
balanceSource: row.balance_source || undefined,
|
|
751
826
|
promptHash: row.prompt_hash || undefined,
|
|
@@ -810,6 +885,9 @@ export class BuyerStore {
|
|
|
810
885
|
status TEXT NOT NULL,
|
|
811
886
|
credit_micros INTEGER NOT NULL,
|
|
812
887
|
currency TEXT NOT NULL,
|
|
888
|
+
payment_amount TEXT,
|
|
889
|
+
payment_amount_minor INTEGER,
|
|
890
|
+
payment_currency TEXT,
|
|
813
891
|
payment_reference_hash TEXT,
|
|
814
892
|
created_at TEXT NOT NULL,
|
|
815
893
|
completed_at TEXT
|
|
@@ -824,11 +902,21 @@ export class BuyerStore {
|
|
|
824
902
|
status TEXT NOT NULL,
|
|
825
903
|
prompt_tokens INTEGER NOT NULL,
|
|
826
904
|
completion_tokens INTEGER NOT NULL,
|
|
905
|
+
cache_read_tokens INTEGER NOT NULL DEFAULT 0,
|
|
827
906
|
billed_micros INTEGER NOT NULL,
|
|
828
907
|
estimated_micros INTEGER,
|
|
829
908
|
settled_micros INTEGER,
|
|
830
909
|
settled_usd_micros INTEGER,
|
|
831
910
|
price_version TEXT,
|
|
911
|
+
input_price_micros_per_1m INTEGER,
|
|
912
|
+
output_price_micros_per_1m INTEGER,
|
|
913
|
+
cache_read_price_micros_per_1m INTEGER,
|
|
914
|
+
input_cost_micros INTEGER,
|
|
915
|
+
output_cost_micros INTEGER,
|
|
916
|
+
cache_read_cost_micros INTEGER,
|
|
917
|
+
original_usd_micros INTEGER,
|
|
918
|
+
billing_multiplier REAL,
|
|
919
|
+
service_tier TEXT,
|
|
832
920
|
balance_snapshot_micros INTEGER,
|
|
833
921
|
balance_source TEXT,
|
|
834
922
|
prompt_hash TEXT,
|
|
@@ -871,11 +959,28 @@ export class BuyerStore {
|
|
|
871
959
|
]) {
|
|
872
960
|
this.ensureColumn("token_cache", column, definition);
|
|
873
961
|
}
|
|
962
|
+
for (const [column, definition] of [
|
|
963
|
+
["payment_amount", "TEXT"],
|
|
964
|
+
["payment_amount_minor", "INTEGER"],
|
|
965
|
+
["payment_currency", "TEXT"]
|
|
966
|
+
]) {
|
|
967
|
+
this.ensureColumn("purchase_ledger", column, definition);
|
|
968
|
+
}
|
|
874
969
|
for (const [column, definition] of [
|
|
875
970
|
["estimated_micros", "INTEGER"],
|
|
971
|
+
["cache_read_tokens", "INTEGER NOT NULL DEFAULT 0"],
|
|
876
972
|
["settled_micros", "INTEGER"],
|
|
877
973
|
["settled_usd_micros", "INTEGER"],
|
|
878
974
|
["price_version", "TEXT"],
|
|
975
|
+
["input_price_micros_per_1m", "INTEGER"],
|
|
976
|
+
["output_price_micros_per_1m", "INTEGER"],
|
|
977
|
+
["cache_read_price_micros_per_1m", "INTEGER"],
|
|
978
|
+
["input_cost_micros", "INTEGER"],
|
|
979
|
+
["output_cost_micros", "INTEGER"],
|
|
980
|
+
["cache_read_cost_micros", "INTEGER"],
|
|
981
|
+
["original_usd_micros", "INTEGER"],
|
|
982
|
+
["billing_multiplier", "REAL"],
|
|
983
|
+
["service_tier", "TEXT"],
|
|
879
984
|
["balance_snapshot_micros", "INTEGER"],
|
|
880
985
|
["balance_source", "TEXT"],
|
|
881
986
|
["ttft_ms", "INTEGER"],
|