use serde::Deserialize;
use crate::client::{DeletedObject, OpenAiClient};
use crate::error::OpenAiError;
pub struct Models<'a> {
pub(crate) client: &'a OpenAiClient,
}
impl Models<'_> {
pub async fn list(&self) -> Result<ModelList, OpenAiError> {
self.client.get_json("/models").await
}
pub async fn retrieve(&self, model_id: &str) -> Result<Model, OpenAiError> {
self.client.get_json(&format!("/models/{model_id}")).await
}
pub async fn delete(&self, model_id: &str) -> Result<DeletedObject, OpenAiError> {
self.client
.delete_json(&format!("/models/{model_id}"))
.await
}
}
#[derive(Debug, Clone, Deserialize)]
pub struct ModelList {
pub object: Option<String>,
#[serde(default)]
pub data: Vec<Model>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct Model {
pub id: String,
pub object: Option<String>,
pub created: Option<u64>,
pub owned_by: Option<String>,
}
#[cfg(test)]
mod tests {
use super::*;
use serde_json::json;
#[test]
fn deserializes_model_list() {
let body = json!({
"object": "list",
"data": [
{"id": "gpt-5.6-terra", "object": "model", "created": 1_780_000_000u64, "owned_by": "openai"},
{"id": "text-embedding-3-small", "object": "model"}
]
});
let list: ModelList = serde_json::from_value(body).unwrap();
assert_eq!(list.data.len(), 2);
assert_eq!(list.data[0].id, "gpt-5.6-terra");
assert_eq!(list.data[1].created, None);
}
}