pub trait ModelName: Send + Sync + std::fmt::Debug + Clone + 'static {
const MODEL_NAME: &'static str;
}
pub trait ToolCallSupport {}
pub trait ReasoningSupport {}
pub trait StructuredOutputSupport {}
pub trait TextInputSupport {}
pub trait VideoInputSupport {}
pub trait AudioInputSupport {}
pub trait ImageInputSupport {}
pub trait TextOutputSupport {}
pub trait VideoOutputSupport {}
pub trait AudioOutputSupport {}
pub trait ImageOutputSupport {}
#[derive(Debug, Clone)]
pub struct DynamicModel {}
impl ModelName for DynamicModel {
const MODEL_NAME: &'static str = ""; }
#[macro_export]
macro_rules! model_capabilities {
(
provider: $provider:ident,
models: {
$(
$model:ident {
model_name: $model_name:literal,
constructor_name: $constructor_name:ident,
display_name: $display_name:literal,
capabilities: [$($capability:ident),* $(,)?]
}
),* $(,)?
}
) => {
$(
#[derive(Debug, Clone)]
#[doc = concat!(
"Represents the **",
$display_name,
"** model.\\n\\n",
"- **Model identifier:** `",
$model_name,
"`"
)]
pub struct $model;
#[doc = concat!(
"Associates the **",
$display_name,
"** model with its canonical API model identifier."
)]
impl ModelName for $model {
const MODEL_NAME: &'static str = $model_name;
}
$(
#[doc = concat!(
"Enables the [`",
stringify!($capability),
"`] capability for [`",
stringify!($provider),
"<",
stringify!($model),
">`]."
)]
impl $capability for $provider<$model> {}
)*
impl $provider<$model> {
#[doc = concat!(
"Creates a new [`",
stringify!($provider),
"`] Provider configured to use the **",
$display_name,
"** model with default settings."
)]
pub fn $constructor_name() -> Self {
Self::default()
}
}
)*
impl ToolCallSupport for $provider<DynamicModel> {}
impl StructuredOutputSupport for $provider<DynamicModel> {}
impl ReasoningSupport for $provider<DynamicModel> {}
impl TextInputSupport for $provider<DynamicModel> {}
impl TextOutputSupport for $provider<DynamicModel> {}
impl ImageInputSupport for $provider<DynamicModel> {}
impl VideoInputSupport for $provider<DynamicModel> {}
impl AudioInputSupport for $provider<DynamicModel> {}
impl ImageOutputSupport for $provider<DynamicModel> {}
impl VideoOutputSupport for $provider<DynamicModel> {}
impl AudioOutputSupport for $provider<DynamicModel> {}
};
}