use reqwest::RequestBuilder;
#[derive(Clone, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct GenerateRequest {
pub model: String,
pub prompt: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub suffix: Option<String>,
pub images: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub format: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub system: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub template: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub stream: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub raw: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub keep_alive: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub options: Option<serde_json::Value>,
}
impl Default for GenerateRequest {
fn default() -> Self {
Self {
model: "gemma2".to_string(),
prompt: "42".to_string(),
suffix: None,
images: None,
format: None,
system: None,
template: None,
stream: None,
raw: None,
keep_alive: None,
options: Some(serde_json::json!({ "num_ctx": 12288 })),
}
}
}
impl GenerateRequest {
pub fn make_request(&self, ollama_host: &str) -> RequestBuilder {
reqwest::Client::new()
.post(format!("{}/api/generate", ollama_host))
.json(self)
}
}
#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)]
pub struct GenerateResponse {
pub model: String,
pub created_at: String,
pub response: String,
pub done: bool,
pub done_reason: Option<String>,
pub total_duration: Option<f64>,
pub load_duration: Option<f64>,
pub prompt_eval_count: Option<f64>,
pub prompt_eval_duration: Option<f64>,
pub eval_count: Option<f64>,
pub eval_duration: Option<f64>,
pub context: Option<Vec<f64>>,
}
#[derive(Clone, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct ChatMessage {
pub role: String,
pub content: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub images: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_calls: Option<Vec<serde_json::Value>>,
}
#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)]
pub struct ChatRequest {
pub model: String,
pub messages: Vec<ChatMessage>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub format: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub stream: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub keep_alive: Option<String>,
pub options: serde_json::Value,
}
impl ChatRequest {
pub fn make_request(&self, ollama_host: &str) -> RequestBuilder {
reqwest::Client::new()
.post(format!("{}/api/chat", ollama_host))
.json(self)
}
}
#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)]
pub struct ChatResponse {
pub model: String,
pub created_at: String,
pub message: ChatMessage,
pub done: bool,
pub total_duration: Option<f64>,
pub load_duration: Option<f64>,
pub prompt_eval_count: Option<f64>,
pub prompt_eval_duration: Option<f64>,
pub eval_count: Option<f64>,
pub eval_duration: Option<f64>,
}
#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)]
pub struct EmbedRequest {
pub model: String,
pub input: Vec<String>,
}
impl EmbedRequest {
pub fn make_request(&self, ollama_host: &str) -> RequestBuilder {
reqwest::Client::new()
.post(format!("{}/api/embed", ollama_host))
.json(self)
}
}
#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)]
pub struct EmbedResponse {
pub model: String,
pub embeddings: Vec<Vec<f32>>,
pub total_duration: Option<f64>,
pub load_duration: Option<f64>,
pub prompt_eval_count: Option<f64>,
}