Skip to main content

llmrix_rust_sdk/streaming/
event.rs

1use serde::Deserialize;
2use std::collections::HashMap;
3
4// ---------------------------------------------------------------------------
5// Lifecycle
6// ---------------------------------------------------------------------------
7
8#[derive(Debug, Clone, Deserialize, Default)]
9pub struct RunStartEvent {
10    #[serde(default)]
11    pub run_id: String,
12    #[serde(default)]
13    pub thread_id: String,
14}
15
16#[derive(Debug, Clone, Deserialize, Default)]
17pub struct RunEndEvent {
18    #[serde(default)]
19    pub run_id: String,
20    #[serde(default)]
21    pub thread_id: String,
22}
23
24// ---------------------------------------------------------------------------
25// Messages
26// ---------------------------------------------------------------------------
27
28/// Incremental text fragment from the assistant.
29/// Concatenate successive `content` values to reconstruct the full message.
30#[derive(Debug, Clone, Deserialize, Default)]
31pub struct MessageChunkEvent {
32    #[serde(default)]
33    pub content: String,
34    #[serde(default)]
35    pub id: String,
36}
37
38// ---------------------------------------------------------------------------
39// Tools
40// ---------------------------------------------------------------------------
41
42#[derive(Debug, Clone, Deserialize, Default)]
43pub struct ToolStartEvent {
44    #[serde(default)]
45    pub id: String,
46    #[serde(default)]
47    pub name: String,
48    #[serde(default)]
49    pub args: HashMap<String, serde_json::Value>,
50}
51
52#[derive(Debug, Clone, Deserialize, Default)]
53pub struct ToolEndEvent {
54    #[serde(default)]
55    pub id: String,
56    #[serde(default)]
57    pub name: String,
58    #[serde(default)]
59    pub result: String,
60    #[serde(default)]
61    pub error: bool,
62}
63
64#[derive(Debug, Clone, Deserialize, Default)]
65pub struct SubagentStartEvent {
66    #[serde(default)]
67    pub id: String,
68    #[serde(default)]
69    pub agent_name: String,
70}
71
72#[derive(Debug, Clone, Deserialize, Default)]
73pub struct SubagentEndEvent {
74    #[serde(default)]
75    pub id: String,
76    #[serde(default)]
77    pub agent_name: String,
78    #[serde(default)]
79    pub error: bool,
80}
81
82// ---------------------------------------------------------------------------
83// HITL
84// ---------------------------------------------------------------------------
85
86/// Emitted when the agent pauses awaiting human approval.
87/// Call `ChatResource::decide` to resume the run.
88#[derive(Debug, Clone, Deserialize, Default)]
89pub struct HitlInterruptEvent {
90    #[serde(default)]
91    pub id: String,
92    #[serde(default)]
93    pub action_name: String,
94    #[serde(default)]
95    pub action_args: HashMap<String, serde_json::Value>,
96    #[serde(default)]
97    pub description: String,
98}
99
100// ---------------------------------------------------------------------------
101// Error / cancel
102// ---------------------------------------------------------------------------
103
104#[derive(Debug, Clone, Deserialize, Default)]
105pub struct ErrorEvent {
106    #[serde(default)]
107    pub message: String,
108    #[serde(default)]
109    pub error_code: String,
110}
111
112#[derive(Debug, Clone, Deserialize, Default)]
113pub struct CancelledEvent {
114    #[serde(default)]
115    pub reason: String,
116}
117
118// ---------------------------------------------------------------------------
119// Heartbeat
120// ---------------------------------------------------------------------------
121
122/// Periodic keep-alive. Applications may safely ignore this variant.
123#[derive(Debug, Clone, Default)]
124pub struct HeartbeatEvent;
125
126// ---------------------------------------------------------------------------
127// Sealed sum type
128// ---------------------------------------------------------------------------
129
130/// All SSE event variants. Match on this enum to handle specific events:
131///
132/// ```rust,no_run
133/// # use llmrix_rust_sdk::streaming::event::StreamEvent;
134/// # let event = StreamEvent::Heartbeat;
135/// match &event {
136///     StreamEvent::MessageChunk(e) => print!("{}", e.content),
137///     StreamEvent::RunEnd(_) => println!("\n[done]"),
138///     _ => {}
139/// }
140/// ```
141#[derive(Debug, Clone)]
142pub enum StreamEvent {
143    RunStart(RunStartEvent),
144    RunEnd(RunEndEvent),
145    MessageChunk(MessageChunkEvent),
146    ToolStart(ToolStartEvent),
147    ToolEnd(ToolEndEvent),
148    SubagentStart(SubagentStartEvent),
149    SubagentEnd(SubagentEndEvent),
150    HitlInterrupt(HitlInterruptEvent),
151    Error(ErrorEvent),
152    Cancelled(CancelledEvent),
153    Heartbeat,
154}