@kenz1117/dsh-ui-usage-billing 1.0.29 → 1.0.30
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/client.js +3 -3
- package/lib/index.js +16 -9
- package/lib/types/aggregate.d.ts +7 -3
- package/lib/types/client/locales.d.ts +1 -1
- package/package.json +1 -1
package/lib/index.js
CHANGED
|
@@ -1797,14 +1797,15 @@ const OFFICIAL_DEEPSEEK_ORIGIN = "https://api.deepseek.com";
|
|
|
1797
1797
|
* 官方渠道判定(通道优先):显式 `officialProviderIds` 配置最优先;否则看站点归组——
|
|
1798
1798
|
* 有 baseURL 的路由只有 origin 为 DeepSeek 官方域才算官方(修复:名为 `deepseek-*`
|
|
1799
1799
|
* 的中转/网关路由曾被按 id 前缀误判为官方,腾讯网关的 DeepSeek 全被计成官方渠道);
|
|
1800
|
-
* 直连路由(配置在册、无 baseURL
|
|
1801
|
-
*
|
|
1800
|
+
* 直连路由(配置在册、无 baseURL)与路由表查不到的未知名都退回按 provider id
|
|
1801
|
+
* 前缀判定——宿主内置的官方直连不经 llm-pi-ai 路由,其 provider 名不在路由表中,
|
|
1802
|
+
* 按 unknown 一刀切会把它错杀成三方(回归修复);配置外的同名网关残留可用
|
|
1803
|
+
* `routeAliases` 显式归位到真实通道。
|
|
1802
1804
|
*/
|
|
1803
1805
|
function officialChannelOf(provider, ref, officialProviderIds) {
|
|
1804
1806
|
if (officialProviderIds !== void 0) return officialProviderIds.has(provider);
|
|
1805
1807
|
if (ref.kind === "site") return ref.origin === OFFICIAL_DEEPSEEK_ORIGIN;
|
|
1806
|
-
|
|
1807
|
-
return false;
|
|
1808
|
+
return isOfficialProvider(provider);
|
|
1808
1809
|
}
|
|
1809
1810
|
/** 一个 provider 是否走订阅套餐计费(豁免按 token 计价)。 */
|
|
1810
1811
|
function isSubscriptionCall(subscription, provider) {
|
|
@@ -1839,6 +1840,10 @@ function siteRefOf(provider, routes) {
|
|
|
1839
1840
|
provider
|
|
1840
1841
|
};
|
|
1841
1842
|
}
|
|
1843
|
+
if (isOfficialProvider(provider)) return {
|
|
1844
|
+
kind: "direct",
|
|
1845
|
+
provider
|
|
1846
|
+
};
|
|
1842
1847
|
return {
|
|
1843
1848
|
kind: "unknown",
|
|
1844
1849
|
provider
|
|
@@ -2005,7 +2010,8 @@ function serializeFold(fold) {
|
|
|
2005
2010
|
turns: fold.turns,
|
|
2006
2011
|
perf: fold.perf,
|
|
2007
2012
|
roles: fold.roles,
|
|
2008
|
-
lastActive: fold.lastActive
|
|
2013
|
+
lastActive: fold.lastActive,
|
|
2014
|
+
...fold.title !== void 0 ? { title: fold.title } : {}
|
|
2009
2015
|
};
|
|
2010
2016
|
}
|
|
2011
2017
|
/** Restore a JSON-safe ledger fold into the in-memory Map/Set representation. */
|
|
@@ -2024,7 +2030,8 @@ function deserializeFold(fold) {
|
|
|
2024
2030
|
turns: fold.turns,
|
|
2025
2031
|
perf: fold.perf,
|
|
2026
2032
|
roles: fold.roles,
|
|
2027
|
-
lastActive: fold.lastActive
|
|
2033
|
+
lastActive: fold.lastActive,
|
|
2034
|
+
...fold.title !== void 0 ? { title: fold.title } : {}
|
|
2028
2035
|
};
|
|
2029
2036
|
}
|
|
2030
2037
|
/** Runtime boundary for a user-editable/corrupt ledger file. Invalid rows are ignored. */
|
|
@@ -2423,7 +2430,7 @@ function createUsageAggregator(persistence, options = {}) {
|
|
|
2423
2430
|
id,
|
|
2424
2431
|
...cwd === void 0 ? {} : { cwd },
|
|
2425
2432
|
...stamp === null ? {} : { stamp },
|
|
2426
|
-
foldVersion:
|
|
2433
|
+
foldVersion: 10,
|
|
2427
2434
|
fold: serializeFold(fold)
|
|
2428
2435
|
};
|
|
2429
2436
|
const row = ledger.get(id);
|
|
@@ -2501,7 +2508,7 @@ function createUsageAggregator(persistence, options = {}) {
|
|
|
2501
2508
|
try {
|
|
2502
2509
|
const cwd = meta.cwd;
|
|
2503
2510
|
const ledgerRow = ledger.get(id);
|
|
2504
|
-
if (ledgerRow !== void 0 && ledgerRow.stamp !== void 0 && stamp !== null && ledgerRow.stamp === stamp && (ledgerRow.foldVersion ?? 1) ===
|
|
2511
|
+
if (ledgerRow !== void 0 && ledgerRow.stamp !== void 0 && stamp !== null && ledgerRow.stamp === stamp && (ledgerRow.foldVersion ?? 1) === 10) {
|
|
2505
2512
|
const fold = deserializeFold(ledgerRow.fold);
|
|
2506
2513
|
cache.set(id, {
|
|
2507
2514
|
stamp,
|
|
@@ -2585,7 +2592,7 @@ function createUsageAggregator(persistence, options = {}) {
|
|
|
2585
2592
|
for (const entry of ledger.values()) {
|
|
2586
2593
|
if (included.has(entry.id)) continue;
|
|
2587
2594
|
try {
|
|
2588
|
-
const stale = (entry.foldVersion ?? 1) <
|
|
2595
|
+
const stale = (entry.foldVersion ?? 1) < 10;
|
|
2589
2596
|
folds.push({
|
|
2590
2597
|
id: entry.id,
|
|
2591
2598
|
...entry.cwd === void 0 ? {} : { cwd: entry.cwd },
|
package/lib/types/aggregate.d.ts
CHANGED
|
@@ -35,8 +35,10 @@ export declare const OFFICIAL_DEEPSEEK_ORIGIN = "https://api.deepseek.com";
|
|
|
35
35
|
* 官方渠道判定(通道优先):显式 `officialProviderIds` 配置最优先;否则看站点归组——
|
|
36
36
|
* 有 baseURL 的路由只有 origin 为 DeepSeek 官方域才算官方(修复:名为 `deepseek-*`
|
|
37
37
|
* 的中转/网关路由曾被按 id 前缀误判为官方,腾讯网关的 DeepSeek 全被计成官方渠道);
|
|
38
|
-
* 直连路由(配置在册、无 baseURL
|
|
39
|
-
*
|
|
38
|
+
* 直连路由(配置在册、无 baseURL)与路由表查不到的未知名都退回按 provider id
|
|
39
|
+
* 前缀判定——宿主内置的官方直连不经 llm-pi-ai 路由,其 provider 名不在路由表中,
|
|
40
|
+
* 按 unknown 一刀切会把它错杀成三方(回归修复);配置外的同名网关残留可用
|
|
41
|
+
* `routeAliases` 显式归位到真实通道。
|
|
40
42
|
*/
|
|
41
43
|
export declare function officialChannelOf(provider: string, ref: SiteRef, officialProviderIds?: ReadonlySet<string>): boolean;
|
|
42
44
|
/**
|
|
@@ -409,6 +411,8 @@ export interface SerializedSessionFold {
|
|
|
409
411
|
byModel: Record<string, ModelUsage>;
|
|
410
412
|
byDay: Record<string, ModelUsage>;
|
|
411
413
|
byDayModels: Record<string, Record<string, ModelUsage>>;
|
|
414
|
+
/** 会话标题(session/title 事件的最新文本);1.0.30 前的账本行不持久化它,缺失回退 id。 */
|
|
415
|
+
title?: string;
|
|
412
416
|
/** 1.0.10(issue #16)新增;模型×日期×站点三维,旧账本行缺失(合并按空处理)。 */
|
|
413
417
|
byDayModelsSite?: Record<string, Record<string, Record<string, ModelUsage>>>;
|
|
414
418
|
/** 1.0.8 起新增;旧账本行缺失(合并时按空处理,不触发重折算)。 */
|
|
@@ -457,7 +461,7 @@ export interface UsageLedgerDocument {
|
|
|
457
461
|
* 会话费用只剩最近一段,issue #29)。
|
|
458
462
|
* 持久账本行据此区分新旧算法:日志已删/不可读而只能沿用旧行时,UI 标注置信度提示。
|
|
459
463
|
*/
|
|
460
|
-
export declare const FOLD_VERSION =
|
|
464
|
+
export declare const FOLD_VERSION = 10;
|
|
461
465
|
/**
|
|
462
466
|
* 一次性账本迁移:id 唯一,apply 在加载边界对原始文档执行,已应用过的跳过。
|
|
463
467
|
* 未来账本/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' | 'trend' | 'trend7d' | 'trend30d' | 'trendMetric' | 'trendMetricCost' | 'trendMetricTokens' | 'trendEmpty' | 'budget' | 'budgetAmount' | 'budgetSummary' | 'sessions' | 'sessionTitle' | 'project' | 'lastActive' | 'sessionOverflow' | 'budgetTierBody' | 'models' | 'providerBilling' | 'channelUnknown' | 'actual' | 'pricing' | 'input' | 'output' | 'cacheHit' | 'peak' | 'offPeak' | 'flat' | 'band' | 'close' | 'footer' | 'footerCredit' | 'lastUpdated' | 'noData' | 'todayRate' | 'rateLive' | 'rateBuiltin' | 'promoBadge' | 'promoUntil' | 'promoOpenEnded' | 'pricingTip' | 'pricingUnit' | 'pricingNotes' | 'ubPeak' | 'ubOff' | 'ubStd' | 'peakBand' | 'pricingSource' | 'noteCache' | 'noteBand' | 'noteSource' | 'balance' | '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' | 'floatNoTargets' | 'floatNoTargetsHint' | 'cardDisplay' | 'cardDisplayHint' | 'cardMetric' | 'cardMetricMoney' | 'cardMetricTokens' | 'triggerMonthTokens' | 'subscriptionsStale' | 'staleLedgerNotice' | 'tokenCacheWrite' | 'toolRank' | 'toolName' | 'userPrices' | 'userPricesHint' | 'userPriceSave' | 'userPriceModel' | 'userPriceSource' | 'userPriceSourceHint' | 'userPriceOffPeak' | 'userPriceNormal' | 'userPriceCurrency' | 'userPriceAdd' | 'userPriceRemoveSelected' | 'userPriceSelect' | 'sessionStaleBadge' | 'heatmapLess' | 'heatmapMore' | 'currency' | 'currencyCny' | 'currencyUsd' | 'heatmap' | 'rounds' | 'roundsHint' | 'anomaly' | 'workspaces' | 'workspacesHint' | 'model' | 'thModel' | 'thInputMiss' | 'thInputHit' | 'costAbbr' | 'tabOverview' | 'tabTrends' | 'tabProviders' | 'tabPricing' | 'tabSettings' | 'budgetHint' | 'peakAlertHint' | 'peakAlertDescPeak' | 'peakAlertDescOff' | 'export' | 'exportCsvDay' | 'exportCsvSession' | 'exportJson' | 'peakShare' | 'peakSharePerCall' | 'offPeakSavings' | 'perfMax' | 'weekCost' | 'roleCost' | 'roleUser' | 'roleAssistant' | 'roleTool' | 'roleHint' | 'tierPeak' | 'tierOff' | 'tierToPeak' | 'tierToOff' | 'tierAlertEnterPeak' | 'tierAlertEnterOff' | 'peakAlertTitlePeak' | 'peakAlertTitleOff' | 'peakAlert' | 'peakAlertLeadMin' | 'peakAlertPos' | 'peakAlertMode' | 'peakAlertPosCorner' | 'peakAlertPosCenter' | 'peakAlertModePeak' | 'peakAlertModeOff' | 'peakAlertModeBoth' | 'peakAlertWebNotify' | 'peakAlertPreview' | 'planTypeCode' | 'planTypeToken' | 'subscriptionFeePerMonth' | 'triggerToday' | 'triggerMonth' | 'subscriptionIncluded' | 'free' | 'official' | 'thirdParty' | 'perfSamples' | 'perfTtft' | 'perfP50' | 'perfP90' | 'perfTps' | 'perfLatency' | 'perfEstimated' | 'perfEmpty' | 'perfTpsUnit' | 'perfTitle' | 'perfHint' | 'perfAll' | 'perfChartEmpty' | 'heatmapYear' | 'heatmapMonth' | 'activeDays' | 'streakDays' | 'subscriptionAutoDetect' | 'pluginVersion' | 'pluginAuthor' | 'pluginRepository' | 'pluginNpm' | 'pluginLicense' | 'tabToken' | 'tokenExport' | 'tokenExportCsv' | 'tokenCacheHitRate' | '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';
|
|
2
|
+
export type UsageBillingKey = 'title' | 'cost' | 'todayCost' | 'monthCost' | 'yearCost' | 'monthProjected' | 'liveTurn' | 'liveSession' | 'calls' | 'cacheHitRate' | 'tokens' | 'inputTokens' | 'outputTokens' | 'avgCost' | 'trend' | 'trend7d' | 'trend30d' | 'trendMetric' | 'trendMetricCost' | 'trendMetricTokens' | 'trendEmpty' | 'budget' | 'budgetAmount' | 'budgetSummary' | 'sessions' | 'sessionTitle' | 'project' | 'lastActive' | 'sessionOverflow' | 'budgetTierBody' | 'models' | 'providerBilling' | 'channelUnknown' | 'actual' | 'pricing' | 'input' | 'output' | 'cacheHit' | 'peak' | 'offPeak' | 'flat' | 'band' | 'close' | 'footer' | 'footerCredit' | 'lastUpdated' | 'noData' | 'todayRate' | 'rateLive' | 'rateBuiltin' | 'promoBadge' | 'promoUntil' | 'promoOpenEnded' | 'pricingTip' | 'pricingUnit' | 'pricingNotes' | 'ubPeak' | 'ubOff' | 'ubStd' | 'peakBand' | 'pricingSource' | 'noteCache' | 'noteBand' | 'noteSource' | 'balance' | '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' | 'floatNoTargets' | 'floatNoTargetsHint' | 'cardDisplay' | 'cardDisplayHint' | 'cardMetric' | 'cardMetricMoney' | 'cardMetricTokens' | 'triggerMonthTokens' | 'subscriptionsStale' | 'staleLedgerNotice' | 'tokenCacheWrite' | 'toolRank' | 'toolName' | 'userPrices' | 'userPricesHint' | 'userPriceSave' | 'userPriceModel' | 'userPriceSource' | 'userPriceSourceHint' | 'userPriceOffPeak' | 'userPriceNormal' | 'userPriceCurrency' | 'userPriceAdd' | 'userPriceRemoveSelected' | 'userPriceSelect' | 'sessionStaleBadge' | 'heatmapLess' | 'heatmapMore' | 'currency' | 'currencyCny' | 'currencyUsd' | 'heatmap' | 'rounds' | 'roundsHint' | 'anomaly' | 'workspaces' | 'workspacesHint' | 'workspaceSubtotal' | 'model' | 'thModel' | 'thInputMiss' | 'thInputHit' | 'costAbbr' | 'tabOverview' | 'tabTrends' | 'tabProviders' | 'tabPricing' | 'tabSettings' | 'budgetHint' | 'peakAlertHint' | 'peakAlertDescPeak' | 'peakAlertDescOff' | 'export' | 'exportCsvDay' | 'exportCsvSession' | 'exportJson' | 'peakShare' | 'peakSharePerCall' | 'offPeakSavings' | 'perfMax' | 'weekCost' | 'roleCost' | 'roleUser' | 'roleAssistant' | 'roleTool' | 'roleHint' | 'tierPeak' | 'tierOff' | 'tierToPeak' | 'tierToOff' | 'tierAlertEnterPeak' | 'tierAlertEnterOff' | 'peakAlertTitlePeak' | 'peakAlertTitleOff' | 'peakAlert' | 'peakAlertLeadMin' | 'peakAlertPos' | 'peakAlertMode' | 'peakAlertPosCorner' | 'peakAlertPosCenter' | 'peakAlertModePeak' | 'peakAlertModeOff' | 'peakAlertModeBoth' | 'peakAlertWebNotify' | 'peakAlertPreview' | 'planTypeCode' | 'planTypeToken' | 'subscriptionFeePerMonth' | 'triggerToday' | 'triggerMonth' | 'subscriptionIncluded' | 'free' | 'official' | 'thirdParty' | 'perfSamples' | 'perfTtft' | 'perfP50' | 'perfP90' | 'perfTps' | 'perfLatency' | 'perfEstimated' | 'perfEmpty' | 'perfTpsUnit' | 'perfTitle' | 'perfHint' | 'perfAll' | 'perfChartEmpty' | 'heatmapYear' | 'heatmapMonth' | 'activeDays' | 'streakDays' | 'subscriptionAutoDetect' | 'pluginVersion' | 'pluginAuthor' | 'pluginRepository' | 'pluginNpm' | 'pluginLicense' | 'tabToken' | 'tokenExport' | 'tokenExportCsv' | 'tokenCacheHitRate' | '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';
|
|
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.0.
|
|
4
|
+
"version": "1.0.30",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"deepseek-harness",
|
|
7
7
|
"deepseek",
|