feat(usage): 展示压缩操作与进行态请求语义

This commit is contained in:
MMEXA
2026-07-13 22:03:44 +08:00
parent b09d1f1c33
commit 3f86fdd6bc
12 changed files with 188 additions and 14 deletions
@@ -244,6 +244,14 @@
<div class="min-w-0 flex-1">
<div class="flex min-w-0 items-center gap-1.5">
<span class="min-w-0 truncate text-[15px] font-semibold leading-5">{{ record.model }}</span>
<Badge
v-if="getRequestTypeLabel(record)"
variant="outline"
class="h-4 rounded-full border-sky-500/30 bg-sky-500/5 px-1.5 text-[10px] leading-4 text-sky-700 dark:text-sky-300 flex-shrink-0"
title="线程压缩"
>
{{ getRequestTypeLabel(record) }}
</Badge>
<Badge
v-if="getReasoningEffort(record)"
variant="outline"
@@ -753,6 +761,14 @@
clip-rule="evenodd"
/>
</svg>
<Badge
v-if="getRequestTypeLabel(record)"
variant="outline"
class="h-4 rounded-full border-sky-500/30 bg-sky-500/5 px-1.5 text-[10px] leading-4 text-sky-700 dark:text-sky-300 flex-shrink-0"
title="线程压缩"
>
{{ getRequestTypeLabel(record) }}
</Badge>
<Badge
v-if="getReasoningEffort(record)"
variant="outline"
@@ -777,6 +793,14 @@
class="flex min-w-0 items-center gap-1"
>
<span class="truncate">{{ record.model }}</span>
<Badge
v-if="getRequestTypeLabel(record)"
variant="outline"
class="h-4 rounded-full border-sky-500/30 bg-sky-500/5 px-1.5 text-[10px] leading-4 text-sky-700 dark:text-sky-300 flex-shrink-0"
title="线程压缩"
>
{{ getRequestTypeLabel(record) }}
</Badge>
<Badge
v-if="getReasoningEffort(record)"
variant="outline"
@@ -1605,6 +1629,10 @@ function getReasoningEffort(record: UsageRecord): string | null {
return effort || null
}
function getRequestTypeLabel(record: UsageRecord): string | null {
return record.request_type?.trim().toLowerCase() === 'compact' ? '压缩' : null
}
function getReasoningEffortTitle(record: UsageRecord): string {
const effort = getReasoningEffort(record)
return effort ? `Reasoning: ${effort}` : ''
@@ -1644,8 +1672,9 @@ function getModelTooltip(record: UsageRecord): string {
const actualModel = getActualModel(record)
const reasoningEffort = getReasoningEffort(record)
const serviceTierTitle = getFastBadgeTitle(record)
const requestType = getRequestTypeLabel(record)
const tierSuffix = serviceTierTitle ? `\n${serviceTierTitle}` : ''
const suffix = `${reasoningEffort ? `\nReasoning: ${reasoningEffort}` : ''}${tierSuffix}`
const suffix = `${requestType ? `\n操作: ${requestType}` : ''}${reasoningEffort ? `\nReasoning: ${reasoningEffort}` : ''}${tierSuffix}`
if (actualModel) {
return `${record.model} -> ${actualModel}${suffix}`
}
@@ -297,6 +297,15 @@ describe('UsageRecordsTable', () => {
expect(root.textContent).toContain('max')
})
it('marks Responses compaction while the record is pending', () => {
const root = mountUsageRecordsTable([buildRecord({
status: 'pending',
request_type: 'compact',
})])
expect(root.textContent).toContain('压缩')
})
it('shows fast badge for priority service tier', () => {
const root = mountUsageRecordsTable([buildRecord({ service_tier: 'priority' })])
@@ -216,6 +216,7 @@ describe('useUsageData', () => {
has_format_conversion: false,
has_retry: true,
target_model: 'gpt-5.5',
request_type: 'compact',
reasoning_effort: 'xhigh',
service_tier: 'auto',
actual_service_tier: 'priority',
@@ -245,6 +246,7 @@ describe('useUsageData', () => {
has_format_conversion: undefined,
has_retry: false,
target_model: null,
request_type: null,
reasoning_effort: null,
service_tier: null,
actual_service_tier: null,
@@ -279,6 +281,7 @@ describe('useUsageData', () => {
has_format_conversion: false,
has_retry: true,
target_model: 'gpt-5.5',
request_type: 'compact',
reasoning_effort: 'xhigh',
service_tier: 'auto',
actual_service_tier: 'priority',
@@ -630,6 +630,7 @@ export function useUsageData(options: UseUsageDataOptions) {
provider_key_name: record.provider_key_name || existing.provider_key_name,
rate_multiplier: record.rate_multiplier ?? existing.rate_multiplier,
target_model: record.target_model ?? existing.target_model,
request_type: record.request_type ?? existing.request_type,
reasoning_effort: record.reasoning_effort ?? existing.reasoning_effort,
service_tier: record.service_tier ?? existing.service_tier,
actual_service_tier: record.actual_service_tier ?? existing.actual_service_tier
+1
View File
@@ -96,6 +96,7 @@ export interface UsageRecord {
model: string
target_model?: string | null // 映射后的目标模型名(若无映射则为空)
model_version?: string | null // Provider 返回的实际模型版本(列表轻量字段)
request_type?: string | null // 由请求语义识别出的操作类型
reasoning_effort?: string | null // 从发送给 Provider 的请求体提取的 reasoning 级别
service_tier?: string | null // 从发送给 Provider 的请求体提取的服务层级
actual_service_tier?: string | null // Provider 响应确认的实际服务层级