use crate::{AssistantMessage, StopReason, ToolCall};
#[derive(Debug, Clone)]
pub enum ProviderEvent {
Start { partial: AssistantMessage },
TextStart {
content_index: usize,
partial: AssistantMessage,
},
TextDelta {
content_index: usize,
delta: String,
partial: AssistantMessage,
},
TextEnd {
content_index: usize,
content: String,
partial: AssistantMessage,
},
ThinkingStart {
content_index: usize,
partial: AssistantMessage,
},
ThinkingDelta {
content_index: usize,
delta: String,
partial: AssistantMessage,
},
ThinkingEnd {
content_index: usize,
content: String,
partial: AssistantMessage,
},
ToolCallStart {
content_index: usize,
partial: AssistantMessage,
},
ToolCallDelta {
content_index: usize,
delta: String,
partial: AssistantMessage,
},
ToolCallEnd {
content_index: usize,
tool_call: ToolCall,
partial: AssistantMessage,
},
Done {
reason: StopReason,
message: AssistantMessage,
},
Error {
reason: StopReason,
error: AssistantMessage,
},
}
impl ProviderEvent {
pub fn partial(&self) -> Option<&AssistantMessage> {
match self {
ProviderEvent::Start { partial }
| ProviderEvent::TextStart { partial, .. }
| ProviderEvent::TextDelta { partial, .. }
| ProviderEvent::TextEnd { partial, .. }
| ProviderEvent::ThinkingStart { partial, .. }
| ProviderEvent::ThinkingDelta { partial, .. }
| ProviderEvent::ThinkingEnd { partial, .. }
| ProviderEvent::ToolCallStart { partial, .. }
| ProviderEvent::ToolCallDelta { partial, .. }
| ProviderEvent::ToolCallEnd { partial, .. } => Some(partial),
ProviderEvent::Done { message, .. } => Some(message),
ProviderEvent::Error { error, .. } => Some(error),
}
}
pub fn is_done(&self) -> bool {
matches!(self, ProviderEvent::Done { .. })
}
pub fn is_error(&self) -> bool {
matches!(self, ProviderEvent::Error { .. })
}
}