feat(usage): 活跃请求轮询增加缓存与成本字段

- 后端 getActiveRequests 返回新增 cache_creation/read_input_tokens、actual_cost、rate_multiplier
- 前端轮询时同步更新这些字段到记录中
- 优化刷新逻辑:全局刷新开启时停止1秒轮询,关闭时恢复
This commit is contained in:
fawney19
2026-01-15 12:13:47 +08:00
parent 514bf7e3ed
commit 76f648b4eb
4 changed files with 28 additions and 1 deletions

View File

@@ -212,7 +212,11 @@ export const meApi = {
status: 'pending' | 'streaming' | 'completed' | 'failed' status: 'pending' | 'streaming' | 'completed' | 'failed'
input_tokens: number input_tokens: number
output_tokens: number output_tokens: number
cache_creation_input_tokens?: number | null
cache_read_input_tokens?: number | null
cost: number cost: number
actual_cost?: number | null
rate_multiplier?: number | null
response_time_ms: number | null response_time_ms: number | null
first_byte_time_ms: number | null first_byte_time_ms: number | null
}> }>

View File

@@ -192,7 +192,11 @@ export const usageApi = {
status: 'pending' | 'streaming' | 'completed' | 'failed' status: 'pending' | 'streaming' | 'completed' | 'failed'
input_tokens: number input_tokens: number
output_tokens: number output_tokens: number
cache_creation_input_tokens?: number | null
cache_read_input_tokens?: number | null
cost: number cost: number
actual_cost?: number | null
rate_multiplier?: number | null
response_time_ms: number | null response_time_ms: number | null
first_byte_time_ms: number | null first_byte_time_ms: number | null
provider?: string | null provider?: string | null

View File

@@ -283,7 +283,11 @@ async function pollActiveRequests() {
// 进行中状态也需要持续更新provider/key/TTFB 可能在 streaming 后才落库) // 进行中状态也需要持续更新provider/key/TTFB 可能在 streaming 后才落库)
record.input_tokens = update.input_tokens record.input_tokens = update.input_tokens
record.output_tokens = update.output_tokens record.output_tokens = update.output_tokens
record.cache_creation_input_tokens = update.cache_creation_input_tokens ?? undefined
record.cache_read_input_tokens = update.cache_read_input_tokens ?? undefined
record.cost = update.cost record.cost = update.cost
record.actual_cost = update.actual_cost ?? undefined
record.rate_multiplier = update.rate_multiplier ?? undefined
record.response_time_ms = update.response_time_ms ?? undefined record.response_time_ms = update.response_time_ms ?? undefined
record.first_byte_time_ms = update.first_byte_time_ms ?? undefined record.first_byte_time_ms = update.first_byte_time_ms ?? undefined
// 管理员接口返回额外字段 // 管理员接口返回额外字段
@@ -318,8 +322,9 @@ function stopAutoRefresh() {
} }
// 监听活跃请求状态,自动启动/停止刷新 // 监听活跃请求状态,自动启动/停止刷新
// 注意全局刷新开启时不需要1秒轮询全局刷新已经包含完整数据刷新
watch(hasActiveRequests, (hasActive) => { watch(hasActiveRequests, (hasActive) => {
if (hasActive) { if (hasActive && !globalAutoRefresh.value) {
startAutoRefresh() startAutoRefresh()
} else { } else {
stopAutoRefresh() stopAutoRefresh()
@@ -344,10 +349,16 @@ function stopGlobalAutoRefresh() {
function handleAutoRefreshChange(value: boolean) { function handleAutoRefreshChange(value: boolean) {
globalAutoRefresh.value = value globalAutoRefresh.value = value
if (value) { if (value) {
// 开启全局刷新时停止1秒轮询避免重复请求
stopAutoRefresh()
refreshData() // 立即刷新一次 refreshData() // 立即刷新一次
startGlobalAutoRefresh() startGlobalAutoRefresh()
} else { } else {
stopGlobalAutoRefresh() stopGlobalAutoRefresh()
// 关闭全局刷新后如果有活跃请求恢复1秒轮询
if (hasActiveRequests.value) {
startAutoRefresh()
}
} }
} }

View File

@@ -1713,7 +1713,11 @@ class UsageService:
Usage.status, Usage.status,
Usage.input_tokens, Usage.input_tokens,
Usage.output_tokens, Usage.output_tokens,
Usage.cache_creation_input_tokens,
Usage.cache_read_input_tokens,
Usage.total_cost_usd, Usage.total_cost_usd,
Usage.actual_total_cost_usd,
Usage.rate_multiplier,
Usage.response_time_ms, Usage.response_time_ms,
Usage.first_byte_time_ms, # 首字时间 (TTFB) Usage.first_byte_time_ms, # 首字时间 (TTFB)
Usage.created_at, Usage.created_at,
@@ -1773,7 +1777,11 @@ class UsageService:
"status": "failed" if r.id in timeout_ids else r.status, "status": "failed" if r.id in timeout_ids else r.status,
"input_tokens": r.input_tokens, "input_tokens": r.input_tokens,
"output_tokens": r.output_tokens, "output_tokens": r.output_tokens,
"cache_creation_input_tokens": r.cache_creation_input_tokens,
"cache_read_input_tokens": r.cache_read_input_tokens,
"cost": float(r.total_cost_usd) if r.total_cost_usd else 0, "cost": float(r.total_cost_usd) if r.total_cost_usd else 0,
"actual_cost": float(r.actual_total_cost_usd) if r.actual_total_cost_usd else None,
"rate_multiplier": float(r.rate_multiplier) if r.rate_multiplier else None,
"response_time_ms": r.response_time_ms, "response_time_ms": r.response_time_ms,
"first_byte_time_ms": r.first_byte_time_ms, # 首字时间 (TTFB) "first_byte_time_ms": r.first_byte_time_ms, # 首字时间 (TTFB)
} }