pub trait ModelName: Into<String> + serde::Serialize {
const NAME: &'static str;
}
pub trait Bounded {}
mod sealed {
pub trait Chat {}
pub trait AsyncChat {}
pub trait ChatRequestModel {}
pub trait AudioToText {}
pub trait TextToAudio {}
pub trait VideoGen {}
pub trait ImageGen {}
pub trait VoiceClone {}
impl AudioToText for crate::model::audio_to_text::GlmAsr {}
impl TextToAudio for crate::model::text_to_audio::GlmTts {}
impl VideoGen for crate::model::gen_video_async::CogVideoX3 {}
impl ImageGen for crate::model::gen_image::GlmImage {}
impl ImageGen for crate::model::gen_image::CogView4_250304 {}
impl ImageGen for crate::model::gen_image::CogView4 {}
impl ImageGen for crate::model::gen_image::CogView3Flash {}
impl VoiceClone for crate::model::voice_clone::GlmTtsClone {}
}
pub trait Chat: sealed::Chat {}
pub trait AsyncChat: sealed::AsyncChat {}
pub trait ChatRequestModel: ModelName + sealed::ChatRequestModel {
const MAX_TOKENS: u32;
}
pub trait ChatToolSupport: ChatRequestModel {
type Tool: Into<super::tools::Tools>;
}
pub trait ResponseFormatEnable: ChatRequestModel {}
pub trait WatermarkEnable: ChatRequestModel {}
macro_rules! seal_chat_capability {
($capability:ident: $($model:path),+ $(,)?) => {
$(impl sealed::$capability for $model {})+
};
}
seal_chat_capability!(Chat:
super::chat_models::GLM5_2,
super::chat_models::GLM5_1,
super::chat_models::GLM5_turbo,
super::chat_models::GLM5,
super::chat_models::GLM4_7,
super::chat_models::GLM4_7_flash,
super::chat_models::GLM4_7_flashx,
super::chat_models::GLM4_6,
super::chat_models::GLM4_5_flash,
super::chat_models::GLM4_5_air,
super::chat_models::GLM4_5_airx,
super::chat_models::GLM4_flash_250414,
super::chat_models::GLM4_flashx_250414,
super::chat_models::GLM5V_turbo,
super::chat_models::autoglm_phone,
super::chat_models::GLM4_6v,
super::chat_models::GLM4_6v_flash,
super::chat_models::GLM4_6v_flashx,
super::chat_models::GLM4v_flash,
super::chat_models::GLM4_1v_thinking_flash,
super::chat_models::GLM4_1v_thinking_flashx,
super::chat_models::GLM4_voice,
);
seal_chat_capability!(AsyncChat:
super::chat_models::GLM5_2,
super::chat_models::GLM5_1,
super::chat_models::GLM5_turbo,
super::chat_models::GLM5,
super::chat_models::GLM4_7,
super::chat_models::GLM4_6,
super::chat_models::GLM4_5_flash,
super::chat_models::GLM4_5_air,
super::chat_models::GLM4_5_airx,
super::chat_models::GLM4_flash_250414,
super::chat_models::GLM4_flashx_250414,
super::chat_models::GLM5V_turbo,
super::chat_models::GLM4_6v,
super::chat_models::GLM4_6v_flash,
super::chat_models::GLM4_6v_flashx,
super::chat_models::GLM4v_flash,
super::chat_models::GLM4_1v_thinking_flash,
super::chat_models::GLM4_1v_thinking_flashx,
super::chat_models::GLM4_voice,
);
seal_chat_capability!(ChatRequestModel:
super::chat_models::GLM5_2,
super::chat_models::GLM5_1,
super::chat_models::GLM5_turbo,
super::chat_models::GLM5,
super::chat_models::GLM4_7,
super::chat_models::GLM4_7_flash,
super::chat_models::GLM4_7_flashx,
super::chat_models::GLM4_6,
super::chat_models::GLM4_5_flash,
super::chat_models::GLM4_5_air,
super::chat_models::GLM4_5_airx,
super::chat_models::GLM4_flash_250414,
super::chat_models::GLM4_flashx_250414,
super::chat_models::GLM5V_turbo,
super::chat_models::autoglm_phone,
super::chat_models::GLM4_6v,
super::chat_models::GLM4_6v_flash,
super::chat_models::GLM4_6v_flashx,
super::chat_models::GLM4v_flash,
super::chat_models::GLM4_1v_thinking_flash,
super::chat_models::GLM4_1v_thinking_flashx,
super::chat_models::GLM4_voice,
);
pub trait ThinkEnable: ChatRequestModel {}
pub trait ReasoningEffortEnable: ChatRequestModel {}
pub trait ToolStreamEnable: ChatToolSupport {}
pub trait VideoGen: ModelName + sealed::VideoGen {}
pub trait ImageGen: ModelName + sealed::ImageGen {}
pub trait AudioToText: ModelName + sealed::AudioToText {}
pub trait TextToAudio: ModelName + sealed::TextToAudio {}
pub trait VoiceClone: ModelName + sealed::VoiceClone {}
pub trait StreamState {}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
pub struct StreamOn;
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
pub struct StreamOff;
impl StreamState for StreamOn {}
impl StreamState for StreamOff {}
macro_rules! define_model_type {
($(#[$meta:meta])* $name:ident, $s:expr) => {
#[doc = concat!(" AI model type backed by the upstream id `", $s, "`.")]
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
$(#[$meta])*
pub struct $name {}
impl ::core::convert::From<$name> for String {
fn from(_val: $name) -> Self { $s.to_string() }
}
impl ::serde::Serialize for $name {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where S: ::serde::Serializer {
serializer.serialize_str(&$s)
}
}
impl $crate::model::traits::ModelName for $name {
const NAME: &'static str = $s;
}
};
}
pub(crate) use define_model_type;
macro_rules! impl_message_binding {
($name:ident, $message_type:ty) => {
impl $crate::model::traits::Bounded for ($name, $message_type) {}
};
}
pub(crate) use impl_message_binding;
macro_rules! impl_model_markers {
($model:ident : $($marker:path),+ $(,)?) => {
$( impl $marker for $model {} )+
};
}
pub(crate) use impl_model_markers;