pub use decoder::TokenizerDecoder;
pub use inference::{
CompletionUsage, FinishReason, InferenceChunk, InferenceFinishReason, PromptUsage,
};
pub use processor::StreamProcessor;
mod decoder;
mod inference;
mod processor;
pub mod state_machine;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum StreamError {
MissingTokenizer,
Decode {
detail: String,
},
}
impl std::fmt::Display for StreamError {
fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::MissingTokenizer => {
formatter.write_str("token chunk received without a tokenizer")
}
Self::Decode { detail } => write!(formatter, "failed to decode token ids: {detail}"),
}
}
}
impl std::error::Error for StreamError {}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum OutputChunk {
Start {
system_fingerprint: Option<String>,
usage: PromptUsage,
},
Raw {
content: String,
},
Reasoning {
content: String,
},
ToolCallBegin,
ToolCall {
tool_name: String,
arguments: String,
},
ToolArgumentsDelta {
content: String,
},
Finish {
reason: FinishReason,
stop_sequence: Option<String>,
usage: CompletionUsage,
},
}
pub trait ChunkGenerator: Send + 'static {
type Chunk;
fn generate(&mut self, chunk: OutputChunk) -> impl Future<Output = Vec<Self::Chunk>> + Send;
}