use std::collections::HashSet;
use std::hash::BuildHasher;
use chrono::NaiveDate;
use systemprompt_identifiers::ModelId;
use systemprompt_models::services::{
DiscoveryReport, ProviderEntry, VertexRateCard, VertexRateCardEntry,
};
fn already_declared(provider: &ProviderEntry, entry: &VertexRateCardEntry) -> bool {
std::iter::once(entry.id.as_str())
.chain(entry.aliases.iter().map(ModelId::as_str))
.any(|name| provider.find_model(name).is_some())
}
pub fn publish(
provider: &mut ProviderEntry,
entry: &VertexRateCardEntry,
today: NaiveDate,
report: &mut DiscoveryReport,
) {
let id = entry.id.as_str().to_owned();
let declared = already_declared(provider, entry);
if !entry.is_supported(today) {
if declared {
tracing::warn!(
model = %id,
retires_on = ?entry.retires_on,
docs = %entry.docs,
"explicitly declared Vertex model is retiring or unsupported; it stays served \
because the catalog declares it, but it should be removed"
);
}
report.retiring.push(id);
return;
}
if declared {
report.explicit_wins.push(id);
return;
}
provider.models.push(entry.to_provider_model());
report.discovered_priced.push(id);
}
pub fn record_unpriced(upstream: String, report: &mut DiscoveryReport) {
if !report.discovered_unpriced.contains(&upstream) {
report.discovered_unpriced.push(upstream);
}
}
pub fn record_unseen<S: BuildHasher>(
card: &VertexRateCard,
provider: &str,
seen: &HashSet<String, S>,
report: &mut DiscoveryReport,
) {
for entry in card.entries_for(provider) {
if !seen.contains(&entry.upstream) {
report
.priced_not_published
.push(entry.id.as_str().to_owned());
}
}
}