优化: 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:
@@ -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,
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user