pub mod common; pub mod deepseek_ocr; pub mod glm_asr_nano; pub mod hunyuan_ocr; pub mod minicpm4; pub mod paddleocr_vl; pub mod qwen2_5vl; pub mod qwen3vl; pub mod rmbg2_0; pub mod voxcpm; use aha_openai_dive::v1::resources::chat::{ ChatCompletionChunkResponse, ChatCompletionParameters, ChatCompletionResponse, }; use anyhow::Result; use rocket::futures::Stream; use crate::models::{ deepseek_ocr::generate::DeepseekOCRGenerateModel, glm_asr_nano::generate::GlmAsrNanoGenerateModel, hunyuan_ocr::generate::HunyuanOCRGenerateModel, minicpm4::generate::MiniCPMGenerateModel, paddleocr_vl::generate::PaddleOCRVLGenerateModel, qwen2_5vl::generate::Qwen2_5VLGenerateModel, qwen3vl::generate::Qwen3VLGenerateModel, rmbg2_0::generate::RMBG2_0Model, voxcpm::generate::VoxCPMGenerate, }; #[derive(Debug, Clone, Copy, PartialEq, Eq, clap::ValueEnum)] pub enum WhichModel { #[value(name = "minicpm4-0.5b")] MiniCPM4_0_5B, #[value(name = "qwen2.5vl-3b")] Qwen2_5vl3B, #[value(name = "qwen2.5vl-7b")] Qwen2_5vl7B, #[value(name = "qwen3vl-2b")] Qwen3vl2B, #[value(name = "qwen3vl-4b")] Qwen3vl4B, #[value(name = "qwen3vl-8b")] Qwen3vl8B, #[value(name = "qwen3vl-32b")] Qwen3vl32B, #[value(name = "deepseek-ocr")] DeepSeekOCR, #[value(name = "hunyuan-ocr")] HunyuanOCR, #[value(name = "paddleocr-vl")] PaddleOCRVL, #[value(name = "RMBG2.0")] RMBG2_0, #[value(name = "voxcpm")] VoxCPM, #[value(name = "voxcpm1.5")] VoxCPM1_5, #[value(name = "glm-asr-nano-2512")] GlmASRNano2512, } pub trait GenerateModel { fn generate(&mut self, mes: ChatCompletionParameters) -> Result; fn generate_stream( &mut self, mes: ChatCompletionParameters, ) -> Result< Box< dyn Stream> + Send + Unpin + '_, >, >; } pub enum ModelInstance<'a> { MiniCPM4(MiniCPMGenerateModel<'a>), Qwen2_5VL(Qwen2_5VLGenerateModel<'a>), Qwen3VL(Qwen3VLGenerateModel<'a>), DeepSeekOCR(DeepseekOCRGenerateModel), HunyuanOCR(HunyuanOCRGenerateModel<'a>), PaddleOCRVL(Box>), RMBG2_0(Box), VoxCPM(Box), GlmASRNano(GlmAsrNanoGenerateModel<'a>), } impl<'a> GenerateModel for ModelInstance<'a> { fn generate(&mut self, mes: ChatCompletionParameters) -> Result { match self { ModelInstance::MiniCPM4(model) => model.generate(mes), ModelInstance::Qwen2_5VL(model) => model.generate(mes), ModelInstance::Qwen3VL(model) => model.generate(mes), ModelInstance::DeepSeekOCR(model) => model.generate(mes), ModelInstance::HunyuanOCR(model) => model.generate(mes), ModelInstance::PaddleOCRVL(model) => model.generate(mes), ModelInstance::RMBG2_0(model) => model.generate(mes), ModelInstance::VoxCPM(model) => model.generate(mes), ModelInstance::GlmASRNano(model) => model.generate(mes), } } fn generate_stream( &mut self, mes: ChatCompletionParameters, ) -> Result< Box< dyn Stream> + Send + Unpin + '_, >, > { match self { ModelInstance::MiniCPM4(model) => model.generate_stream(mes), ModelInstance::Qwen2_5VL(model) => model.generate_stream(mes), ModelInstance::Qwen3VL(model) => model.generate_stream(mes), ModelInstance::DeepSeekOCR(model) => model.generate_stream(mes), ModelInstance::HunyuanOCR(model) => model.generate_stream(mes), ModelInstance::PaddleOCRVL(model) => model.generate_stream(mes), ModelInstance::RMBG2_0(model) => model.generate_stream(mes), ModelInstance::VoxCPM(model) => model.generate_stream(mes), ModelInstance::GlmASRNano(model) => model.generate_stream(mes), } } } pub fn load_model(model_type: WhichModel, path: &str) -> Result> { let model = match model_type { WhichModel::MiniCPM4_0_5B => { let model = MiniCPMGenerateModel::init(path, None, None)?; ModelInstance::MiniCPM4(model) } WhichModel::Qwen2_5vl3B => { let model = Qwen2_5VLGenerateModel::init(path, None, None)?; ModelInstance::Qwen2_5VL(model) } WhichModel::Qwen2_5vl7B => { let model = Qwen2_5VLGenerateModel::init(path, None, None)?; ModelInstance::Qwen2_5VL(model) } WhichModel::Qwen3vl2B => { let model = Qwen3VLGenerateModel::init(path, None, None)?; ModelInstance::Qwen3VL(model) } WhichModel::Qwen3vl4B => { let model = Qwen3VLGenerateModel::init(path, None, None)?; ModelInstance::Qwen3VL(model) } WhichModel::Qwen3vl8B => { let model = Qwen3VLGenerateModel::init(path, None, None)?; ModelInstance::Qwen3VL(model) } WhichModel::Qwen3vl32B => { let model = Qwen3VLGenerateModel::init(path, None, None)?; ModelInstance::Qwen3VL(model) } WhichModel::DeepSeekOCR => { let model = DeepseekOCRGenerateModel::init(path, None, None)?; ModelInstance::DeepSeekOCR(model) } WhichModel::HunyuanOCR => { let model = HunyuanOCRGenerateModel::init(path, None, None)?; ModelInstance::HunyuanOCR(model) } WhichModel::PaddleOCRVL => { let model = PaddleOCRVLGenerateModel::init(path, None, None)?; ModelInstance::PaddleOCRVL(Box::new(model)) } WhichModel::RMBG2_0 => { let model = RMBG2_0Model::init(path, None, None)?; ModelInstance::RMBG2_0(Box::new(model)) } WhichModel::VoxCPM => { let model = VoxCPMGenerate::init(path, None, None)?; ModelInstance::VoxCPM(Box::new(model)) } WhichModel::VoxCPM1_5 => { let model = VoxCPMGenerate::init(path, None, None)?; ModelInstance::VoxCPM(Box::new(model)) } WhichModel::GlmASRNano2512 => { let model = GlmAsrNanoGenerateModel::init(path, None, None)?; ModelInstance::GlmASRNano(model) } }; Ok(model) }