@musnows/scriverse 0.8.5 → 0.8.7

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.
Files changed (48) hide show
  1. package/README.md +1 -0
  2. package/dist/ai-model-pricing.js +530 -0
  3. package/dist/ai-model-pricing.js.map +1 -0
  4. package/dist/ai-protocol.js +335 -15
  5. package/dist/ai-protocol.js.map +1 -1
  6. package/dist/ai-retry.js +1 -1
  7. package/dist/ai-retry.js.map +1 -1
  8. package/dist/ai.js +1083 -139
  9. package/dist/ai.js.map +1 -1
  10. package/dist/app.js +222 -25
  11. package/dist/app.js.map +1 -1
  12. package/dist/attachment-download.js +26 -0
  13. package/dist/attachment-download.js.map +1 -0
  14. package/dist/attachment-storage.js +8 -6
  15. package/dist/attachment-storage.js.map +1 -1
  16. package/dist/cli-contract.js +6 -4
  17. package/dist/cli-contract.js.map +1 -1
  18. package/dist/database.js +363 -4
  19. package/dist/database.js.map +1 -1
  20. package/dist/public/ai-image-attachments.d.ts +21 -0
  21. package/dist/public/ai-image-attachments.js +42 -0
  22. package/dist/public/ai-usage.d.ts +1 -0
  23. package/dist/public/ai-usage.js +11 -0
  24. package/dist/public/app.js +1030 -106
  25. package/dist/public/display-labels.d.ts +2 -1
  26. package/dist/public/display-labels.js +6 -6
  27. package/dist/public/index.html +42 -7
  28. package/dist/public/model-config.d.ts +6 -4
  29. package/dist/public/model-config.js +10 -2
  30. package/dist/public/styles.css +157 -6
  31. package/dist/s3-backup.js +21 -0
  32. package/dist/s3-backup.js.map +1 -1
  33. package/dist/security.js +2 -1
  34. package/dist/security.js.map +1 -1
  35. package/dist/server-runtime.js +6 -0
  36. package/dist/server-runtime.js.map +1 -1
  37. package/dist/store.js +550 -44
  38. package/dist/store.js.map +1 -1
  39. package/dist/upload-limits.js +10 -4
  40. package/dist/upload-limits.js.map +1 -1
  41. package/dist/user-auth.js +3 -0
  42. package/dist/user-auth.js.map +1 -1
  43. package/dist/utils.js +1 -1
  44. package/dist/utils.js.map +1 -1
  45. package/dist/version.js +1 -1
  46. package/dist/writing-progress-time.js +15 -0
  47. package/dist/writing-progress-time.js.map +1 -1
  48. package/package.json +1 -1
package/README.md CHANGED
@@ -127,6 +127,7 @@ CLI 会按服务器保存登录凭据。所有连接服务的数据命令都可
127
127
  | `SCRIVERSE_AVATAR_IMAGE_MAX_BYTES` | `2097152` | 头像图片上传大小上限,单位为字节 |
128
128
  | `SCRIVERSE_COVER_IMAGE_MAX_BYTES` | `5242880` | 作品封面图片上传大小上限,单位为字节;封面不支持 GIF |
129
129
  | `SCRIVERSE_ATTACHMENT_IMAGE_MAX_BYTES` | `31457280` | 设定库等其他图片附件上传大小上限,单位为字节;包括 GIF |
130
+ | `SCRIVERSE_AI_CHAT_IMAGE_MAX_BYTES` | `5242880` | 创作助手聊天图片附件上传大小上限,单位为字节;最小可设为 `1048576`(1 MB) |
130
131
 
131
132
  布尔环境变量统一接受 `true`/`1` 表示开启、`false`/`0` 表示关闭;其他数字不会被解析为布尔值。`APP_TRUST_PROXY` 例外,其 `0`–`10` 数字表示可信代理跳数。
132
133
 
@@ -0,0 +1,530 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { chmodSync, mkdirSync, readFileSync, renameSync, unlinkSync, writeFileSync } from "node:fs";
3
+ import { dirname } from "node:path";
4
+ import { logger, sanitizeError } from "./logger.js";
5
+ export const LITELLM_MODEL_PRICES_URL = "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json";
6
+ export const OPENROUTER_MODEL_PRICES_URL = "https://openrouter.ai/api/v1/models";
7
+ export const MODELS_DEV_MODEL_PRICES_URL = "https://models.dev/api.json";
8
+ export const PUBLIC_PROVIDER_CONF_PRICES_URL = "https://raw.githubusercontent.com/ThinkInAIXYZ/PublicProviderConf/refs/heads/dev/dist/all.json";
9
+ export const MODEL_PRICE_SOURCE_ORDER = ["litellm", "openrouter", "models.dev", "public-provider-conf"];
10
+ const MODEL_PRICE_CACHE_VERSION = 2;
11
+ const MODEL_PRICE_RESPONSE_MAX_BYTES = 16 * 1024 * 1024;
12
+ const MODEL_PRICE_ENTRY_LIMIT = 100_000;
13
+ const DEFAULT_MODEL_PRICE_REFRESH_TIMEOUT_MS = 30_000;
14
+ const PER_MILLION_TOKENS = 1_000_000;
15
+ const MODEL_PRICE_SOURCE_DEFINITIONS = [
16
+ { source: "litellm", url: LITELLM_MODEL_PRICES_URL },
17
+ { source: "openrouter", url: OPENROUTER_MODEL_PRICES_URL },
18
+ { source: "models.dev", url: MODELS_DEV_MODEL_PRICES_URL },
19
+ { source: "public-provider-conf", url: PUBLIC_PROVIDER_CONF_PRICES_URL }
20
+ ];
21
+ function recordValue(value) {
22
+ return value && typeof value === "object" && !Array.isArray(value)
23
+ ? value
24
+ : null;
25
+ }
26
+ function finiteNonNegative(value) {
27
+ const number = typeof value === "number"
28
+ ? value
29
+ : typeof value === "string" && value.trim() !== ""
30
+ ? Number(value)
31
+ : NaN;
32
+ return Number.isFinite(number) && number >= 0 ? number : null;
33
+ }
34
+ function normalizedModelId(modelId) {
35
+ return modelId.trim().toLowerCase();
36
+ }
37
+ function optionalPrice(record, key) {
38
+ const value = finiteNonNegative(record[key]);
39
+ return value === null ? undefined : value;
40
+ }
41
+ function nonEmptyString(value) {
42
+ return typeof value === "string" && value.trim() !== "" ? value.trim() : null;
43
+ }
44
+ function addPrice(table, modelId, price) {
45
+ const normalized = normalizedModelId(modelId);
46
+ if (table.size >= MODEL_PRICE_ENTRY_LIMIT || !normalized || table.has(normalized))
47
+ return;
48
+ table.set(normalized, price);
49
+ }
50
+ function collectionEntries(value) {
51
+ if (Array.isArray(value))
52
+ return value.map((entry, index) => [String(index), entry]);
53
+ const record = recordValue(value);
54
+ return record ? Object.entries(record) : [];
55
+ }
56
+ function priceFromPerMillionCost(record) {
57
+ const inputCost = finiteNonNegative(record.input);
58
+ const outputCost = finiteNonNegative(record.output);
59
+ if (inputCost === null || outputCost === null)
60
+ return null;
61
+ const cacheReadCost = finiteNonNegative(record.cache_read);
62
+ const cacheWriteCost = finiteNonNegative(record.cache_write);
63
+ return {
64
+ input_cost_per_token: inputCost / PER_MILLION_TOKENS,
65
+ output_cost_per_token: outputCost / PER_MILLION_TOKENS,
66
+ ...(cacheReadCost === null ? {} : { cache_read_input_token_cost: cacheReadCost / PER_MILLION_TOKENS }),
67
+ ...(cacheWriteCost === null ? {} : { cache_creation_input_token_cost: cacheWriteCost / PER_MILLION_TOKENS })
68
+ };
69
+ }
70
+ export function parseLiteLlmPriceTable(payload) {
71
+ const record = recordValue(payload);
72
+ const entries = recordValue(record?.prices) ?? record;
73
+ const table = new Map();
74
+ if (!entries)
75
+ return table;
76
+ for (const [rawModelId, rawPrice] of Object.entries(entries)) {
77
+ if (rawModelId === "sample_spec")
78
+ continue;
79
+ const modelId = normalizedModelId(rawModelId);
80
+ const priceRecord = recordValue(rawPrice);
81
+ if (!modelId || !priceRecord)
82
+ continue;
83
+ const inputCost = finiteNonNegative(priceRecord.input_cost_per_token);
84
+ const outputCost = finiteNonNegative(priceRecord.output_cost_per_token);
85
+ if (inputCost === null || outputCost === null)
86
+ continue;
87
+ const cacheReadCost = optionalPrice(priceRecord, "cache_read_input_token_cost");
88
+ const legacyCacheReadCost = optionalPrice(priceRecord, "input_cost_per_token_cache_hit");
89
+ const cacheCreationCost = optionalPrice(priceRecord, "cache_creation_input_token_cost");
90
+ addPrice(table, modelId, {
91
+ input_cost_per_token: inputCost,
92
+ output_cost_per_token: outputCost,
93
+ ...(cacheReadCost === undefined ? {} : { cache_read_input_token_cost: cacheReadCost }),
94
+ ...(legacyCacheReadCost === undefined ? {} : { input_cost_per_token_cache_hit: legacyCacheReadCost }),
95
+ ...(cacheCreationCost === undefined ? {} : { cache_creation_input_token_cost: cacheCreationCost })
96
+ });
97
+ }
98
+ return table;
99
+ }
100
+ export function parseOpenRouterPriceTable(payload) {
101
+ const record = recordValue(payload);
102
+ const models = Array.isArray(record?.data) ? record.data : [];
103
+ const table = new Map();
104
+ for (const rawModel of models) {
105
+ const model = recordValue(rawModel);
106
+ const modelId = nonEmptyString(model?.id);
107
+ const pricing = recordValue(model?.pricing);
108
+ if (!modelId || !pricing)
109
+ continue;
110
+ const inputCost = finiteNonNegative(pricing.prompt);
111
+ const outputCost = finiteNonNegative(pricing.completion);
112
+ if (inputCost === null || outputCost === null)
113
+ continue;
114
+ const cacheReadCost = finiteNonNegative(pricing.input_cache_read);
115
+ const cacheWriteCost = finiteNonNegative(pricing.input_cache_write);
116
+ addPrice(table, modelId, {
117
+ input_cost_per_token: inputCost,
118
+ output_cost_per_token: outputCost,
119
+ ...(cacheReadCost === null ? {} : { cache_read_input_token_cost: cacheReadCost }),
120
+ ...(cacheWriteCost === null ? {} : { cache_creation_input_token_cost: cacheWriteCost })
121
+ });
122
+ }
123
+ return table;
124
+ }
125
+ function parseProviderModelPriceTable(payload, providerField) {
126
+ const record = recordValue(payload);
127
+ const providers = providerField ? recordValue(record?.[providerField]) : record;
128
+ const table = new Map();
129
+ if (!providers)
130
+ return table;
131
+ for (const [rawProviderId, rawProvider] of Object.entries(providers)) {
132
+ const provider = recordValue(rawProvider);
133
+ const providerId = nonEmptyString(provider?.id) ?? rawProviderId;
134
+ for (const [rawModelId, rawModel] of collectionEntries(provider?.models)) {
135
+ const model = recordValue(rawModel);
136
+ const modelId = nonEmptyString(model?.id) ?? (rawModelId.match(/^\d+$/u) ? null : rawModelId);
137
+ const cost = recordValue(model?.cost);
138
+ if (!modelId || !cost)
139
+ continue;
140
+ const price = priceFromPerMillionCost(cost);
141
+ if (!price)
142
+ continue;
143
+ addPrice(table, `${providerId}/${modelId}`, price);
144
+ }
145
+ }
146
+ return table;
147
+ }
148
+ export function parseModelsDevPriceTable(payload) {
149
+ return parseProviderModelPriceTable(payload, null);
150
+ }
151
+ export function parsePublicProviderConfPriceTable(payload) {
152
+ return parseProviderModelPriceTable(payload, "providers");
153
+ }
154
+ function parsePriceTable(source, payload) {
155
+ if (source === "litellm")
156
+ return parseLiteLlmPriceTable(payload);
157
+ if (source === "openrouter")
158
+ return parseOpenRouterPriceTable(payload);
159
+ if (source === "models.dev")
160
+ return parseModelsDevPriceTable(payload);
161
+ return parsePublicProviderConfPriceTable(payload);
162
+ }
163
+ function serializeLiteLlmPriceTable(table) {
164
+ return Object.fromEntries(table);
165
+ }
166
+ function serializeSourceTables(sourceDefinitions, sourceTables, sourceUpdatedAt) {
167
+ const sources = {};
168
+ for (const definition of sourceDefinitions) {
169
+ const table = sourceTables.get(definition.source);
170
+ const updatedAt = sourceUpdatedAt.get(definition.source);
171
+ if (!table || table.size === 0 || !updatedAt)
172
+ continue;
173
+ sources[definition.source] = {
174
+ source: definition.source,
175
+ url: definition.url,
176
+ updatedAt,
177
+ prices: serializeLiteLlmPriceTable(table)
178
+ };
179
+ }
180
+ return sources;
181
+ }
182
+ export function nextLiteLlmPriceUpdate(now) {
183
+ const next = new Date(now.getTime());
184
+ next.setHours(24, 0, 0, 0);
185
+ return next;
186
+ }
187
+ export class LiteLlmPriceCache {
188
+ cachePath;
189
+ fetchImpl;
190
+ sourceDefinitions;
191
+ refreshTimeoutMs;
192
+ schedule;
193
+ now;
194
+ prices = new Map();
195
+ sourceTables = new Map();
196
+ sourceUpdatedAt = new Map();
197
+ sourceRefreshStatus = new Map();
198
+ lastSuccessfulUpdateAt = null;
199
+ refreshPromise = null;
200
+ refreshTimer = null;
201
+ activeControllers = new Set();
202
+ started = false;
203
+ disposed = false;
204
+ constructor(options = {}) {
205
+ this.cachePath = options.cachePath;
206
+ this.fetchImpl = options.fetchImpl ?? fetch;
207
+ this.sourceDefinitions = MODEL_PRICE_SOURCE_DEFINITIONS.map((definition) => ({
208
+ ...definition,
209
+ url: options.sourceUrls?.[definition.source]
210
+ ?? (definition.source === "litellm" ? options.sourceUrl : undefined)
211
+ ?? definition.url
212
+ }));
213
+ this.refreshTimeoutMs = Number.isSafeInteger(options.refreshTimeoutMs) && Number(options.refreshTimeoutMs) > 0
214
+ ? Number(options.refreshTimeoutMs)
215
+ : DEFAULT_MODEL_PRICE_REFRESH_TIMEOUT_MS;
216
+ this.schedule = options.schedule !== false;
217
+ this.now = options.now ?? (() => new Date());
218
+ for (const definition of this.sourceDefinitions)
219
+ this.sourceRefreshStatus.set(definition.source, null);
220
+ this.loadPersistedCache();
221
+ }
222
+ getPriceTable() {
223
+ return this.prices;
224
+ }
225
+ hasData() {
226
+ return this.prices.size > 0;
227
+ }
228
+ getSourceStatuses() {
229
+ return this.sourceDefinitions.map((definition) => ({
230
+ source: definition.source,
231
+ url: definition.url,
232
+ modelCount: this.sourceTables.get(definition.source)?.size ?? 0,
233
+ updatedAt: this.sourceUpdatedAt.get(definition.source) ?? null,
234
+ lastRefreshSucceeded: this.sourceRefreshStatus.get(definition.source) ?? null
235
+ }));
236
+ }
237
+ start() {
238
+ if (this.started || this.disposed)
239
+ return;
240
+ this.started = true;
241
+ if (this.schedule)
242
+ this.scheduleNextUpdate();
243
+ void this.refresh();
244
+ }
245
+ async refresh() {
246
+ if (this.disposed)
247
+ return false;
248
+ if (this.refreshPromise)
249
+ return this.refreshPromise;
250
+ const refreshPromise = this.fetchAndActivate();
251
+ this.refreshPromise = refreshPromise;
252
+ try {
253
+ return await refreshPromise;
254
+ }
255
+ finally {
256
+ if (this.refreshPromise === refreshPromise)
257
+ this.refreshPromise = null;
258
+ }
259
+ }
260
+ dispose() {
261
+ this.disposed = true;
262
+ if (this.refreshTimer) {
263
+ clearTimeout(this.refreshTimer);
264
+ this.refreshTimer = null;
265
+ }
266
+ for (const controller of this.activeControllers)
267
+ controller.abort();
268
+ this.activeControllers.clear();
269
+ }
270
+ loadPersistedCache() {
271
+ if (!this.cachePath)
272
+ return;
273
+ try {
274
+ const parsed = JSON.parse(readFileSync(this.cachePath, "utf8"));
275
+ const cache = recordValue(parsed);
276
+ if (cache?.version === MODEL_PRICE_CACHE_VERSION) {
277
+ const sources = recordValue(cache.sources);
278
+ if (!sources || typeof cache.updatedAt !== "string")
279
+ throw new Error("Model price cache has an invalid schema");
280
+ for (const definition of this.sourceDefinitions) {
281
+ const sourceCache = recordValue(sources[definition.source]);
282
+ const table = parseLiteLlmPriceTable(sourceCache?.prices);
283
+ if (table.size === 0 || typeof sourceCache?.updatedAt !== "string")
284
+ continue;
285
+ this.sourceTables.set(definition.source, table);
286
+ this.sourceUpdatedAt.set(definition.source, sourceCache.updatedAt);
287
+ }
288
+ this.rebuildPriceTable(this.sourceTables);
289
+ if (!this.hasData())
290
+ throw new Error("Model price cache contains no valid prices");
291
+ this.lastSuccessfulUpdateAt = cache.updatedAt;
292
+ logger.info("ai.model_price_cache.loaded", {
293
+ cachePath: this.cachePath,
294
+ modelCount: this.prices.size,
295
+ updatedAt: cache.updatedAt
296
+ });
297
+ return;
298
+ }
299
+ const legacyCache = cache;
300
+ const legacyTable = parseLiteLlmPriceTable(legacyCache.prices);
301
+ if (legacyCache.version !== 1 || legacyTable.size === 0 || typeof legacyCache.updatedAt !== "string") {
302
+ throw new Error("Model price cache has an invalid schema");
303
+ }
304
+ this.sourceTables.set("litellm", legacyTable);
305
+ this.sourceUpdatedAt.set("litellm", legacyCache.updatedAt);
306
+ this.rebuildPriceTable(this.sourceTables);
307
+ this.lastSuccessfulUpdateAt = legacyCache.updatedAt;
308
+ logger.info("ai.model_price_cache.loaded_legacy", {
309
+ cachePath: this.cachePath,
310
+ modelCount: this.prices.size,
311
+ updatedAt: legacyCache.updatedAt
312
+ });
313
+ }
314
+ catch (error) {
315
+ if (error && typeof error === "object" && "code" in error && error.code === "ENOENT")
316
+ return;
317
+ logger.warn("ai.model_price_cache.load_failed", {
318
+ cachePath: this.cachePath,
319
+ error: sanitizeError(error)
320
+ });
321
+ }
322
+ }
323
+ async fetchSource(definition) {
324
+ const controller = new AbortController();
325
+ const timeout = setTimeout(() => controller.abort(), this.refreshTimeoutMs);
326
+ this.activeControllers.add(controller);
327
+ try {
328
+ const response = await this.fetchImpl(definition.url, {
329
+ headers: { accept: "application/json" },
330
+ signal: controller.signal
331
+ });
332
+ if (!response.ok)
333
+ throw new Error(`${definition.source} price response returned HTTP ${response.status}`);
334
+ const body = await response.text();
335
+ if (Buffer.byteLength(body, "utf8") > MODEL_PRICE_RESPONSE_MAX_BYTES) {
336
+ throw new Error(`${definition.source} price response exceeded the size limit`);
337
+ }
338
+ let payload;
339
+ try {
340
+ payload = JSON.parse(body);
341
+ }
342
+ catch {
343
+ throw new Error(`${definition.source} price response was not valid JSON`);
344
+ }
345
+ const table = parsePriceTable(definition.source, payload);
346
+ if (table.size === 0)
347
+ throw new Error(`${definition.source} price response contained no valid model prices`);
348
+ return { source: definition.source, table, updatedAt: this.now().toISOString() };
349
+ }
350
+ finally {
351
+ clearTimeout(timeout);
352
+ this.activeControllers.delete(controller);
353
+ }
354
+ }
355
+ rebuildPriceTable(sourceTables) {
356
+ const merged = new Map();
357
+ for (const definition of this.sourceDefinitions) {
358
+ const table = sourceTables.get(definition.source);
359
+ if (!table)
360
+ continue;
361
+ for (const [modelId, price] of table) {
362
+ if (!merged.has(modelId))
363
+ merged.set(modelId, price);
364
+ }
365
+ }
366
+ this.prices = merged;
367
+ return merged;
368
+ }
369
+ buildCache(updatedAt, sourceTables, sourceUpdatedAt) {
370
+ return {
371
+ version: MODEL_PRICE_CACHE_VERSION,
372
+ updatedAt,
373
+ sources: serializeSourceTables(this.sourceDefinitions, sourceTables, sourceUpdatedAt)
374
+ };
375
+ }
376
+ async fetchAndActivate() {
377
+ const results = await Promise.all(this.sourceDefinitions.map(async (definition) => {
378
+ try {
379
+ const result = await this.fetchSource(definition);
380
+ return { success: true, result };
381
+ }
382
+ catch (error) {
383
+ this.sourceRefreshStatus.set(definition.source, false);
384
+ if (!this.disposed) {
385
+ logger.warn("ai.model_price_source.refresh_failed", {
386
+ source: definition.source,
387
+ url: definition.url,
388
+ hasHistoricalCache: (this.sourceTables.get(definition.source)?.size ?? 0) > 0,
389
+ lastSuccessfulUpdateAt: this.sourceUpdatedAt.get(definition.source) ?? null,
390
+ error: sanitizeError(error)
391
+ });
392
+ }
393
+ return { success: false, source: definition.source };
394
+ }
395
+ }));
396
+ const successfulResults = results.filter((result) => result.success);
397
+ if (successfulResults.length === 0) {
398
+ logger.warn("ai.model_price_cache.refresh_failed", {
399
+ cachePath: this.cachePath ?? "test-only-no-persistence",
400
+ hasHistoricalCache: this.hasData(),
401
+ lastSuccessfulUpdateAt: this.lastSuccessfulUpdateAt,
402
+ successfulSourceCount: 0
403
+ });
404
+ return false;
405
+ }
406
+ const nextSourceTables = new Map(this.sourceTables);
407
+ const nextSourceUpdatedAt = new Map(this.sourceUpdatedAt);
408
+ for (const { result } of successfulResults) {
409
+ nextSourceTables.set(result.source, result.table);
410
+ nextSourceUpdatedAt.set(result.source, result.updatedAt);
411
+ this.sourceRefreshStatus.set(result.source, true);
412
+ }
413
+ const updatedAt = this.now().toISOString();
414
+ const nextPrices = this.rebuildPriceTable(nextSourceTables);
415
+ try {
416
+ this.persistCache(this.buildCache(updatedAt, nextSourceTables, nextSourceUpdatedAt));
417
+ }
418
+ catch (error) {
419
+ this.rebuildPriceTable(this.sourceTables);
420
+ logger.warn("ai.model_price_cache.persist_failed", {
421
+ cachePath: this.cachePath ?? "test-only-no-persistence",
422
+ error: sanitizeError(error)
423
+ });
424
+ return false;
425
+ }
426
+ this.sourceTables = nextSourceTables;
427
+ this.sourceUpdatedAt = nextSourceUpdatedAt;
428
+ this.prices = nextPrices;
429
+ this.lastSuccessfulUpdateAt = updatedAt;
430
+ logger.info("ai.model_price_cache.updated", {
431
+ cachePath: this.cachePath ?? "test-only-no-persistence",
432
+ modelCount: this.prices.size,
433
+ updatedAt,
434
+ successfulSources: successfulResults.map(({ result }) => result.source)
435
+ });
436
+ return true;
437
+ }
438
+ persistCache(cache) {
439
+ if (!this.cachePath)
440
+ return;
441
+ const directory = dirname(this.cachePath);
442
+ mkdirSync(directory, { recursive: true, mode: 0o700 });
443
+ const temporaryPath = `${this.cachePath}.${randomUUID()}.tmp`;
444
+ try {
445
+ writeFileSync(temporaryPath, JSON.stringify(cache), { encoding: "utf8", mode: 0o600 });
446
+ chmodSync(temporaryPath, 0o600);
447
+ renameSync(temporaryPath, this.cachePath);
448
+ chmodSync(this.cachePath, 0o600);
449
+ }
450
+ catch (error) {
451
+ try {
452
+ unlinkSync(temporaryPath);
453
+ }
454
+ catch {
455
+ // 临时文件清理失败不覆盖真正的写入错误,下一次更新会使用新的临时文件。
456
+ }
457
+ throw error;
458
+ }
459
+ }
460
+ scheduleNextUpdate() {
461
+ if (this.disposed || !this.started || !this.schedule)
462
+ return;
463
+ const current = this.now();
464
+ const next = nextLiteLlmPriceUpdate(current);
465
+ const delayMs = Math.max(1, next.getTime() - current.getTime());
466
+ this.refreshTimer = setTimeout(() => {
467
+ this.refreshTimer = null;
468
+ void this.refresh().finally(() => this.scheduleNextUpdate());
469
+ }, delayMs);
470
+ this.refreshTimer.unref?.();
471
+ logger.info("ai.model_price_cache.scheduled", {
472
+ nextUpdateAt: next.toISOString(),
473
+ delayMs
474
+ });
475
+ }
476
+ }
477
+ function usageTokenCount(value) {
478
+ const number = Number(value);
479
+ return Number.isFinite(number) ? Math.max(0, number) : 0;
480
+ }
481
+ function modelPrice(modelId, priceTable) {
482
+ const normalized = normalizedModelId(modelId);
483
+ if (!normalized)
484
+ return null;
485
+ const exact = priceTable.get(normalized);
486
+ if (exact)
487
+ return exact;
488
+ for (const [candidateModelId, price] of priceTable) {
489
+ if (normalizedModelId(candidateModelId).includes(normalized))
490
+ return price;
491
+ }
492
+ return null;
493
+ }
494
+ function cacheReadInputTokenPrice(price) {
495
+ return price.cache_read_input_token_cost
496
+ ?? price.input_cost_per_token_cache_hit
497
+ ?? price.input_cost_per_token;
498
+ }
499
+ function cacheCreationInputTokenPrice(price) {
500
+ return price.cache_creation_input_token_cost ?? price.input_cost_per_token;
501
+ }
502
+ export function estimateLiteLlmUsageCost(modelUsages, priceTable = new Map()) {
503
+ let estimatedCost = 0;
504
+ let pricedModelCount = 0;
505
+ let unpricedModelCount = 0;
506
+ for (const usage of modelUsages) {
507
+ const price = modelPrice(usage.modelId, priceTable);
508
+ if (!price) {
509
+ unpricedModelCount += 1;
510
+ continue;
511
+ }
512
+ pricedModelCount += 1;
513
+ const inputTokens = usageTokenCount(usage.inputTokens);
514
+ const outputTokens = usageTokenCount(usage.outputTokens);
515
+ const cachedInputTokens = Math.min(inputTokens, usageTokenCount(usage.cachedInputTokens));
516
+ const cacheWriteInputTokens = Math.min(Math.max(0, inputTokens - cachedInputTokens), usageTokenCount(usage.cacheWriteInputTokens));
517
+ const directInputTokens = Math.max(0, inputTokens - cachedInputTokens - cacheWriteInputTokens);
518
+ estimatedCost += directInputTokens * price.input_cost_per_token;
519
+ estimatedCost += cachedInputTokens * cacheReadInputTokenPrice(price);
520
+ estimatedCost += cacheWriteInputTokens * cacheCreationInputTokenPrice(price);
521
+ estimatedCost += outputTokens * price.output_cost_per_token;
522
+ }
523
+ return {
524
+ estimatedCost: pricedModelCount > 0 || modelUsages.length === 0 ? estimatedCost : null,
525
+ pricedModelCount,
526
+ unpricedModelCount,
527
+ pricingAvailable: priceTable.size > 0
528
+ };
529
+ }
530
+ //# sourceMappingURL=ai-model-pricing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-model-pricing.js","sourceRoot":"","sources":["../src/ai-model-pricing.ts"],"names":[],"mappings":"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"}