use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Clone, PartialEq)]
pub enum OllamaThink {
Enabled,
High,
Medium,
Low,
}
impl Serialize for OllamaThink {
fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
match self {
Self::Enabled => s.serialize_bool(true),
Self::High => s.serialize_str("high"),
Self::Medium => s.serialize_str("medium"),
Self::Low => s.serialize_str("low"),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub(crate) struct OllamaTool {
#[serde(rename = "type")]
pub(crate) kind: String,
pub(crate) function: OllamaToolFunction,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub(crate) struct OllamaToolFunction {
pub(crate) name: String,
pub(crate) description: String,
pub(crate) parameters: Value,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub(crate) struct OllamaToolCall {
pub(crate) function: OllamaToolCallFunction,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub(crate) struct OllamaToolCallFunction {
pub(crate) name: String,
pub(crate) arguments: Value,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub(crate) struct OllamaMessage {
pub(crate) role: String,
#[serde(default)]
pub(crate) content: String,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub(crate) thinking: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub(crate) tool_calls: Option<Vec<OllamaToolCall>>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub(crate) images: Option<Vec<String>>,
}
#[derive(Debug, Clone, Serialize, PartialEq)]
pub(crate) struct OllamaRequest {
pub(crate) model: String,
pub(crate) messages: Vec<OllamaMessage>,
pub(crate) stream: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) tools: Option<Vec<OllamaTool>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) think: Option<OllamaThink>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) format: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) options: Option<serde_json::Map<String, Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) keep_alive: Option<String>,
}
#[derive(Debug, Clone, Deserialize, PartialEq)]
pub(crate) struct OllamaResponse {
#[serde(default)]
pub(crate) model: String,
pub(crate) message: OllamaMessage,
pub(crate) done: bool,
#[serde(default)]
pub(crate) done_reason: Option<String>,
#[serde(default)]
pub(crate) prompt_eval_count: u32,
#[serde(default)]
pub(crate) eval_count: u32,
#[serde(default)]
pub(crate) total_duration: u64,
}
#[derive(Debug, Clone, Deserialize, PartialEq)]
pub(crate) struct OllamaModelListResponse {
#[serde(default)]
pub(crate) models: Vec<OllamaModelInfo>,
}
#[derive(Debug, Clone, Deserialize, PartialEq)]
pub(crate) struct OllamaModelInfo {
pub(crate) name: String,
#[serde(default)]
pub(crate) size: u64,
#[serde(default)]
pub(crate) modified_at: String,
}