use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use super::shorthand::deserialize_human_usize_opt;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ModelConfig {
pub source: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub format: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub architecture: Option<ArchitectureConfig>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub freeze: Option<Vec<String>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub device: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub dtype: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ArchitectureConfig {
#[serde(rename = "type")]
pub arch_type: String,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "deserialize_human_usize_opt"
)]
pub hidden_size: Option<usize>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "num_hidden_layers",
deserialize_with = "deserialize_human_usize_opt"
)]
pub num_layers: Option<usize>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "num_attention_heads",
deserialize_with = "deserialize_human_usize_opt"
)]
pub num_heads: Option<usize>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "num_key_value_heads",
deserialize_with = "deserialize_human_usize_opt"
)]
pub num_kv_heads: Option<usize>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "deserialize_human_usize_opt"
)]
pub intermediate_size: Option<usize>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "deserialize_human_usize_opt"
)]
pub vocab_size: Option<usize>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "max_position_embeddings",
deserialize_with = "deserialize_human_usize_opt"
)]
pub max_seq_length: Option<usize>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub rms_norm_eps: Option<f32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub rope_theta: Option<f32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub use_bias: Option<bool>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "deserialize_human_usize_opt"
)]
pub head_dim: Option<usize>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub layers: Option<Vec<HashMap<String, serde_json::Value>>>,
}