fix(usage): 修复缓存创建 token 展示并在总量中计入缓存组件

- gateway/admin 用量载荷在 cache_creation_input_tokens 为 0 时回填 ephemeral_5m/1h 合计
- 标准化用量写入时将 cache_creation/cache_read token 计入 total_tokens
- 前端列表与轮询同步新增分类字段,修复缓存 token 列显示
This commit is contained in:
fawney19
2026-04-19 02:46:28 +08:00
parent e82c9c5104
commit 2f487fda66
11 changed files with 316 additions and 19 deletions

View File

@@ -457,6 +457,7 @@ pub fn admin_usage_record_json(
let output_price_per_1m = item.settlement_output_price_per_1m();
let cache_creation_price_per_1m = item.settlement_cache_creation_price_per_1m();
let cache_read_price_per_1m = item.settlement_cache_read_price_per_1m();
let cache_creation_input_tokens = admin_usage_cache_creation_tokens(item);
let is_free_tier = item.settlement_is_free_tier();
let user = item
.user_id
@@ -485,7 +486,7 @@ pub fn admin_usage_record_json(
"input_tokens": item.input_tokens,
"effective_input_tokens": admin_usage_effective_input_tokens(item),
"output_tokens": item.output_tokens,
"cache_creation_input_tokens": item.cache_creation_input_tokens,
"cache_creation_input_tokens": cache_creation_input_tokens,
"cache_creation_ephemeral_5m_input_tokens": item.cache_creation_ephemeral_5m_input_tokens,
"cache_creation_ephemeral_1h_input_tokens": item.cache_creation_ephemeral_1h_input_tokens,
"cache_read_input_tokens": item.cache_read_input_tokens,
@@ -1418,13 +1419,14 @@ pub fn build_admin_usage_active_requests_response(
let provider_key_name = admin_usage_provider_key_name(item, provider_key_names);
let api_key_name =
admin_usage_api_key_name(item, api_key_names, auth_api_key_reader_available);
let cache_creation_input_tokens = admin_usage_cache_creation_tokens(item);
let mut value = json!({
"id": item.id,
"status": item.status,
"input_tokens": item.input_tokens,
"effective_input_tokens": admin_usage_effective_input_tokens(item),
"output_tokens": item.output_tokens,
"cache_creation_input_tokens": item.cache_creation_input_tokens,
"cache_creation_input_tokens": cache_creation_input_tokens,
"cache_creation_ephemeral_5m_input_tokens": item.cache_creation_ephemeral_5m_input_tokens,
"cache_creation_ephemeral_1h_input_tokens": item.cache_creation_ephemeral_1h_input_tokens,
"cache_read_input_tokens": item.cache_read_input_tokens,
@@ -1923,6 +1925,30 @@ mod tests {
assert_eq!(payload["cache_read_price_per_1m"], 0.30);
}
#[test]
fn admin_usage_record_rehydrates_cache_creation_total_from_classified_fields() {
let item = StoredRequestUsageAudit {
cache_creation_input_tokens: 0,
cache_creation_ephemeral_5m_input_tokens: 12,
cache_creation_ephemeral_1h_input_tokens: 8,
..sample_usage("completed", Some(200), None)
};
let payload = admin_usage_record_json(
&item,
&BTreeMap::new(),
&BTreeMap::new(),
false,
false,
Some("primary"),
);
assert_eq!(payload["cache_creation_input_tokens"], 20);
assert_eq!(payload["cache_creation_ephemeral_5m_input_tokens"], 12);
assert_eq!(payload["cache_creation_ephemeral_1h_input_tokens"], 8);
assert_eq!(payload["total_tokens"], 50);
}
#[test]
fn detail_payload_exposes_typed_settlement_section() {
let item = StoredRequestUsageAudit {