use serde::{Deserialize, Serialize};
use crate::role::Role;
use crate::usage::Usage;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum FinishReason {
Stop,
Length,
ToolUse,
ContentFilter,
Error,
Cancelled,
}
pub trait StreamEvent: Send + Sync + std::fmt::Debug {
fn event_type(&self) -> &'static str;
}
pub type StreamEventRef = std::sync::Arc<dyn StreamEvent>;
#[derive(Debug, Clone, PartialEq)]
pub struct MessageStart {
pub role: Role,
pub model: String,
pub request_id: Option<String>,
}
impl StreamEvent for MessageStart {
fn event_type(&self) -> &'static str {
"message.start"
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct TextDelta {
pub text: String,
}
impl StreamEvent for TextDelta {
fn event_type(&self) -> &'static str {
"text.delta"
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct ReasoningDelta {
pub text: String,
}
impl StreamEvent for ReasoningDelta {
fn event_type(&self) -> &'static str {
"reasoning.delta"
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct ToolUseStart {
pub id: String,
pub name: String,
}
impl StreamEvent for ToolUseStart {
fn event_type(&self) -> &'static str {
"tool_use.start"
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct ToolUseDelta {
pub id: String,
pub input_delta: String,
}
impl StreamEvent for ToolUseDelta {
fn event_type(&self) -> &'static str {
"tool_use.delta"
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct ToolUseStop {
pub id: String,
}
impl StreamEvent for ToolUseStop {
fn event_type(&self) -> &'static str {
"tool_use.stop"
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct MessageStop {
pub finish_reason: FinishReason,
}
impl StreamEvent for MessageStop {
fn event_type(&self) -> &'static str {
"message.stop"
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct UsageDelta {
pub usage: Usage,
}
impl StreamEvent for UsageDelta {
fn event_type(&self) -> &'static str {
"usage.delta"
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct ErrorEvent {
pub message: String,
pub code: Option<String>,
}
impl StreamEvent for ErrorEvent {
fn event_type(&self) -> &'static str {
"error"
}
}