use lellm_core::{LlmError, TokenUsage, ToolCall};
pub(crate) mod sse_frame;
pub(crate) mod sse_parser;
pub(crate) mod stream_processor;
pub(crate) mod tool_call_accumulator;
pub(crate) mod usage_accumulator;
pub(crate) use sse_frame::SseFrame;
pub(crate) use sse_parser::SseParser;
pub(crate) use tool_call_accumulator::{ToolCallAccumulator, ToolCallDelta};
pub(crate) use usage_accumulator::{UsageAccumulator, UsageDelta};
#[derive(Debug)]
pub(crate) enum StreamEvent {
Start { model: String },
Token { token: String },
ThinkingDelta {
thinking: String,
redacted: Option<String>,
},
Error(LlmError),
ResponseComplete {
tool_calls: Vec<ToolCall>,
usage: Option<TokenUsage>,
},
}
impl StreamEvent {
pub(crate) fn is_critical(&self) -> bool {
matches!(
self,
StreamEvent::Start { .. }
| StreamEvent::Error(_)
| StreamEvent::ResponseComplete { .. }
)
}
}
pub trait EventSink {
async fn emit(&mut self, event: StreamEvent) -> bool;
fn is_closed(&self) -> bool {
false
}
}