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
//! Event system for payload lifecycle and streaming hooks.
//!
//! Provides an optional, non-intrusive way to observe payload execution.
//! Payloads emit events when they start, produce tokens, and finish.
//! Users can implement [`EventHandler`] to receive these events for
//! logging, progress tracking, or streaming UIs.
use ;
use Arc;
/// Events emitted during payload execution.
/// Handler for payload lifecycle events.
///
/// Implement this trait to receive streaming tokens, progress updates,
/// and other lifecycle signals during payload execution.
///
/// This is entirely optional -- payloads work without an event handler.
///
/// # Example
///
/// ```
/// use llm_pipeline::events::{Event, EventHandler};
///
/// struct PrintHandler;
///
/// impl EventHandler for PrintHandler {
/// fn on_event(&self, event: Event) {
/// match event {
/// Event::Token { chunk, .. } => print!("{}", chunk),
/// Event::PayloadStart { name, .. } => println!("[start] {}", name),
/// Event::PayloadEnd { name, ok, .. } => println!("[end] {} ok={}", name, ok),
/// _ => {} // RetryStart, RetryEnd, PartialParse, TransportRetry
/// }
/// }
/// }
/// ```
/// Emit an event if a handler is present. No-op otherwise.
pub
/// An [`EventHandler`] backed by a closure.
///
/// # Example
///
/// ```
/// use llm_pipeline::events::{Event, FnEventHandler};
/// use std::sync::Arc;
///
/// let handler = Arc::new(FnEventHandler(|event: Event| {
/// if let Event::Token { chunk, .. } = event {
/// print!("{}", chunk);
/// }
/// }));
/// ```
;