Skip to content

Commit 4064b01

Browse files
Merge pull request router-for-me#338 from jellyfish-p/main
add xai pay-as-you-go quota progress
2 parents ca25c65 + 88d60bf commit 4064b01

2 files changed

Lines changed: 71 additions & 14 deletions

File tree

src/components/quota/quotaConfigs.ts

Lines changed: 68 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1470,15 +1470,32 @@ const buildXaiBillingSummary = (
14701470
return null;
14711471
}
14721472

1473+
const includedUsedCents =
1474+
usedCents === null
1475+
? null
1476+
: monthlyLimitCents !== null && monthlyLimitCents > 0
1477+
? Math.min(usedCents, monthlyLimitCents)
1478+
: usedCents;
1479+
const onDemandUsedCents =
1480+
usedCents !== null && monthlyLimitCents !== null
1481+
? Math.max(0, usedCents - monthlyLimitCents)
1482+
: null;
14731483
const usedPercent =
1474-
monthlyLimitCents !== null && monthlyLimitCents > 0 && usedCents !== null
1475-
? (usedCents / monthlyLimitCents) * 100
1484+
monthlyLimitCents !== null && monthlyLimitCents > 0 && includedUsedCents !== null
1485+
? (includedUsedCents / monthlyLimitCents) * 100
1486+
: null;
1487+
const onDemandUsedPercent =
1488+
onDemandCapCents !== null && onDemandCapCents > 0 && onDemandUsedCents !== null
1489+
? (onDemandUsedCents / onDemandCapCents) * 100
14761490
: null;
14771491

14781492
return {
14791493
monthlyLimitCents,
14801494
usedCents,
1495+
includedUsedCents,
14811496
onDemandCapCents,
1497+
onDemandUsedCents,
1498+
onDemandUsedPercent,
14821499
billingPeriodStart,
14831500
billingPeriodEnd,
14841501
usedPercent,
@@ -1522,15 +1539,26 @@ const formatUsdFromCents = (cents: number | null): string => {
15221539

15231540
const formatXaiRemainingAmount = (billing: XaiBillingSummary): string => {
15241541
const remainingCents =
1525-
billing.monthlyLimitCents !== null && billing.usedCents !== null
1526-
? Math.max(0, billing.monthlyLimitCents - billing.usedCents)
1542+
billing.monthlyLimitCents !== null && billing.includedUsedCents !== null
1543+
? Math.max(0, billing.monthlyLimitCents - billing.includedUsedCents)
15271544
: null;
15281545
const remaining = formatUsdFromCents(remainingCents);
15291546
const limit = formatUsdFromCents(billing.monthlyLimitCents);
15301547
if (billing.monthlyLimitCents === null) return remaining;
15311548
return `${remaining} / ${limit}`;
15321549
};
15331550

1551+
const formatXaiOnDemandAmount = (billing: XaiBillingSummary): string => {
1552+
const remainingCents =
1553+
billing.onDemandCapCents !== null && billing.onDemandUsedCents !== null
1554+
? Math.max(0, billing.onDemandCapCents - billing.onDemandUsedCents)
1555+
: null;
1556+
const remaining = formatUsdFromCents(remainingCents);
1557+
const cap = formatUsdFromCents(billing.onDemandCapCents);
1558+
if (billing.onDemandCapCents === null) return remaining;
1559+
return `${remaining} / ${cap}`;
1560+
};
1561+
15341562
const XAI_SUPERGROK_LIMIT_CENTS = 15_000;
15351563
const XAI_SUPERGROK_HEAVY_LIMIT_CENTS = 150_000;
15361564

@@ -1566,11 +1594,16 @@ const renderXaiItems = (
15661594
const amountLabel = formatXaiRemainingAmount(billing);
15671595
const resetLabel = formatQuotaResetTime(billing.billingPeriodEnd);
15681596
const onDemandCap = billing.onDemandCapCents ?? 0;
1597+
const clampedOnDemandUsed =
1598+
billing.onDemandUsedPercent === null
1599+
? null
1600+
: Math.max(0, Math.min(100, billing.onDemandUsedPercent));
1601+
const onDemandRemaining =
1602+
clampedOnDemandUsed === null ? null : Math.max(0, Math.min(100, 100 - clampedOnDemandUsed));
1603+
const onDemandPercentLabel =
1604+
onDemandRemaining === null ? '--' : `${Math.round(onDemandRemaining)}%`;
1605+
const onDemandAmountLabel = formatXaiOnDemandAmount(billing);
15691606
const plan = resolveXaiPlan(billing.monthlyLimitCents);
1570-
const payAsYouGoLabel =
1571-
onDemandCap > 0
1572-
? t('xai_quota.pay_as_you_go_enabled', { cap: formatUsdFromCents(onDemandCap) })
1573-
: t('xai_quota.pay_as_you_go_disabled');
15741607

15751608
return h(
15761609
Fragment,
@@ -1587,12 +1620,33 @@ const renderXaiItems = (
15871620
)
15881621
)
15891622
: null,
1590-
h(
1591-
'div',
1592-
{ key: 'pay-as-you-go', className: styleMap.codexPlan },
1593-
h('span', { className: styleMap.codexPlanLabel }, t('xai_quota.pay_as_you_go_label')),
1594-
h('span', { className: styleMap.codexPlanValue }, payAsYouGoLabel)
1595-
),
1623+
onDemandCap > 0
1624+
? h(
1625+
'div',
1626+
{ key: 'pay-as-you-go', className: styleMap.quotaRow },
1627+
h(
1628+
'div',
1629+
{ className: styleMap.quotaRowHeader },
1630+
h('span', { className: styleMap.quotaModel }, t('xai_quota.pay_as_you_go_label')),
1631+
h(
1632+
'div',
1633+
{ className: styleMap.quotaMeta },
1634+
h('span', { className: styleMap.quotaPercent }, onDemandPercentLabel),
1635+
h('span', { className: styleMap.quotaAmount }, onDemandAmountLabel)
1636+
)
1637+
),
1638+
h(QuotaProgressBar, {
1639+
percent: onDemandRemaining,
1640+
highThreshold: QUOTA_PROGRESS_HIGH_THRESHOLD,
1641+
mediumThreshold: QUOTA_PROGRESS_MEDIUM_THRESHOLD,
1642+
})
1643+
)
1644+
: h(
1645+
'div',
1646+
{ key: 'pay-as-you-go', className: styleMap.codexPlan },
1647+
h('span', { className: styleMap.codexPlanLabel }, t('xai_quota.pay_as_you_go_label')),
1648+
h('span', { className: styleMap.codexPlanValue }, t('xai_quota.pay_as_you_go_disabled'))
1649+
),
15961650
h(
15971651
'div',
15981652
{ key: 'monthly-credits', className: styleMap.quotaRow },

src/types/quota.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,10 @@ export interface XaiBillingPayload {
288288
export interface XaiBillingSummary {
289289
monthlyLimitCents: number | null;
290290
usedCents: number | null;
291+
includedUsedCents: number | null;
291292
onDemandCapCents: number | null;
293+
onDemandUsedCents: number | null;
294+
onDemandUsedPercent: number | null;
292295
billingPeriodStart?: string;
293296
billingPeriodEnd?: string;
294297
usedPercent: number | null;

0 commit comments

Comments
 (0)