use serde::{Deserialize, Serialize};
use crate::client::Client;
use crate::error::Result;
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct ModelInfo {
pub id: String,
#[serde(rename = "type", default, skip_serializing_if = "Option::is_none")]
pub object_type: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub display_name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub created_at: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_input_tokens: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_tokens: Option<u64>,
#[serde(default, skip_serializing_if = "serde_json::Value::is_null")]
pub capabilities: serde_json::Value,
#[serde(flatten)]
pub extra: serde_json::Map<String, serde_json::Value>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct ModelPage {
pub data: Vec<ModelInfo>,
#[serde(default)]
pub has_more: bool,
#[serde(default)]
pub first_id: Option<String>,
#[serde(default)]
pub last_id: Option<String>,
}
#[derive(Clone, Debug, Default)]
pub struct ModelListParams {
pub after_id: Option<String>,
pub before_id: Option<String>,
pub limit: Option<u32>,
}
impl ModelListParams {
fn to_query(&self) -> Vec<(&'static str, String)> {
let mut query = Vec::new();
if let Some(limit) = self.limit {
query.push(("limit", limit.to_string()));
}
if let Some(after_id) = &self.after_id {
query.push(("after_id", after_id.clone()));
}
if let Some(before_id) = &self.before_id {
query.push(("before_id", before_id.clone()));
}
query
}
}
#[derive(Clone, Copy, Debug)]
pub struct Models<'a> {
client: &'a Client,
}
impl<'a> Models<'a> {
pub(crate) fn new(client: &'a Client) -> Self {
Self { client }
}
pub async fn get(&self, id: &str) -> Result<ModelInfo> {
let path = format!("/v1/models/{id}");
self.client.http().get_json(&path, &[]).await
}
pub async fn list(&self, params: &ModelListParams) -> Result<ModelPage> {
let query = params.to_query();
self.client
.http()
.get_json_query("/v1/models", &query, &[])
.await
}
}