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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
//! Channel(通信渠道)抽象模块
//!
//! # 概述
//!
//! Channel(通信渠道)用于在 Agent 的各个组件之间传递事件,以及将事件对接到外部系统:
//! - CLI(命令行界面)
//! - HTTP/WebSocket(Web 服务)
//! - IM/机器人平台(如钉钉、企业微信)
//! - Trace 记录(调试和审计)
//!
//! 在 core 层,我们只定义事件的类型和接口,不绑定具体的传输实现。
//!
//! # 核心类型
//!
//! ## ChannelEvent
//!
//! [`types::ChannelEvent`] 是统一的事件类型,支持:
//!
//! - `Message`: 对话消息事件
//! - `TokenDelta`: Token 流式输出事件
//! - `ToolCall`: 工具调用事件
//! - `ToolResult`: 工具结果事件
//! - `Skill`: 技能相关事件
//! - `Memory`: 记忆相关事件
//! - `Debug`: 调试事件
//! - `Error`: 错误事件
//! - `Raw`: 原始事件(用于透传自定义数据)
//!
//! ## ChannelObserver trait
//!
//! [`ChannelObserver`] trait 用于观测渠道中的事件:
//!
//! ```rust
//! use rucora_core::channel::{ChannelObserver, ChannelEvent};
//!
//! struct LoggingObserver;
//!
//! impl ChannelObserver for LoggingObserver {
//! fn on_event(&self, event: ChannelEvent) {
//! println!("收到事件:{:?}", event);
//! }
//! }
//! ```
//!
//! ## Channel trait
//!
//! [`Channel`] trait 定义了事件发送和订阅的接口(可选实现)。
//!
//! # 事件流转
//!
//! ```text
//! ┌──────────────┐
//! │ User Input │
//! └──────┬───────┘
//! │
//! ▼
//! ┌─────────────────────────────────────────┐
//! │ Agent │
//! │ │
//! │ ┌─────────────────────────────────┐ │
//! │ │ Provider (LLM API) │ │
//! │ └────────────┬────────────────────┘ │
//! │ │ │
//! │ ▼ │
//! │ ┌─────────────────────────────────┐ │
//! │ │ Tool Execution │ │
//! │ └────────────┬────────────────────┘ │
//! │ │ │
//! └───────────────┼─────────────────────────┘
//! │
//! ▼
//! ┌──────────────────────┐
//! │ Channel Events │
//! │ │
//! │ - TokenDelta │──► 流式输出到 UI
//! │ - ToolCall │──► 审计日志
//! │ - ToolResult │──► Trace 记录
//! │ - Message │──► 对话历史
//! │ - Error │──► 错误处理
//! └──────────────────────┘
//! ```
//!
//! # 使用示例
//!
//! ## 创建和发送事件
//!
//! ```rust
//! use rucora_core::channel::types::*;
//! use rucora_core::provider::types::{ChatMessage, Role};
//! use serde_json::json;
//!
//! // 创建消息事件
//! let message_event = ChannelEvent::Message(ChatMessage {
//! role: Role::Assistant,
//! content: "你好!".to_string(),
//! name: None,
//! });
//!
//! // 创建 Token 流式事件
//! let token_event = ChannelEvent::TokenDelta(TokenDeltaEvent {
//! delta: "你".to_string(),
//! });
//!
//! // 创建调试事件
//! let debug_event = ChannelEvent::Debug(DebugEvent {
//! message: "step.start".to_string(),
//! data: Some(json!({"step": 1})),
//! });
//!
//! // 创建错误事件
//! let error_event = ChannelEvent::Error(ErrorEvent {
//! kind: "tool".to_string(),
//! message: "工具执行失败".to_string(),
//! data: None,
//! });
//! ```
//!
//! ## 事件匹配处理
//!
//! ```rust
//! use rucora_core::channel::types::*;
//!
//! fn handle_event(event: ChannelEvent) {
//! match event {
//! ChannelEvent::TokenDelta(delta) => {
//! print!("{}", delta.delta);
//! }
//! ChannelEvent::ToolCall(call) => {
//! println!("调用工具:{}", call.name);
//! }
//! ChannelEvent::ToolResult(result) => {
//! println!("工具结果:{}", result.output);
//! }
//! ChannelEvent::Message(msg) => {
//! println!("消息:{}", msg.content);
//! }
//! ChannelEvent::Error(err) => {
//! eprintln!("错误 [{}]: {}", err.kind, err.message);
//! }
//! _ => {}
//! }
//! }
//! ```
//!
//! ## 事件序列化(用于 Trace)
//!
//! ```rust,no_run
//! use rucora_core::channel::types::*;
//! use serde_json;
//!
//! let event = ChannelEvent::Debug(DebugEvent {
//! message: "test".to_string(),
//! data: None,
//! });
//!
//! // 序列化为 JSON
//! let json = serde_json::to_string(&event).unwrap();
//!
//! // 反序列化
//! let parsed: ChannelEvent = serde_json::from_str(&json).unwrap();
//! ```
//!
//! # 事件类型说明
//!
//! ## Message
//!
//! 对话消息事件,用于传递助手或用户的消息。
//!
//! ## TokenDelta
//!
//! Token 流式输出事件,用于传递 LLM 的流式响应。
//!
//! ## ToolCall / ToolResult
//!
//! 工具调用和结果事件,用于记录和传递工具的执行过程。
//!
//! ## Skill / Memory
//!
//! 技能和记忆相关事件,用于记录高级功能的执行。
//!
//! ## Debug
//!
//! 调试事件,用于记录运行时内部状态。
//!
//! ## Error
//!
//! 错误事件,用于统一传递各组件的错误信息。
//!
//! ## Raw
//!
//! 原始事件,用于透传自定义数据。
/// Channel trait 定义(可选实现)
/// Channel 事件类型定义
/// Hook(钩子)优先级系统
/// 双轨指标系统(ObserverEvent 与 ObserverMetric 分离)
/// Channel 观测器 trait
///
/// 用于观测 Agent 执行过程中的事件。
///
/// # 说明
///
/// - 统一复用 [`ChannelEvent`] 作为事件载体
/// - 采用同步方法,便于在热路径上最小开销调用
/// - 需要异步处理时,建议实现方自行把事件投递到队列/channel
/// 默认空实现(丢弃所有观测事件)
///
/// 用于不需要观测功能的场景。
;
// 为了向后兼容,将 RuntimeObserver 作为 ChannelObserver 的别名
// 注意:这是一个类型别名,实际使用时应该使用 dyn ChannelObserver
// 为所有实现 ChannelObserver 的类型自动实现 RuntimeObserver
pub type NoopRuntimeObserver = NoopChannelObserver;
/// 重新导出 channel 相关 trait,方便 `rucora_core::channel::*` 使用
pub use r#trait::*;
/// 重新导出 channel 相关类型,方便使用
pub use *;
/// 重新导出 hook 相关类型
pub use ;
/// 重新导出双轨指标相关类型
pub use ;