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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
//! CLI 运行时入口模块
//!
//! 本模块提供 CLI 模式下代理执行的主入口点,负责协调单次消息处理与交互式会话两种运行模式。
//!
//! # 主要功能
//!
//! - **单次消息模式**:处理单条用户消息并返回响应,适用于脚本化调用或一次性查询
//! - **交互式模式**:启动持续的用户交互会话,支持多轮对话
//!
//! # 架构位置
//!
//! ```text
//! cli/run.rs (本模块)
//! ├── cli/setup.rs → 初始化 Provider、Model、Observer 等
//! ├── cli/single_message.rs → 单次消息处理
//! └── cli/interactive.rs → 交互式会话
//! ```
use AgentTuiMode;
use run_interactive;
use setup_cli;
use run_single_message;
use crateConfig;
use crateObserverEvent;
use Result;
use Instant;
/// 执行 CLI 模式的代理运行时
///
/// 根据输入参数选择单次消息处理或交互式会话模式,并负责整个执行周期的
/// 资源初始化、运行时监控和终止事件记录。
///
/// # 参数
///
/// - `config`: 代理的完整配置对象,包含 Provider、Memory、Security 等子系统配置
/// - `message`: 可选的单次消息内容。若提供,则执行单次消息模式;否则进入交互式模式
/// - `provider_override`: 可选的 Provider 覆盖名称,用于临时替换配置中的默认 Provider
/// - `model_override`: 可选的模型名称覆盖,用于临时替换配置中的默认模型
/// - `temperature`: 生成温度参数,控制模型输出的随机性(0.0-2.0,值越高越随机)
/// - `_peripheral_overrides`: 外围设备覆盖配置(当前未使用,保留用于未来扩展)
/// - `interactive`: 是否强制启用交互式模式标志
///
/// # 返回值
///
/// 返回 `Result<String>`,其中:
/// - `Ok(String)`: 执行成功,包含最终输出文本
/// - `Err`: 执行过程中发生错误
///
/// # 执行流程
///
/// 1. 调用 [`setup_cli`] 初始化运行时环境(Provider、Model、Observer)
/// 2. 记录开始时间用于性能监控
/// 3. 根据是否有消息输入选择执行模式:
/// - 有消息 → 调用 [`run_single_message`] 处理单次请求
/// - 无消息 → 调用 [`run_interactive`] 启动交互式会话
/// 4. 记录 [`ObserverEvent::AgentEnd`] 事件用于可观测性
/// 5. 返回最终输出
///
/// # 示例
///
/// ```ignore
/// use crate::app::agent::config::Config;
/// use crate::app::agent::agent::loop_::cli::run::run;
///
/// async fn example() -> anyhow::Result<()> {
/// let config = Config::load("config.toml")?;
///
/// // 单次消息模式
/// let response = run(
/// config.clone(),
/// Some("你好,请介绍一下自己".to_string()),
/// None, // 使用默认 Provider
/// None, // 使用默认模型
/// 0.7, // 温度
/// vec![],
/// false,
/// ).await?;
/// println!("Response: {}", response);
///
/// Ok(())
/// }
/// ```
pub async