mirror of
https://github.com/fawney19/Aether.git
synced 2026-09-03 01:40:21 +08:00
feat(usage): 活跃请求轮询增加缓存与成本字段
- 后端 getActiveRequests 返回新增 cache_creation/read_input_tokens、actual_cost、rate_multiplier - 前端轮询时同步更新这些字段到记录中 - 优化刷新逻辑:全局刷新开启时停止1秒轮询,关闭时恢复
This commit is contained in:
@@ -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
|
||||||
}>
|
}>
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user