use crate::{
model::Model,
providers::{internal, openrouter::Client},
};
use serde::Deserialize;
#[derive(Debug, Deserialize)]
struct ModelEntry {
id: String,
name: String,
description: Option<String>,
created: u64,
context_length: Option<u32>,
#[serde(default)]
top_provider: Option<TopProvider>,
}
#[derive(Debug, Deserialize)]
struct TopProvider {
#[serde(default)]
max_completion_tokens: Option<u32>,
}
impl From<ModelEntry> for Model {
fn from(value: ModelEntry) -> Self {
Model {
id: value.id,
name: Some(value.name),
description: value.description,
r#type: None,
created_at: Some(value.created),
owned_by: None,
context_length: value.context_length,
max_output_tokens: value
.top_provider
.and_then(|provider| provider.max_completion_tokens),
}
}
}
internal::model_listing::impl_model_lister!(
OpenRouterModelLister,
Client<H>,
ModelEntry,
"OpenRouter",
"/models"
);