use super::chat::ChatResponse;
use super::common::FinishReason;
use super::common::{ResponseMetadata, Usage};
use crate::error::LlmError;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ChatStreamEvent {
ContentDelta {
delta: String,
index: Option<usize>,
},
ToolCallDelta {
id: String,
function_name: Option<String>,
arguments_delta: Option<String>,
index: Option<usize>,
},
ThinkingDelta {
delta: String,
},
UsageUpdate {
usage: Usage,
},
StreamStart {
metadata: ResponseMetadata,
},
StreamEnd {
response: ChatResponse,
},
Error {
error: String,
},
}
#[derive(Debug, Clone)]
pub enum AudioStreamEvent {
AudioDelta {
data: Vec<u8>,
format: String,
},
Metadata {
sample_rate: Option<u32>,
duration: Option<f32>,
metadata: HashMap<String, serde_json::Value>,
},
Done {
duration: Option<f32>,
metadata: HashMap<String, serde_json::Value>,
},
Error {
error: String,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum CompletionStreamEvent {
TextDelta {
text: String,
index: Option<usize>,
},
Usage {
usage: Usage,
},
Done {
finish_reason: Option<FinishReason>,
usage: Option<Usage>,
},
Error {
error: String,
},
}
use futures::Stream;
use std::pin::Pin;
pub type AudioStream =
Pin<Box<dyn Stream<Item = Result<AudioStreamEvent, LlmError>> + Send + Sync>>;
pub type CompletionStream =
Pin<Box<dyn Stream<Item = Result<CompletionStreamEvent, LlmError>> + Send + Sync>>;
#[cfg(test)]
mod tests {
use super::*;
use std::sync::Arc;
#[test]
fn test_stream_types_are_send_sync() {
fn test_arc_usage() {
let _: Option<Arc<AudioStream>> = None;
let _: Option<Arc<CompletionStream>> = None;
}
test_arc_usage();
}
}