use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use uuid::Uuid;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum ModelFormat {
Onnx,
Burn,
Custom,
}
impl std::fmt::Display for ModelFormat {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
ModelFormat::Onnx => write!(f, "onnx"),
ModelFormat::Burn => write!(f, "burn"),
ModelFormat::Custom => write!(f, "custom"),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum DeviceAffinity {
Cpu,
Gpu,
Npu,
#[default]
Any,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AiModelEntry {
pub model_id: String,
pub name: String,
pub version: String,
pub format: ModelFormat,
pub artifact_path: String,
pub input_schema_json: Option<String>,
pub output_schema_json: Option<String>,
pub avg_latency_ms: f64,
pub accuracy: f64,
pub size_bytes: u64,
pub device_affinity: DeviceAffinity,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
impl AiModelEntry {
pub fn builder(name: impl Into<String>, version: impl Into<String>) -> AiModelEntryBuilder {
AiModelEntryBuilder {
name: name.into(),
version: version.into(),
format: ModelFormat::Onnx,
artifact_path: String::new(),
input_schema_json: None,
output_schema_json: None,
avg_latency_ms: 0.0,
accuracy: 0.0,
size_bytes: 0,
device_affinity: DeviceAffinity::Any,
}
}
}
pub struct AiModelEntryBuilder {
name: String,
version: String,
format: ModelFormat,
artifact_path: String,
input_schema_json: Option<String>,
output_schema_json: Option<String>,
avg_latency_ms: f64,
accuracy: f64,
size_bytes: u64,
device_affinity: DeviceAffinity,
}
impl AiModelEntryBuilder {
pub fn format(mut self, format: ModelFormat) -> Self {
self.format = format;
self
}
pub fn artifact_path(mut self, path: impl Into<String>) -> Self {
self.artifact_path = path.into();
self
}
pub fn avg_latency_ms(mut self, ms: f64) -> Self {
self.avg_latency_ms = ms;
self
}
pub fn accuracy(mut self, acc: f64) -> Self {
self.accuracy = acc;
self
}
pub fn size_bytes(mut self, bytes: u64) -> Self {
self.size_bytes = bytes;
self
}
pub fn device_affinity(mut self, affinity: DeviceAffinity) -> Self {
self.device_affinity = affinity;
self
}
pub fn input_schema(mut self, json: impl Into<String>) -> Self {
self.input_schema_json = Some(json.into());
self
}
pub fn output_schema(mut self, json: impl Into<String>) -> Self {
self.output_schema_json = Some(json.into());
self
}
pub fn build(self) -> AiModelEntry {
let now = Utc::now();
AiModelEntry {
model_id: Uuid::new_v4().to_string(),
name: self.name,
version: self.version,
format: self.format,
artifact_path: self.artifact_path,
input_schema_json: self.input_schema_json,
output_schema_json: self.output_schema_json,
avg_latency_ms: self.avg_latency_ms,
accuracy: self.accuracy,
size_bytes: self.size_bytes,
device_affinity: self.device_affinity,
created_at: now,
updated_at: now,
}
}
}