From d7cb16a6d88328e22ff3f72a6afcd604b13b3f35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Cipriani=20Bandarra?= Date: Sun, 28 Dec 2025 20:35:04 +0000 Subject: [PATCH] Refactor to tags and ps --- examples/ps.rs | 4 ++-- examples/tags.rs | 4 ++-- src/lib.rs | 41 ++++++++++------------------------------- src/types/common.rs | 2 +- src/types/ps.rs | 5 +++++ src/types/tags.rs | 5 +++++ 6 files changed, 25 insertions(+), 36 deletions(-) diff --git a/examples/ps.rs b/examples/ps.rs index c55fb54..a97cc34 100644 --- a/examples/ps.rs +++ b/examples/ps.rs @@ -8,8 +8,8 @@ async fn main() -> Result<(), Box> { let _ = dotenvy::dotenv(); let server_address = env::var("OLLAMA_SERVER")?; let ollama_client = OllamaClient::new(server_address); - let models = ollama_client.list_runnning_models().await?; - for model in models { + let result = ollama_client.ps().await?; + for model in result.models { println!("{:?}", model); } Ok(()) diff --git a/examples/tags.rs b/examples/tags.rs index 87223c5..8e532cb 100644 --- a/examples/tags.rs +++ b/examples/tags.rs @@ -8,8 +8,8 @@ async fn main() -> Result<(), Box> { let _ = dotenvy::dotenv(); let server_address = env::var("OLLAMA_SERVER")?; let ollama_client = OllamaClient::new(server_address); - let models = ollama_client.tags().await?; - for model in models { + let response = ollama_client.tags().await?; + for model in response.models { println!("{:?}", model); } Ok(()) diff --git a/src/lib.rs b/src/lib.rs index 7aca4bf..a4a3630 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,7 +1,6 @@ use async_stream::stream; use futures_util::{Stream, StreamExt}; use serde::{Serialize, de::DeserializeOwned}; -use serde_json::Value; use tokio_util::{ codec::{FramedRead, LinesCodec}, io::StreamReader, @@ -13,9 +12,9 @@ use crate::{ types::{ chat::{ChatRequest, ChatResponse}, generate::{GenerateRequest, GenerateResponse}, - ps::RunningModel, + ps::PsResponse, pull::{PullRequest, PullResponse}, - tags::Model, + tags::TagsResponse, version::VersionResponse, }, }; @@ -34,6 +33,7 @@ impl OllamaClient { } } + /// Retrieve the version of the Ollama pub async fn version(&self) -> OllamaResult { let request_address = format!("{}/api/version", self.server_address); Ok(reqwest::get(request_address) @@ -44,47 +44,25 @@ impl OllamaClient { } /// Fetch a list of models and their details - pub async fn tags(&self) -> OllamaResult> { + pub async fn tags(&self) -> OllamaResult { let request_address = format!("{}/api/tags", self.server_address); info!("List models: {}", request_address); - let mut response: Value = reqwest::get(request_address) + Ok(reqwest::get(request_address) .await? .error_for_status()? .json() - .await?; - - let Some(response) = response.as_object_mut() else { - return Ok(vec![]); - }; - - let Some(models) = response.remove("models") else { - return Ok(vec![]); - }; - - let models = serde_json::from_value(models)?; - Ok(models) + .await?) } /// Retrieve a list of models that are currently running - pub async fn list_runnning_models(&self) -> OllamaResult> { + pub async fn ps(&self) -> OllamaResult { let request_address = format!("{}/api/ps", self.server_address); info!("List models: {}", request_address); - let mut response: Value = reqwest::get(request_address) + Ok(reqwest::get(request_address) .await? .error_for_status()? .json() - .await?; - - let Some(response) = response.as_object_mut() else { - return Ok(vec![]); - }; - - let Some(models) = response.remove("models") else { - return Ok(vec![]); - }; - - let models = serde_json::from_value(models)?; - Ok(models) + .await?) } async fn stream_response( @@ -140,6 +118,7 @@ impl OllamaClient { self.stream_response(request_address, request).await } + /// Pull a model pub async fn pull( &self, request: PullRequest, diff --git a/src/types/common.rs b/src/types/common.rs index 060d12a..aba1d1f 100644 --- a/src/types/common.rs +++ b/src/types/common.rs @@ -4,7 +4,7 @@ use serde::{Deserialize, Serialize}; pub struct ModelDetails { pub format: String, pub family: String, - pub families: Vec, + pub families: Option>, pub parameter_size: String, pub quantization_level: String, } diff --git a/src/types/ps.rs b/src/types/ps.rs index 8c4efd4..ebbc228 100644 --- a/src/types/ps.rs +++ b/src/types/ps.rs @@ -2,6 +2,11 @@ use serde::{Deserialize, Serialize}; use crate::types::common::ModelDetails; +#[derive(Debug, Serialize, Deserialize)] +pub struct PsResponse { + pub models: Vec, +} + #[derive(Debug, Serialize, Deserialize)] pub struct RunningModel { pub name: String, diff --git a/src/types/tags.rs b/src/types/tags.rs index 897ee26..6268623 100644 --- a/src/types/tags.rs +++ b/src/types/tags.rs @@ -2,6 +2,11 @@ use serde::{Deserialize, Serialize}; use crate::types::common::ModelDetails; +#[derive(Debug, Serialize, Deserialize)] +pub struct TagsResponse { + pub models: Vec, +} + #[derive(Debug, Serialize, Deserialize)] pub struct Model { pub name: String,