1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
//! CLI 会话统计模块
//!
//! 本模块提供 CLI 交互会话的统计信息收集与展示功能。
//! 主要用于追踪和展示用户与代理之间的交互数据,包括:
//! - 消息计数(用户消息、助手消息)
//! - 工具调用事件计数
//! - Token 使用统计(输入和输出)
//!
//! # 主要组件
//!
//! - [`CliStats`][]: 会话统计数据的容器结构体
//! - [`build_session_title`][]: 根据统计数据构建会话标题的函数
/// CLI 会话统计信息
///
/// 用于收集和存储 CLI 会话期间的各项统计数据。
/// 该结构体通过 `Default` trait 提供零值初始化,所有字段从零开始计数。
///
/// # 字段说明
///
/// - `user_messages`: 用户发送的消息总数
/// - `assistant_messages`: 助手(AI)生成的消息总数
/// - `tool_events`: 工具调用事件的总次数
/// - `input_tokens`: 输入 token 的累计使用量
/// - `output_tokens`: 输出 token 的累计使用量
///
/// # 示例
///
/// ```ignore
/// use crate::app::agent::agent::loop_::cli::stats::CliStats;
///
/// let mut stats = CliStats::default();
/// stats.user_messages += 1;
/// stats.input_tokens += 150;
/// stats.output_tokens += 300;
/// ```
pub
/// 构建会话标题字符串
///
/// 根据统计数据和模型信息生成格式化的会话标题,
/// 用于在 CLI 界面中展示当前会话的概览信息。
///
/// # 参数
///
/// - `stats`: 包含会话统计信息的 `CliStats` 引用
/// - `provider_name`: LLM 提供商名称(如 "openai"、"anthropic")
/// - `model_name`: 使用的模型名称(如 "gpt-4"、"claude-3")
///
/// # 返回值
///
/// 返回一个格式化的多行字符串,包含以下信息:
/// ```text
/// Session
/// Context {total_tokens} tokens
/// {provider_name} / {model_name}
/// ```
///
/// 当总 token 数为零时,第二行显示为 "Context --"。
///
/// # 示例
///
/// ```ignore
/// use crate::app::agent::agent::loop_::cli::stats::{CliStats, build_session_title};
///
/// let stats = CliStats {
/// user_messages: 2,
/// assistant_messages: 2,
/// tool_events: 3,
/// input_tokens: 500,
/// output_tokens: 1200,
/// };
///
/// let title = build_session_title(&stats, "openai", "gpt-4");
/// assert!(title.contains("Session"));
/// assert!(title.contains("1700 tokens"));
/// assert!(title.contains("openai / gpt-4"));
/// ```
pub