// Common types shared across all protocol implementations use serde::{Deserialize, Serialize}; /// Helper function for serde default value pub fn default_true() -> bool { true } /// Common trait for all generation requests across different APIs pub trait GenerationRequest: Send + Sync { /// Check if the request is for streaming fn is_stream(&self) -> bool; /// Get the model name if specified fn get_model(&self) -> Option<&str>; /// Extract text content for routing decisions fn extract_text_for_routing(&self) -> String; } /// Helper type for string or array of strings #[derive(Debug, Clone, Deserialize, Serialize)] #[serde(untagged)] pub enum StringOrArray { String(String), Array(Vec), } impl StringOrArray { /// Get the number of items in the StringOrArray pub fn len(&self) -> usize { match self { StringOrArray::String(_) => 1, StringOrArray::Array(arr) => arr.len(), } } /// Check if the StringOrArray is empty pub fn is_empty(&self) -> bool { match self { StringOrArray::String(s) => s.is_empty(), StringOrArray::Array(arr) => arr.is_empty(), } } /// Convert to a vector of strings pub fn to_vec(&self) -> Vec { match self { StringOrArray::String(s) => vec![s.clone()], StringOrArray::Array(arr) => arr.clone(), } } } /// LoRA adapter path - can be single path or batch of paths (SGLang extension) #[derive(Debug, Clone, Deserialize, Serialize)] #[serde(untagged)] pub enum LoRAPath { Single(Option), Batch(Vec>), }