use crate::{
ChatRequest, ChatResponse, EmbedRequest, EmbedResponse, GenerateRequest, GenerateResponse,
Result, VersionResponse,
};
#[cfg(feature = "model")]
use crate::{
CopyRequest, CreateRequest, CreateResponse, DeleteRequest, ListResponse, PsResponse,
PullRequest, PullResponse, PushRequest, PushResponse, ShowRequest, ShowResponse,
};
use async_trait::async_trait;
use super::OllamaClient;
use super::endpoints::Endpoints;
#[async_trait]
pub trait OllamaApiAsync: Send + Sync {
async fn version(&self) -> Result<VersionResponse>;
#[cfg(feature = "model")]
async fn list_models(&self) -> Result<ListResponse>;
#[cfg(feature = "model")]
async fn copy_model(&self, request: &CopyRequest) -> Result<()>;
#[cfg(feature = "model")]
async fn list_running_models(&self) -> Result<PsResponse>;
#[cfg(feature = "model")]
async fn delete_model(&self, request: &DeleteRequest) -> Result<()>;
#[cfg(feature = "model")]
async fn show_model(&self, request: &ShowRequest) -> Result<ShowResponse>;
async fn embed(&self, request: &EmbedRequest) -> Result<EmbedResponse>;
async fn generate(&self, request: &GenerateRequest) -> Result<GenerateResponse>;
async fn chat(&self, request: &ChatRequest) -> Result<ChatResponse>;
#[cfg(feature = "model")]
async fn create_model(&self, request: &CreateRequest) -> Result<CreateResponse>;
#[cfg(feature = "model")]
async fn pull_model(&self, request: &PullRequest) -> Result<PullResponse>;
#[cfg(feature = "model")]
async fn push_model(&self, request: &PushRequest) -> Result<PushResponse>;
}
#[async_trait]
impl OllamaApiAsync for OllamaClient {
async fn version(&self) -> Result<VersionResponse> {
let url = self.config.url(Endpoints::VERSION);
self.get_with_retry(&url).await
}
#[cfg(feature = "model")]
async fn list_models(&self) -> Result<ListResponse> {
let url = self.config.url(Endpoints::TAGS);
self.get_with_retry(&url).await
}
#[cfg(feature = "model")]
async fn copy_model(&self, request: &CopyRequest) -> Result<()> {
let url = self.config.url(Endpoints::COPY);
self.post_empty_with_retry(&url, request).await
}
#[cfg(feature = "model")]
async fn list_running_models(&self) -> Result<PsResponse> {
let url = self.config.url(Endpoints::PS);
self.get_with_retry(&url).await
}
#[cfg(feature = "model")]
async fn delete_model(&self, request: &DeleteRequest) -> Result<()> {
let url = self.config.url(Endpoints::DELETE);
self.delete_empty_with_retry(&url, request).await
}
#[cfg(feature = "model")]
async fn show_model(&self, request: &ShowRequest) -> Result<ShowResponse> {
let url = self.config.url(Endpoints::SHOW);
self.post_with_retry(&url, request).await
}
async fn embed(&self, request: &EmbedRequest) -> Result<EmbedResponse> {
let url = self.config.url(Endpoints::EMBED);
self.post_with_retry(&url, request).await
}
async fn generate(&self, request: &GenerateRequest) -> Result<GenerateResponse> {
let url = self.config.url(Endpoints::GENERATE);
self.post_with_retry(&url, request).await
}
async fn chat(&self, request: &ChatRequest) -> Result<ChatResponse> {
let url = self.config.url(Endpoints::CHAT);
self.post_with_retry(&url, request).await
}
#[cfg(feature = "model")]
async fn create_model(&self, request: &CreateRequest) -> Result<CreateResponse> {
let url = self.config.url(Endpoints::CREATE);
self.post_with_retry(&url, request).await
}
#[cfg(feature = "model")]
async fn pull_model(&self, request: &PullRequest) -> Result<PullResponse> {
let url = self.config.url(Endpoints::PULL);
self.post_with_retry(&url, request).await
}
#[cfg(feature = "model")]
async fn push_model(&self, request: &PushRequest) -> Result<PushResponse> {
let url = self.config.url(Endpoints::PUSH);
self.post_with_retry(&url, request).await
}
}