feat: enhance Antigravity account overages handling and improve UI credit display

This commit is contained in:
SilentFlower
2026-03-16 00:45:17 +08:00
committed by erio
parent ced90e1d84
commit f3f19d35aa
4 changed files with 142 additions and 17 deletions

View File

@@ -290,30 +290,34 @@
color="amber"
/>
<div v-if="antigravityAICreditsDisplay.length > 0" class="mt-1 space-y-0.5 text-[10px] text-gray-500 dark:text-gray-400">
<div v-if="antigravityAICreditsDisplay.length > 0" class="mt-1 flex flex-wrap gap-1">
<div
v-for="credit in antigravityAICreditsDisplay"
:key="credit.creditType"
class="inline-flex items-center gap-1 rounded-full border border-amber-200 bg-amber-50 px-2 py-0.5 text-[10px] font-medium text-amber-700 dark:border-amber-800/50 dark:bg-amber-950/40 dark:text-amber-300"
>
{{ t('admin.accounts.aiCreditsBalance') }}:
{{ credit.creditType }}
{{ credit.amount }}
<span v-if="credit.minimumBalance !== null">
(min {{ credit.minimumBalance }})
<span>⚡</span>
<span>{{ t('admin.accounts.aiCreditsBalance') }}</span>
<span>{{ credit.label }}</span>
<span class="font-mono">{{ credit.amount }}</span>
<span v-if="credit.minimumBalance !== null" class="text-[9px] opacity-75">
min {{ credit.minimumBalance }}
</span>
</div>
</div>
</div>
<div v-else-if="antigravityAICreditsDisplay.length > 0" class="space-y-0.5 text-[10px] text-gray-500 dark:text-gray-400">
<div v-else-if="antigravityAICreditsDisplay.length > 0" class="flex flex-wrap gap-1">
<div
v-for="credit in antigravityAICreditsDisplay"
:key="credit.creditType"
class="inline-flex items-center gap-1 rounded-full border border-amber-200 bg-amber-50 px-2 py-0.5 text-[10px] font-medium text-amber-700 dark:border-amber-800/50 dark:bg-amber-950/40 dark:text-amber-300"
>
{{ t('admin.accounts.aiCreditsBalance') }}:
{{ credit.creditType }}
{{ credit.amount }}
<span v-if="credit.minimumBalance !== null">
(min {{ credit.minimumBalance }})
<span>⚡</span>
<span>{{ t('admin.accounts.aiCreditsBalance') }}</span>
<span>{{ credit.label }}</span>
<span class="font-mono">{{ credit.amount }}</span>
<span v-if="credit.minimumBalance !== null" class="text-[9px] opacity-75">
min {{ credit.minimumBalance }}
</span>
</div>
</div>
@@ -615,6 +619,7 @@ const antigravityAICreditsDisplay = computed(() => {
.filter((credit) => (credit.amount ?? 0) > 0)
.map((credit) => ({
creditType: credit.credit_type || 'UNKNOWN',
label: formatAICreditTypeLabel(credit.credit_type || 'UNKNOWN'),
amount: Number(credit.amount ?? 0).toFixed(0),
minimumBalance: typeof credit.minimum_balance === 'number'
? Number(credit.minimum_balance).toFixed(0)
@@ -622,6 +627,11 @@ const antigravityAICreditsDisplay = computed(() => {
}))
})
function formatAICreditTypeLabel(creditType: string): string {
if (creditType === 'GOOGLE_ONE_AI') return 'Google One AI'
return creditType
}
// Antigravity 账户类型(从 load_code_assist 响应中提取)
const antigravityTier = computed(() => {
const extra = props.account.extra as Record<string, unknown> | undefined

View File

@@ -133,9 +133,9 @@ describe('AccountUsageCell', () => {
await flushPromises()
expect(wrapper.text()).toContain('admin.accounts.aiCreditsBalance')
expect(wrapper.text()).toContain('GOOGLE_ONE_AI')
expect(wrapper.text()).toContain('Google One AI')
expect(wrapper.text()).toContain('25')
expect(wrapper.text()).toContain('(min 5)')
expect(wrapper.text()).toContain('min 5')
})