use reqwest::RequestBuilder;
#[derive(Clone, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct GenerateRequest {
pub model: String,
pub prompt: String,
pub suffix: String,
pub images: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub format: Option<String>,
#[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>,
pub options: serde_json::Value,
}
impl Default for GenerateRequest {
fn default() -> Self {
Self {
model: "gemma2".to_string(),
prompt: "42".to_string(),
suffix: "".to_string(),
images: None,
format: None,
system: None,
template: None,
stream: None,
raw: None,
keep_alive: None,
options: 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 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: 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<String>,
#[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>,
}