dsh-account-pool 0.2.0 → 0.2.1
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 +13 -29
- package/lib/index.js +15 -24
- package/lib/trae-upstream.js +5 -6
- package/package.json +1 -1
package/lib/client.js
CHANGED
|
@@ -953,30 +953,11 @@ window.__ModuleLoader__.load({ id: "dsh-account-pool", factory: (require) => {
|
|
|
953
953
|
const t = usage.totals || {};
|
|
954
954
|
const models = usage.byModel || [];
|
|
955
955
|
const totalCalls = t.requests || 0;
|
|
956
|
+
// 上游是否逐次上报积分消耗。默认按「支持」走,避免老数据缺字段时
|
|
957
|
+
// 把指标整块藏掉;只有后端明确说 false 才隐藏。
|
|
958
|
+
const reportsCredits = usage.reportsPerRequestCredits !== false;
|
|
956
959
|
const failRate = totalCalls > 0 ? (t.errors || 0) / totalCalls : 0;
|
|
957
960
|
|
|
958
|
-
/**
|
|
959
|
-
* 积分消耗指标。
|
|
960
|
-
*
|
|
961
|
-
* 优先用「按请求累加」的值;它为 0 而上游给了累计消耗时,改用
|
|
962
|
-
* 累计值并注明口径不同——这两个数字含义不一样,不能混着看:
|
|
963
|
-
* 按请求累加:本页时间窗口内消耗了多少
|
|
964
|
-
* 累计已消耗:账号从开通到现在的总量(不受时间窗口影响)
|
|
965
|
-
*/
|
|
966
|
-
const creditsKpi = (totals, whole) => {
|
|
967
|
-
const perRequest = typeof totals.credits === "number" ? totals.credits : 0;
|
|
968
|
-
const upstream = whole.upstreamConsumed;
|
|
969
|
-
if (perRequest > 0) {
|
|
970
|
-
return kpi("积分消耗", formatNumber(perRequest), { full: formatNumber(perRequest) + " 积分" });
|
|
971
|
-
}
|
|
972
|
-
if (typeof upstream === "number" && upstream > 0) {
|
|
973
|
-
return kpi("累计消耗", formatNumber(upstream), {
|
|
974
|
-
full: "上游未上报单次消耗,这里显示账号累计已消耗 " + formatNumber(upstream) + " 积分",
|
|
975
|
-
});
|
|
976
|
-
}
|
|
977
|
-
return kpi("积分消耗", formatNumber(perRequest), { full: formatNumber(perRequest) + " 积分" });
|
|
978
|
-
};
|
|
979
|
-
|
|
980
961
|
/** 核心指标块:大号数字 + 小标签。 */
|
|
981
962
|
const kpi = (label, value, opts = {}) => h("div", {
|
|
982
963
|
style: {
|
|
@@ -1073,7 +1054,8 @@ window.__ModuleLoader__.load({ id: "dsh-account-pool", factory: (require) => {
|
|
|
1073
1054
|
// 用 grid 而不是 flex-wrap:wrap 在窄面板里会把第 4 块挤到下一行,
|
|
1074
1055
|
// grid 的 1fr 会按可用宽度均分,永远保持一行。
|
|
1075
1056
|
h("div", {
|
|
1076
|
-
|
|
1057
|
+
// 少一个指标时用 3 列网格,避免留下一个空位
|
|
1058
|
+
className: reportsCredits ? "wb-kpi-grid-4" : "wb-kpi-grid-3",
|
|
1077
1059
|
style: {
|
|
1078
1060
|
display: "grid",
|
|
1079
1061
|
gridTemplateColumns: "repeat(4, minmax(0, 1fr))",
|
|
@@ -1091,12 +1073,14 @@ window.__ModuleLoader__.load({ id: "dsh-account-pool", factory: (require) => {
|
|
|
1091
1073
|
// 积分精确到个位、不缩写:它是能对账的数字,
|
|
1092
1074
|
// 显示成 8.4K 会让人不知道到底扣了多少。
|
|
1093
1075
|
//
|
|
1094
|
-
//
|
|
1095
|
-
//
|
|
1096
|
-
//
|
|
1097
|
-
//
|
|
1098
|
-
//
|
|
1099
|
-
|
|
1076
|
+
// 上游不逐次上报消耗时整块隐藏(Trae 的对话流没有计费
|
|
1077
|
+
// 字段,累加恒为 0)。显示一个恒为 0 的指标比不显示更糟:
|
|
1078
|
+
// 用户会以为「没消耗」或「统计坏了」,而真相是上游不给。
|
|
1079
|
+
// 也不拿积分接口的累计值来凑数——那是账号总量,不是本页
|
|
1080
|
+
// 消耗,混着展示会直接误导。
|
|
1081
|
+
reportsCredits
|
|
1082
|
+
? kpi("积分消耗", formatNumber(t.credits), { full: formatNumber(t.credits) + " 积分" })
|
|
1083
|
+
: null,
|
|
1100
1084
|
// 延迟只统计成功请求。没有成功请求时显示 —,
|
|
1101
1085
|
// 而不是误导性的 0(或把失败请求的快速返回当成"很快")。
|
|
1102
1086
|
h("div", {
|
package/lib/index.js
CHANGED
|
@@ -355,6 +355,16 @@ async function createRegionStack({ region, dshHome, config, logger, ctx }) {
|
|
|
355
355
|
region,
|
|
356
356
|
providerId,
|
|
357
357
|
isTrae,
|
|
358
|
+
/**
|
|
359
|
+
* 上游是否**逐次上报**积分消耗。
|
|
360
|
+
*
|
|
361
|
+
* WorkBuddy 的响应里带 credit 字段,能按请求累加;
|
|
362
|
+
* Trae 的对话流只有六种事件(metadata/timing_cost/output/
|
|
363
|
+
* extra_info/token_usage/done),没有任何计费字段——它只在
|
|
364
|
+
* 积分接口给一个累计值。那个累计值不能当「本页消耗」展示
|
|
365
|
+
* (含义不同,会误导),所以这种情况下界面直接不显示该指标。
|
|
366
|
+
*/
|
|
367
|
+
reportsPerRequestCredits: !isTrae,
|
|
358
368
|
runTasks,
|
|
359
369
|
// 只读状态:Trae 用 readStatus,WorkBuddy 用现有的那组查询
|
|
360
370
|
readStatus: isTrae ? traeReadStatus : undefined,
|
|
@@ -1082,31 +1092,12 @@ export function apply(ctx, config = {}) {
|
|
|
1082
1092
|
const list = await ready
|
|
1083
1093
|
const out = {}
|
|
1084
1094
|
for (const stack of list) {
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
*
|
|
1089
|
-
* Trae 的对话流没有任何计费字段(实测只有 metadata /
|
|
1090
|
-
* timing_cost / output / extra_info / token_usage / done
|
|
1091
|
-
* 六种事件),所以按请求累加的 credits 恒为 0。它的积分
|
|
1092
|
-
* 接口能给出累计已消耗,虽然分不到「哪次请求」,但至少
|
|
1093
|
-
* 是真实数字,比显示 0 有意义。
|
|
1094
|
-
*
|
|
1095
|
-
* 用缓存(不强制刷新)以免打开用量页就打一轮上游。
|
|
1096
|
-
*/
|
|
1097
|
-
const credits = await stack.loadCredits().catch(() => ({}))
|
|
1098
|
-
let consumedTotal = 0
|
|
1099
|
-
let hasConsumed = false
|
|
1100
|
-
for (const account of Object.values(credits)) {
|
|
1101
|
-
if (typeof account?.consumed === 'number') {
|
|
1102
|
-
consumedTotal += account.consumed
|
|
1103
|
-
hasConsumed = true
|
|
1104
|
-
}
|
|
1105
|
-
}
|
|
1095
|
+
// 只给「本页时间窗口内按请求累加」这一种口径。
|
|
1096
|
+
// 上游不逐次上报时(Trae),该指标没有真实数据可展示——
|
|
1097
|
+
// 界面据此隐藏它,而不是显示恒为 0 的数字。
|
|
1106
1098
|
out[stack.region] = {
|
|
1107
|
-
...snapshot,
|
|
1108
|
-
|
|
1109
|
-
upstreamConsumed: hasConsumed ? Math.round(consumedTotal * 100) / 100 : undefined,
|
|
1099
|
+
...stack.usage.snapshot(hours),
|
|
1100
|
+
reportsPerRequestCredits: stack.reportsPerRequestCredits,
|
|
1110
1101
|
}
|
|
1111
1102
|
}
|
|
1112
1103
|
json(res, 200, { ok: true, regions: out })
|
package/lib/trae-upstream.js
CHANGED
|
@@ -421,15 +421,14 @@ export async function fetchCredits(credential) {
|
|
|
421
421
|
const consumed = Number(summary?.consumed_amount)
|
|
422
422
|
if (Number.isFinite(totalAmount) && Number.isFinite(consumed)) {
|
|
423
423
|
// 保留两位小数:桌面显示也是两位(1621.73)。
|
|
424
|
-
// size
|
|
425
|
-
//
|
|
426
|
-
//
|
|
427
|
-
//
|
|
428
|
-
//
|
|
424
|
+
// size = 总量,供界面悬停展示「总量 / 已用 / 剩余」。
|
|
425
|
+
//
|
|
426
|
+
// 不返回 consumed:Trae 的对话流没有计费字段,用量统计拿不到
|
|
427
|
+
// 单次消耗;累计值含义不同(账号总量 ≠ 本页消耗),给了只会
|
|
428
|
+
// 诱导误用,所以不提供。
|
|
429
429
|
return {
|
|
430
430
|
total: Math.round((totalAmount - consumed) * 100) / 100,
|
|
431
431
|
size: totalAmount,
|
|
432
|
-
consumed: Math.round(consumed * 100) / 100,
|
|
433
432
|
}
|
|
434
433
|
}
|
|
435
434
|
return { total: 0 }
|