优化: token分项显示(in/cache/out/reasoning)+ 详情面板 + base前置

token分项(各计费不同,不显 total):df-ai 解析 provider cache/reasoning(openai_compat prompt_cache_hit/miss/reasoning_tokens + anthropic cache_read/creation)+ TokenUsage 加字段(全构造点)+ AiMessage/AiCompleted/DB V39(ai_messages 加 cache_hit/miss/reasoning 列)+ message_repo 映射(持久化)+ 前端 MessageList 显 in·cache·out·reason(in=cache_miss 全价,reasoning 有才显)+ 点击 token 弹详情面板(完整 usage+缓存命中率+model)+ df-miniapp 同步

base前置(提升 prompt cache 命中率):chat.rs aug 拼 base 后(4处)+ knowledge_inject 知识拼 base 后(固定 base 前缀,cache 命中)

附修:replace_conversation 原 13 列 INSERT 丢消息级 token → 改 18 列
This commit is contained in:
lxy
2026-08-03 01:22:30 +08:00
parent 864c696b70
commit a031521776
25 changed files with 563 additions and 45 deletions
+32
View File
@@ -25,10 +25,16 @@ const SAVE_CONVERSATION_TIMEOUT_SECS: u64 = 5;
///
/// 纯结构 + 方法:抽自 run_agentic_loop 的 `total_prompt`/`total_completion` 双计数器,
/// 保证多轮累加、None 起始、跨 loop 实例叠加语义一致且可单测。
///
/// token 分项显示(2026-08-02):新增 cache_hit/cache_miss/reasoning 三计数器,
/// 各轮 provider usage 累加,emit AiCompleted 时透传前端做分计费展示。
#[derive(Debug, Clone, Default)]
pub(crate) struct TokenAccumulator {
prompt: u32,
completion: u32,
cache_hit: u32,
cache_miss: u32,
reasoning: u32,
}
impl TokenAccumulator {
@@ -40,6 +46,15 @@ impl TokenAccumulator {
self.completion = self.completion.saturating_add(completion);
}
/// 叠加一轮全量用量(含 cache/reasoning 分项)。
/// 调用方传 round TokenUsage,本方法拆分 prompt/completion/cache/reasoning 累加。
pub(crate) fn add_usage(&mut self, u: &df_ai::provider::TokenUsage) {
self.add(u.prompt_tokens, u.completion_tokens);
self.cache_hit = self.cache_hit.saturating_add(u.prompt_cache_hit_tokens);
self.cache_miss = self.cache_miss.saturating_add(u.prompt_cache_miss_tokens);
self.reasoning = self.reasoning.saturating_add(u.reasoning_tokens);
}
pub(crate) fn prompt(&self) -> u32 {
self.prompt
}
@@ -51,6 +66,18 @@ impl TokenAccumulator {
pub(crate) fn total(&self) -> u32 {
self.prompt.saturating_add(self.completion)
}
pub(crate) fn cache_hit(&self) -> u32 {
self.cache_hit
}
pub(crate) fn cache_miss(&self) -> u32 {
self.cache_miss
}
pub(crate) fn reasoning(&self) -> u32 {
self.reasoning
}
}
/// 把单轮增量叠加到 DB 的 Option<i64> 字段(读旧值+增量,跨 loop 实例防覆盖)
@@ -611,6 +638,11 @@ mod tests {
model: None,
status: None,
reasoning_content: None,
prompt_tokens: None,
completion_tokens: None,
prompt_cache_hit_tokens: None,
prompt_cache_miss_tokens: None,
reasoning_tokens: None,
timestamp: None,
}
}