@kenz1117/dsh-ui-usage-billing 1.4.20 → 1.4.21
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/lib/index.js
CHANGED
|
@@ -2720,6 +2720,7 @@ function serializeFold(fold) {
|
|
|
2720
2720
|
bySite: Object.fromEntries(fold.bySite),
|
|
2721
2721
|
unpricedModels: [...fold.unpricedModels],
|
|
2722
2722
|
planCalls: Object.fromEntries(fold.planCalls),
|
|
2723
|
+
planSiteCalls: Object.fromEntries(fold.planSiteCalls),
|
|
2723
2724
|
turns: fold.turns,
|
|
2724
2725
|
perfDigest,
|
|
2725
2726
|
perfHourDigest,
|
|
@@ -2741,6 +2742,7 @@ function deserializeFold(fold) {
|
|
|
2741
2742
|
bySite: new Map(Object.entries(fold.bySite)),
|
|
2742
2743
|
unpricedModels: new Set(fold.unpricedModels),
|
|
2743
2744
|
planCalls: new Map(Object.entries(fold.planCalls)),
|
|
2745
|
+
planSiteCalls: new Map(Object.entries(fold.planSiteCalls ?? {})),
|
|
2744
2746
|
turns: fold.turns,
|
|
2745
2747
|
perf: [],
|
|
2746
2748
|
perfDigest: new Map(Object.entries(fold.perfDigest)),
|
|
@@ -2796,6 +2798,14 @@ function modelDayCell(map, day, modelKey) {
|
|
|
2796
2798
|
}
|
|
2797
2799
|
return usageCell(models, modelKey);
|
|
2798
2800
|
}
|
|
2801
|
+
/** 订阅计数的三维键:日期×模型×站点三元组的 JSON 形态(免分隔符转义歧义)。 */
|
|
2802
|
+
function planSiteKey(day, modelKey, siteKey) {
|
|
2803
|
+
return JSON.stringify([
|
|
2804
|
+
day,
|
|
2805
|
+
modelKey,
|
|
2806
|
+
siteKey
|
|
2807
|
+
]);
|
|
2808
|
+
}
|
|
2799
2809
|
/** Get-or-create one day×model×site cell inside the three-dimensional map. */
|
|
2800
2810
|
function modelDaySiteCell(map, day, modelKey, siteKey) {
|
|
2801
2811
|
let models = map.get(day);
|
|
@@ -2853,6 +2863,7 @@ function freshFold() {
|
|
|
2853
2863
|
bySite: /* @__PURE__ */ new Map(),
|
|
2854
2864
|
unpricedModels: /* @__PURE__ */ new Set(),
|
|
2855
2865
|
planCalls: /* @__PURE__ */ new Map(),
|
|
2866
|
+
planSiteCalls: /* @__PURE__ */ new Map(),
|
|
2856
2867
|
turns: [],
|
|
2857
2868
|
perf: [],
|
|
2858
2869
|
perfDigest: /* @__PURE__ */ new Map(),
|
|
@@ -3014,6 +3025,10 @@ function foldInto(fold, machine, events, subscriptionProviders, officialProvider
|
|
|
3014
3025
|
foldUsage(usageCell(fold.bySite, siteBucket), usage, modelKey, subscription, event.time, official, thisCost, unverifiedChannel);
|
|
3015
3026
|
foldUsage(usageCell(fold.byTier, tierAt(event.time)), usage, modelKey, subscription, event.time, official, thisCost, unverifiedChannel);
|
|
3016
3027
|
if (subscription) fold.planCalls.set(modelKey, (fold.planCalls.get(modelKey) ?? 0) + 1);
|
|
3028
|
+
if (subscription) {
|
|
3029
|
+
const sitePlanKey = planSiteKey(day, modelKey, siteBucket);
|
|
3030
|
+
fold.planSiteCalls.set(sitePlanKey, (fold.planSiteCalls.get(sitePlanKey) ?? 0) + 1);
|
|
3031
|
+
}
|
|
3017
3032
|
const turn = event.data.turn ?? -1;
|
|
3018
3033
|
const state = turnState(turns, turn);
|
|
3019
3034
|
state.model = modelKey;
|
|
@@ -3210,7 +3225,7 @@ function createUsageAggregator(persistence, options = {}) {
|
|
|
3210
3225
|
id,
|
|
3211
3226
|
...cwd === void 0 ? {} : { cwd },
|
|
3212
3227
|
...stamp === null ? {} : { stamp },
|
|
3213
|
-
foldVersion:
|
|
3228
|
+
foldVersion: 18,
|
|
3214
3229
|
fingerprint: foldFingerprint,
|
|
3215
3230
|
fold: serializeFold(fold)
|
|
3216
3231
|
};
|
|
@@ -3307,7 +3322,7 @@ function createUsageAggregator(persistence, options = {}) {
|
|
|
3307
3322
|
try {
|
|
3308
3323
|
const cwd = meta.cwd;
|
|
3309
3324
|
const ledgerRow = ledger.get(id);
|
|
3310
|
-
if (ledgerRow !== void 0 && ledgerRow.stamp !== void 0 && stamp !== null && ledgerRow.stamp === stamp && (ledgerRow.foldVersion ?? 1) ===
|
|
3325
|
+
if (ledgerRow !== void 0 && ledgerRow.stamp !== void 0 && stamp !== null && ledgerRow.stamp === stamp && (ledgerRow.foldVersion ?? 1) === 18 && ledgerRow.fingerprint === foldFingerprint) {
|
|
3311
3326
|
const fold = deserializeFold(ledgerRow.fold);
|
|
3312
3327
|
folds.push({
|
|
3313
3328
|
id,
|
|
@@ -3389,7 +3404,7 @@ function createUsageAggregator(persistence, options = {}) {
|
|
|
3389
3404
|
for (const entry of ledger.values()) {
|
|
3390
3405
|
if (included.has(entry.id)) continue;
|
|
3391
3406
|
try {
|
|
3392
|
-
const stale = (entry.foldVersion ?? 1) <
|
|
3407
|
+
const stale = (entry.foldVersion ?? 1) < 18 || entry.fingerprint !== foldFingerprint;
|
|
3393
3408
|
folds.push({
|
|
3394
3409
|
id: entry.id,
|
|
3395
3410
|
...entry.cwd === void 0 ? {} : { cwd: entry.cwd },
|
|
@@ -3415,6 +3430,7 @@ function createUsageAggregator(persistence, options = {}) {
|
|
|
3415
3430
|
const bySite = /* @__PURE__ */ new Map();
|
|
3416
3431
|
const unpricedModels = /* @__PURE__ */ new Set();
|
|
3417
3432
|
const planCalls = /* @__PURE__ */ new Map();
|
|
3433
|
+
const planSiteCalls = /* @__PURE__ */ new Map();
|
|
3418
3434
|
const sessionRows = [];
|
|
3419
3435
|
const turnRows = [];
|
|
3420
3436
|
const workspaceMap = /* @__PURE__ */ new Map();
|
|
@@ -3443,6 +3459,7 @@ function createUsageAggregator(persistence, options = {}) {
|
|
|
3443
3459
|
for (const [toolName, count] of fold.byTool) byTool.set(toolName, (byTool.get(toolName) ?? 0) + count);
|
|
3444
3460
|
for (const id of fold.unpricedModels) unpricedModels.add(id);
|
|
3445
3461
|
for (const [modelKey, count] of fold.planCalls) planCalls.set(modelKey, (planCalls.get(modelKey) ?? 0) + count);
|
|
3462
|
+
for (const [key, count] of fold.planSiteCalls) planSiteCalls.set(key, (planSiteCalls.get(key) ?? 0) + count);
|
|
3446
3463
|
for (const sample of fold.perf) {
|
|
3447
3464
|
let modelAccum = perfModel.get(sample.model);
|
|
3448
3465
|
if (modelAccum === void 0) {
|
|
@@ -3525,7 +3542,12 @@ function createUsageAggregator(persistence, options = {}) {
|
|
|
3525
3542
|
return record;
|
|
3526
3543
|
};
|
|
3527
3544
|
const toModelDayRecord = (map) => Object.fromEntries([...map].map(([day, models]) => [day, Object.fromEntries(models)]));
|
|
3528
|
-
const toModelDaySiteRecord = (map) => Object.fromEntries([...map].map(([day, models]) => [day, Object.fromEntries([...models].map(([model, sites]) => [model, Object.fromEntries(sites
|
|
3545
|
+
const toModelDaySiteRecord = (map) => Object.fromEntries([...map].map(([day, models]) => [day, Object.fromEntries([...models].map(([model, sites]) => [model, Object.fromEntries([...sites].map(([site, cell]) => {
|
|
3546
|
+
return [site, (planSiteCalls.get(planSiteKey(day, model, site)) ?? 0) === cell.calls && cell.calls > 0 ? {
|
|
3547
|
+
...cell,
|
|
3548
|
+
plan: true
|
|
3549
|
+
} : cell];
|
|
3550
|
+
}))]))]));
|
|
3529
3551
|
const modelKeys = /* @__PURE__ */ new Set([...perfModel.keys(), ...perfModelDigest.keys()]);
|
|
3530
3552
|
const hourKeys = /* @__PURE__ */ new Set([...perfHourModel.keys(), ...perfHourDigest.keys()]);
|
|
3531
3553
|
const perf = modelKeys.size === 0 && hourKeys.size === 0 ? void 0 : {
|
package/lib/types/aggregate.d.ts
CHANGED
|
@@ -464,6 +464,10 @@ export interface SessionFold {
|
|
|
464
464
|
unpricedModels: Set<string>;
|
|
465
465
|
/** 每个模型 key 在本会话内走订阅通道的调用数(合并时跨会话累加判定 plan)。 */
|
|
466
466
|
planCalls: Map<string, number>;
|
|
467
|
+
/** 三维格(日期×模型×站点)各自的订阅调用数,键 = {@link planSiteKey}:
|
|
468
|
+
* provider 视图的行 plan 按本格判定,不再借模型全局口径(混通道模型会把
|
|
469
|
+
* 本格全订阅的行判成无标记)。 */
|
|
470
|
+
planSiteCalls: Map<string, number>;
|
|
467
471
|
/** 每轮费用明细(按轮次号升序,不含 sessionId);sessionId 在合并时补齐。 */
|
|
468
472
|
turns: SessionTurnRow[];
|
|
469
473
|
/** 性能样本(有可测 TTFT 的调用,按事件次序折叠);仅进程内折叠产生,
|
|
@@ -505,6 +509,8 @@ export interface SerializedSessionFold {
|
|
|
505
509
|
bySite: Record<string, ModelUsage>;
|
|
506
510
|
unpricedModels: string[];
|
|
507
511
|
planCalls: Record<string, number>;
|
|
512
|
+
/** 三维格订阅计数;旧账本行缺失(合并按空处理,格级 plan 保守不置位)。 */
|
|
513
|
+
planSiteCalls?: Record<string, number>;
|
|
508
514
|
turns: SessionTurnRow[];
|
|
509
515
|
/** v16 起以摘要持久化性能(体积 O(模型数) 而非 O(样本数));旧行的
|
|
510
516
|
* `perf` 逐样本数组由加载边界迁移转换为摘要。 */
|
|
@@ -554,7 +560,7 @@ export interface UsageLedgerDocument {
|
|
|
554
560
|
* 会话费用只剩最近一段,issue #29)。
|
|
555
561
|
* 持久账本行据此区分新旧算法:日志已删/不可读而只能沿用旧行时,UI 标注置信度提示。
|
|
556
562
|
*/
|
|
557
|
-
export declare const FOLD_VERSION =
|
|
563
|
+
export declare const FOLD_VERSION = 18;
|
|
558
564
|
/**
|
|
559
565
|
* 一次性账本迁移:id 唯一,apply 在加载边界对原始文档执行,已应用过的跳过。
|
|
560
566
|
* 未来账本/schema 字段变更(重命名、拆桶、语义调整)时,在此追加一条迁移并
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** Locale dictionaries for the usage billing surface. */
|
|
2
|
-
export type UsageBillingKey = 'title' | 'cost' | 'todayCost' | 'monthCost' | 'yearCost' | 'monthProjected' | 'liveTurn' | 'liveSession' | 'calls' | 'cacheHitRate' | 'tokens' | 'inputTokens' | 'outputTokens' | 'avgCost' | 'kpiRange' | 'avgRangeToday' | 'avgRange7d' | 'avgRangeWeek' | 'avgRangeMonth' | 'avgRangeAll' | 'trend' | 'trend7d' | 'trend30d' | 'trendMetric' | 'trendMetricCost' | 'trendMetricTokens' | 'pricingSearch' | 'bandPinHint' | 'trendEmpty' | 'trendTotal' | 'roundsUnit' | 'healthModelsLive' | 'healthVendorsDown' | 'healthVendorsUnavailable' | 'budget' | 'budgetRemain' | 'budgetAmount' | 'budgetSummary' | 'sessions' | 'sessionTitle' | 'lastActive' | 'sessionOverflow' | 'budgetTierBody' | 'models' | 'providerBilling' | 'channelUnknown' | 'directTag' | 'relayTag' | 'unknownTag' | 'unknownChannelHint' | 'planCountUnit' | 'actual' | 'pricing' | 'input' | 'output' | 'cacheHit' | 'peak' | 'offPeak' | 'flat' | 'band' | 'close' | 'footer' | 'footerCredit' | 'lastUpdated' | 'noData' | 'todayRate' | 'rateLive' | 'rateBuiltin' | 'pricingSyncedAt' | 'pricingSyncNow' | 'pricingSyncing' | 'promoBadge' | 'promoUntil' | 'promoOpenEnded' | 'pricingTip' | 'pricingUnit' | 'pricingNotes' | 'ubPeak' | 'ubOff' | 'ubStd' | 'peakBand' | 'pricingSource' | 'noteCache' | 'noteBand' | 'noteSource' | 'balance' | 'recharge' | 'rechargeHint' | 'balanceUnconfigured' | 'balanceUnauthorized' | 'balanceUnreachable' | 'uncatalogued' | 'estimatedPricing' | 'balanceDays' | 'balanceLowBody' | 'reconcileDrift' | 'reconcileDismiss' | 'subscriptionNotConfigured' | 'subscriptionUnauthorized' | 'subscriptionUnavailable' | 'subscriptionInvalid' | 'subscriptionRateLimited' | 'subscriptionSession' | 'subscriptionWeekly' | 'subscriptionMonthly' | 'subscriptionBilling' | 'subscriptionRemaining' | 'subscriptionExhausted' | 'subscriptionReset' | 'subscriptionNoApi' | 'floatWindow' | 'floatModeCombined' | 'floatModeSubscription' | 'floatMode' | 'floatTargets' | 'floatWindowHint' | 'floatPrimaryToday' | 'floatPrimaryWeek' | 'floatPrimaryMonth' | 'floatNoTargets' | 'floatNoTargetsHint' | 'cardDisplay' | 'cardDisplayHint' | 'cardMetric' | 'cardMetricMoney' | 'cardMetricTokens' | 'cardSpan' | 'cardSpanDay' | 'cardSpanWeek' | 'cardSpanMonth' | 'triggerMonthTokens' | 'triggerTodayTokens' | 'triggerWeekTokens' | 'subscriptionsStale' | 'staleLedgerNotice' | 'unreadableNotice' | 'tokenCacheWrite' | 'toolRank' | 'toolName' | 'userPrices' | 'userPricesHint' | 'userPriceSave' | 'userPriceModel' | 'userPriceSource' | 'userPriceSourceHint' | 'userPriceOffPeak' | 'userPriceNormal' | 'userPriceCurrency' | 'userPriceAdd' | 'userPriceRemoveSelected' | 'userPriceSelect' | 'sessionStaleBadge' | 'sessionUntitled' | 'heatmapLess' | 'heatmapMore' | 'currency' | 'currencyCny' | 'currencyUsd' | 'currencyEur' | 'language' | 'heatmap' | 'rounds' | 'roundsHint' | 'anomaly' | 'model' | 'thModel' | 'thInputMiss' | 'thInputHit' | 'costAbbr' | 'tabOverview' | 'tabTrends' | 'tabProviders' | 'tabPricing' | 'tabSettings' | 'budgetHint' | 'peakAlertHint' | 'peakAlertDescPeak' | 'peakAlertDescOff' | 'peakAlertDescPeakZhipu' | 'peakAlertDescOffZhipu' | 'export' | 'exportCsvDay' | 'exportCsvSession' | 'exportJson' | 'peakShare' | 'peakSharePerCall' | 'offPeakSavings' | 'perfMax' | 'weekCost' | 'roleCost' | 'roleUser' | 'roleAssistant' | 'roleTool' | 'roleHint' | 'tierPeak' | 'tierOff' | 'tierToPeak' | 'tierToOff' | 'tierAlertEnterPeak' | 'tierAlertEnterOff' | 'tierAlertEnterPeakZhipu' | 'tierAlertEnterOffZhipu' | 'peakAlertTitlePeak' | 'peakAlertTitleOff' | 'peakAlert' | 'peakAlertLeadMin' | 'peakAlertPos' | 'peakAlertMode' | 'peakAlertPosCorner' | 'peakAlertPosCenter' | 'peakAlertModePeak' | 'peakAlertModeOff' | 'peakAlertModeBoth' | 'peakAlertWebNotify' | 'peakAlertPreview' | 'planTypeCode' | 'planTypeToken' | 'subscriptionFeePerMonth' | 'triggerToday' | 'triggerMonth' | 'subscriptionTag' | 'free' | 'perfSamples' | 'perfTtft' | 'perfP50' | 'perfP90' | 'perfTps' | 'perfLatency' | 'perfEstimated' | 'perfEmpty' | 'perfTpsUnit' | 'perfTitle' | 'perfHint' | 'perfAll' | 'perfChartEmpty' | 'heatmapYear' | 'heatmapHalf' | 'heatmapMonth' | 'metricCost' | 'metricTokens' | 'heatmapTotal' | 'activeDays' | 'streakDays' | 'subscriptionAutoDetect' | 'pluginAuthor' | 'pluginRepository' | 'pluginNpm' | 'pluginLicense' | 'tabToken' | 'tokenExport' | 'tokenExportCsv' | 'tokenReasoningShare' | 'tokenReasoningShort' | 'tokenIo' | 'tokenPeak' | 'tokenDaily' | 'tokenByModel' | 'tokenMiss' | 'tokenHit' | 'tokenOutput' | 'tokenViewStructure' | 'tokenViewModel' | 'tokenHitShort' | 'tokenMissShort' | 'tokenTotal' | 'tokenShare' | 'usageStatsTool' | 'usageStatsToolHint' | 'balanceGranted' | 'balanceTopped' | 'balanceDaily' | 'balanceDaysLong' | 'balanceDaysUnit' | 'popTodayModel' | 'popNoConsumption' | 'popTitle' | 'popDirectLead' | 'popSubLead' | 'unpricedHint' | 'searchEstimateHint' | 'siteListDisplay' | 'siteListDisplayHint' | 'liveCostBar' | 'liveCostBarHint' | 'liveCostBarPosition' | 'liveCostBarPosBelow' | 'liveCostBarPosAbove' | 'liveCostBarPosToolbar' | 'exportCsvSite' | 'panelRelayQuota' | 'relayBalance' | 'relayNoQuota' | 'relayWindowUsed' | 'relayKindNewApi' | 'relayKindSub2Api' | 'relayKindUnknown' | 'expandAll' | 'collapseAll' | 'todayOnly' | 'todayNoConsumption';
|
|
2
|
+
export type UsageBillingKey = 'title' | 'cost' | 'todayCost' | 'monthCost' | 'yearCost' | 'monthProjected' | 'liveTurn' | 'liveSession' | 'calls' | 'cacheHitRate' | 'tokens' | 'inputTokens' | 'outputTokens' | 'avgCost' | 'kpiRange' | 'avgRangeToday' | 'avgRange7d' | 'avgRangeWeek' | 'avgRangeMonth' | 'avgRangeAll' | 'trend' | 'trend7d' | 'trend30d' | 'trendMetric' | 'trendMetricCost' | 'trendMetricTokens' | 'pricingSearch' | 'bandPinHint' | 'trendEmpty' | 'trendTotal' | 'roundsUnit' | 'healthModelsLive' | 'healthVendorsDown' | 'healthVendorsUnavailable' | 'budget' | 'budgetRemain' | 'budgetAmount' | 'budgetSummary' | 'sessions' | 'sessionTitle' | 'lastActive' | 'sessionOverflow' | 'budgetTierBody' | 'models' | 'providerBilling' | 'channelUnknown' | 'directTag' | 'relayTag' | 'unknownTag' | 'unknownChannelHint' | 'planCountUnit' | 'actual' | 'pricing' | 'input' | 'output' | 'cacheHit' | 'peak' | 'offPeak' | 'flat' | 'band' | 'close' | 'footer' | 'footerCredit' | 'lastUpdated' | 'noData' | 'todayRate' | 'rateLive' | 'rateBuiltin' | 'pricingSyncedAt' | 'pricingSyncNow' | 'pricingSyncing' | 'promoBadge' | 'promoUntil' | 'promoOpenEnded' | 'pricingTip' | 'pricingUnit' | 'pricingNotes' | 'ubPeak' | 'ubOff' | 'ubStd' | 'peakBand' | 'pricingSource' | 'noteCache' | 'noteBand' | 'noteSource' | 'balance' | 'recharge' | 'rechargeHint' | 'balanceUnconfigured' | 'balanceUnauthorized' | 'balanceUnreachable' | 'uncatalogued' | 'estimatedPricing' | 'balanceDays' | 'balanceLowBody' | 'reconcileDrift' | 'reconcileDismiss' | 'subscriptionNotConfigured' | 'subscriptionUnauthorized' | 'subscriptionUnavailable' | 'subscriptionInvalid' | 'subscriptionRateLimited' | 'subscriptionSession' | 'subscriptionWeekly' | 'subscriptionMonthly' | 'subscriptionBilling' | 'subscriptionRemaining' | 'subscriptionExhausted' | 'subscriptionReset' | 'subscriptionNoApi' | 'floatWindow' | 'floatModeCombined' | 'floatModeSubscription' | 'floatMode' | 'floatTargets' | 'floatWindowHint' | 'floatPrimaryToday' | 'floatPrimaryWeek' | 'floatPrimaryMonth' | 'floatNoTargets' | 'floatNoTargetsHint' | 'cardDisplay' | 'cardDisplayHint' | 'cardMetric' | 'cardMetricMoney' | 'cardMetricTokens' | 'cardSpan' | 'cardSpanDay' | 'cardSpanWeek' | 'cardSpanMonth' | 'triggerMonthTokens' | 'triggerTodayTokens' | 'triggerWeekTokens' | 'subscriptionsStale' | 'staleLedgerNotice' | 'unreadableNotice' | 'tokenCacheWrite' | 'toolRank' | 'toolName' | 'userPrices' | 'userPricesHint' | 'userPriceSave' | 'userPriceModel' | 'userPriceSource' | 'userPriceSourceHint' | 'userPriceOffPeak' | 'userPriceNormal' | 'userPriceCurrency' | 'userPriceAdd' | 'userPriceRemoveSelected' | 'userPriceSelect' | 'sessionStaleBadge' | 'sessionUntitled' | 'heatmapLess' | 'heatmapMore' | 'currency' | 'currencyCny' | 'currencyUsd' | 'currencyEur' | 'language' | 'heatmap' | 'rounds' | 'roundsHint' | 'anomaly' | 'model' | 'thModel' | 'thInputMiss' | 'thInputHit' | 'costAbbr' | 'tabOverview' | 'tabTrends' | 'tabProviders' | 'tabPricing' | 'tabSettings' | 'budgetHint' | 'peakAlertHint' | 'peakAlertDescPeak' | 'peakAlertDescOff' | 'peakAlertDescPeakZhipu' | 'peakAlertDescOffZhipu' | 'export' | 'exportCsvDay' | 'exportCsvSession' | 'exportJson' | 'peakShare' | 'peakSharePerCall' | 'offPeakSavings' | 'perfMax' | 'weekCost' | 'roleCost' | 'roleUser' | 'roleAssistant' | 'roleTool' | 'roleHint' | 'tierPeak' | 'tierOff' | 'tierToPeak' | 'tierToOff' | 'tierAlertEnterPeak' | 'tierAlertEnterOff' | 'tierAlertEnterPeakZhipu' | 'tierAlertEnterOffZhipu' | 'peakAlertTitlePeak' | 'peakAlertTitleOff' | 'peakAlert' | 'peakAlertLeadMin' | 'peakAlertPos' | 'peakAlertMode' | 'peakAlertPosCorner' | 'peakAlertPosCenter' | 'peakAlertModePeak' | 'peakAlertModeOff' | 'peakAlertModeBoth' | 'peakAlertWebNotify' | 'peakAlertPreview' | 'planTypeCode' | 'planTypeToken' | 'subscriptionFeePerMonth' | 'triggerToday' | 'triggerMonth' | 'subscriptionTag' | 'cellEstimateHint' | 'free' | 'perfSamples' | 'perfTtft' | 'perfP50' | 'perfP90' | 'perfTps' | 'perfLatency' | 'perfEstimated' | 'perfEmpty' | 'perfTpsUnit' | 'perfTitle' | 'perfHint' | 'perfAll' | 'perfChartEmpty' | 'heatmapYear' | 'heatmapHalf' | 'heatmapMonth' | 'metricCost' | 'metricTokens' | 'heatmapTotal' | 'activeDays' | 'streakDays' | 'subscriptionAutoDetect' | 'pluginAuthor' | 'pluginRepository' | 'pluginNpm' | 'pluginLicense' | 'tabToken' | 'tokenExport' | 'tokenExportCsv' | 'tokenReasoningShare' | 'tokenReasoningShort' | 'tokenIo' | 'tokenPeak' | 'tokenDaily' | 'tokenByModel' | 'tokenMiss' | 'tokenHit' | 'tokenOutput' | 'tokenViewStructure' | 'tokenViewModel' | 'tokenHitShort' | 'tokenMissShort' | 'tokenTotal' | 'tokenShare' | 'usageStatsTool' | 'usageStatsToolHint' | 'balanceGranted' | 'balanceTopped' | 'balanceDaily' | 'balanceDaysLong' | 'balanceDaysUnit' | 'popTodayModel' | 'popNoConsumption' | 'popTitle' | 'popDirectLead' | 'popSubLead' | 'unpricedHint' | 'searchEstimateHint' | 'siteListDisplay' | 'siteListDisplayHint' | 'liveCostBar' | 'liveCostBarHint' | 'liveCostBarPosition' | 'liveCostBarPosBelow' | 'liveCostBarPosAbove' | 'liveCostBarPosToolbar' | 'exportCsvSite' | 'panelRelayQuota' | 'relayBalance' | 'relayNoQuota' | 'relayWindowUsed' | 'relayKindNewApi' | 'relayKindSub2Api' | 'relayKindUnknown' | 'expandAll' | 'collapseAll' | 'todayOnly' | 'todayNoConsumption';
|
|
3
3
|
export declare const NS = "usageBilling";
|
|
4
4
|
export declare const zh: Record<UsageBillingKey, string>;
|
|
5
5
|
export declare const en: Record<UsageBillingKey, string>;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kenz1117/dsh-ui-usage-billing",
|
|
3
3
|
"description": "Usage billing dashboard for DeepSeek Harness: sidebar cost metrics plus a full dashboard modal, priced from a current multi-provider catalog with real usage aggregated from session logs.",
|
|
4
|
-
"version": "1.4.
|
|
4
|
+
"version": "1.4.21",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"deepseek-harness",
|
|
7
7
|
"deepseek",
|