use serde_json::Value;
use std::collections::HashMap;
use uuid::Uuid;
#[derive(Debug, Clone)]
pub enum LcelStreamEvent {
OnLlmStart {
run_id: Uuid,
name: String,
metadata: HashMap<String, Value>,
},
OnLlmStream {
run_id: Uuid,
name: String,
token: String,
},
OnLlmEnd {
run_id: Uuid,
name: String,
output: Value,
},
OnToolEnd {
run_id: Uuid,
name: String,
output: String,
},
OnChainEnd {
run_id: Uuid,
name: String,
output: Value,
},
}
impl LcelStreamEvent {
pub fn run_id(&self) -> &Uuid {
match self {
LcelStreamEvent::OnLlmStart { run_id, .. } => run_id,
LcelStreamEvent::OnLlmStream { run_id, .. } => run_id,
LcelStreamEvent::OnLlmEnd { run_id, .. } => run_id,
LcelStreamEvent::OnToolEnd { run_id, .. } => run_id,
LcelStreamEvent::OnChainEnd { run_id, .. } => run_id,
}
}
pub fn name(&self) -> &str {
match self {
LcelStreamEvent::OnLlmStart { name, .. } => name,
LcelStreamEvent::OnLlmStream { name, .. } => name,
LcelStreamEvent::OnLlmEnd { name, .. } => name,
LcelStreamEvent::OnToolEnd { name, .. } => name,
LcelStreamEvent::OnChainEnd { name, .. } => name,
}
}
pub fn kind(&self) -> &str {
match self {
LcelStreamEvent::OnLlmStart { .. } => "on_llm_start",
LcelStreamEvent::OnLlmStream { .. } => "on_llm_stream",
LcelStreamEvent::OnLlmEnd { .. } => "on_llm_end",
LcelStreamEvent::OnToolEnd { .. } => "on_tool_end",
LcelStreamEvent::OnChainEnd { .. } => "on_chain_end",
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn stream_event_kind() {
let event = LcelStreamEvent::OnLlmStart {
run_id: Uuid::new_v4(),
name: "gpt-4o".to_string(),
metadata: HashMap::new(),
};
assert_eq!(event.kind(), "on_llm_start");
assert_eq!(event.name(), "gpt-4o");
}
#[test]
fn stream_event_variants() {
let id = Uuid::new_v4();
let event = LcelStreamEvent::OnLlmStream {
run_id: id,
name: "claude".to_string(),
token: "Hello".to_string(),
};
assert_eq!(event.kind(), "on_llm_stream");
assert_eq!(*event.run_id(), id);
}
}