use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum StreamEvent {
InitStream {
run_id: String,
conversation_id: String,
timestamp: i64,
},
Reasoning {
content: String,
},
Message {
content: String,
},
ToolCall {
index: u32,
#[serde(skip_serializing_if = "Option::is_none")]
id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
arguments: Option<String>,
},
ToolResult {
tool_call_id: String,
result: String,
is_error: bool,
duration_ms: u64,
},
Done {
#[serde(skip_serializing_if = "Option::is_none")]
finish_reason: Option<String>,
},
Error {
message: String,
#[serde(skip_serializing_if = "Option::is_none")]
node_id: Option<String>,
},
EndStream {
status: String,
total_duration_ms: u64,
},
}
impl From<praxis_llm::StreamEvent> for StreamEvent {
fn from(event: praxis_llm::StreamEvent) -> Self {
match event {
praxis_llm::StreamEvent::Reasoning { content } => {
Self::Reasoning { content }
}
praxis_llm::StreamEvent::Message { content } => {
Self::Message { content }
}
praxis_llm::StreamEvent::ToolCall {
index,
id,
name,
arguments,
} => Self::ToolCall {
index,
id,
name,
arguments,
},
praxis_llm::StreamEvent::Done { finish_reason } => {
Self::Done { finish_reason }
}
}
}
}
impl praxis_persist::StreamEventExtractor for StreamEvent {
fn is_reasoning(&self) -> bool {
matches!(self, Self::Reasoning { .. })
}
fn is_message(&self) -> bool {
matches!(self, Self::Message { .. })
}
fn is_tool_call(&self) -> bool {
matches!(self, Self::ToolCall { .. })
}
fn reasoning_content(&self) -> Option<&str> {
match self {
Self::Reasoning { content } => Some(content),
_ => None,
}
}
fn message_content(&self) -> Option<&str> {
match self {
Self::Message { content } => Some(content),
_ => None,
}
}
fn tool_call_info(&self) -> Option<(u32, Option<&str>, Option<&str>, Option<&str>)> {
match self {
Self::ToolCall { index, id, name, arguments } => {
Some((
*index,
id.as_deref(),
name.as_deref(),
arguments.as_deref(),
))
},
_ => None,
}
}
}