use crate::{CatalogCapabilities, CatalogPricing, CatalogReasoning};
use serde::{Deserialize, Serialize};
use std::collections::{BTreeMap, BTreeSet};
pub const LIVE_SNAPSHOT_SCHEMA_VERSION: &str = "1.0.0";
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct LiveCatalogSnapshot {
pub schema_version: String,
pub provider_id: String,
pub generated_at: String,
#[serde(default)]
pub expires_at: Option<String>,
#[serde(default)]
pub target: Option<crate::ModelSupportTarget>,
#[serde(default)]
pub models: BTreeMap<String, LiveModel>,
}
impl LiveCatalogSnapshot {
#[must_use]
pub fn empty(provider_id: impl Into<String>, generated_at: impl Into<String>) -> Self {
Self {
schema_version: LIVE_SNAPSHOT_SCHEMA_VERSION.to_string(),
provider_id: provider_id.into(),
generated_at: generated_at.into(),
expires_at: None,
target: None,
models: BTreeMap::new(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct LiveModel {
pub model_id: String,
#[serde(default)]
pub target: Option<crate::ModelSupportTarget>,
#[serde(default)]
pub display_name: Option<String>,
#[serde(default)]
pub aliases: BTreeSet<String>,
#[serde(default)]
pub status: Option<String>,
#[serde(default)]
pub regions: BTreeSet<String>,
#[serde(default)]
pub capabilities: CatalogCapabilities,
#[serde(default)]
pub context_window: Option<u32>,
#[serde(default)]
pub max_output_tokens: Option<u32>,
#[serde(default)]
pub reasoning: Option<CatalogReasoning>,
#[serde(default)]
pub pricing: Option<CatalogPricing>,
#[serde(default)]
pub raw: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct LiveModelMetadata {
#[serde(default)]
pub status: Option<String>,
#[serde(default)]
pub regions: BTreeSet<String>,
#[serde(default)]
pub last_seen_at: Option<String>,
#[serde(default)]
pub source: Option<String>,
}