完善 Antigravity 配额展示与 CI 断言

This commit is contained in:
MMEXA
2026-07-08 22:34:29 +08:00
parent 4866509938
commit c7186e1720
6 changed files with 111 additions and 19 deletions
@@ -120,6 +120,7 @@ import { useToast } from '@/composables/useToast'
import { parseApiError } from '@/utils/errorParser'
import {
compareAntigravityQuotaItems,
dedupeAntigravityQuotaItemsByLabel,
resolveAntigravityQuotaLabel,
} from '@/features/providers/utils/antigravityQuota'
@@ -232,7 +233,7 @@ function buildItemsFromQuotaSnapshot(quota: QuotaStatusSnapshot | null | undefin
.filter((item): item is QuotaItem => item !== null)
items.sort(compareAntigravityQuotaItems)
return items
return dedupeAntigravityQuotaItemsByLabel(items)
}
const items = computed<QuotaItem[]>(() => {
@@ -284,7 +285,7 @@ const items = computed<QuotaItem[]>(() => {
}
result.sort(compareAntigravityQuotaItems)
return result
return dedupeAntigravityQuotaItemsByLabel(result)
})
async function handleTestModel(modelName: string) {
@@ -959,6 +959,7 @@ import ProviderQuotaSectionHeader from '@/features/providers/components/Provider
import { useProxyNodesStore } from '@/stores/proxy-nodes'
import {
compareAntigravityQuotaItems,
dedupeAntigravityQuotaItemsByLabel,
resolveAntigravityQuotaLabel,
} from '@/features/providers/utils/antigravityQuota'
import {
@@ -3418,7 +3419,7 @@ function getAntigravityQuotaItems(metadata: UpstreamMetadata | null | undefined)
}
items.sort(compareAntigravityQuotaItems)
return items
return dedupeAntigravityQuotaItemsByLabel(items)
}
function getAntigravityQuotaItemsFromSnapshot(key: EndpointAPIKey): AntigravityQuotaItem[] {
@@ -3462,7 +3463,7 @@ function getAntigravityQuotaItemsFromSnapshot(key: EndpointAPIKey): AntigravityQ
.filter((item): item is AntigravityQuotaItem => item !== null)
items.sort(compareAntigravityQuotaItems)
return items
return dedupeAntigravityQuotaItemsByLabel(items)
}
const ANTIGRAVITY_QUOTA_PREVIEW_LIMIT = 6
@@ -164,12 +164,44 @@ describe('AntigravityQuotaDialog', () => {
expect(text).not.toContain('gemini-pro-agent')
expect(text).not.toContain('claude-opus-4-6-thinking')
expect(text.indexOf('Claude Opus 4.6 (Thinking)')).toBeLessThan(text.indexOf('Gemini 3.1 Pro (High)'))
expect(text.indexOf('Gemini 3.1 Pro (High)')).toBeLessThan(text.indexOf('Gemini 3.5 Flash (High)'))
expect(text.indexOf('Gemini 3.5 Flash (High)')).toBeLessThan(text.indexOf('Gemini 3.5 Flash (Medium)'))
expect(text.indexOf('Gemini 3.5 Flash (Medium)')).toBeLessThan(text.indexOf('Claude Opus 4.6 (Thinking)'))
expect(text.indexOf('Claude Opus 4.6 (Thinking)')).toBeLessThan(text.indexOf('Tab Flash Lite Preview'))
expect(text.indexOf('Gemini 3.5 Flash (Medium)')).toBeLessThan(text.indexOf('Tab Flash Lite Preview'))
expect(text.indexOf('Tab Flash Lite Preview')).toBeLessThan(text.indexOf('chat_20706'))
unmount()
})
it('renders one row for duplicate quota labels and keeps the preferred active bucket', () => {
const { root, unmount } = mount({
antigravity: {
quota_by_model: {
'gemini-3.1-pro-high': {
display_name: 'Gemini 3.1 Pro (High)',
remaining_fraction: 0.95,
used_percent: 5,
},
'gemini-pro-agent': {
display_name: 'Gemini 3.1 Pro (High)',
remaining_fraction: 0.4,
used_percent: 60,
},
'gemini-3-flash-agent': {
display_name: 'Gemini 3.5 Flash (High)',
remaining_fraction: 0.9,
used_percent: 10,
},
},
},
})
const text = root.textContent || ''
expect(text.match(/Gemini 3\.1 Pro \(High\)/g)).toHaveLength(1)
expect(text).toContain('40.0%')
expect(text).not.toContain('95.0%')
expect(text.indexOf('Gemini 3.1 Pro (High)')).toBeLessThan(text.indexOf('Gemini 3.5 Flash (High)'))
unmount()
})
})