llmkit-ollama 0.1.0

Ollama (local Llama/Mistral) provider adapter for llmkit-rs
Documentation
//! Ollama wire types for `/api/chat` and `/api/embeddings`.

use serde::{Deserialize, Serialize};
use serde_json::Value;

#[derive(Debug, Serialize)]
pub(crate) struct ChatRequestBody {
    pub model: String,
    pub messages: Vec<WireMessage>,
    pub stream: bool,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub tools: Option<Vec<WireTool>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub options: Option<Options>,
}

#[derive(Debug, Serialize)]
pub(crate) struct Options {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub temperature: Option<f32>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub num_predict: Option<u32>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub stop: Option<Vec<String>>,
}

impl Options {
    pub fn is_empty(&self) -> bool {
        self.temperature.is_none() && self.num_predict.is_none() && self.stop.is_none()
    }
}

#[derive(Debug, Serialize)]
pub(crate) struct WireMessage {
    pub role: String,
    pub content: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub tool_calls: Option<Vec<WireToolCall>>,
}

#[derive(Debug, Serialize)]
pub(crate) struct WireToolCall {
    pub function: WireToolCallFunction,
}

#[derive(Debug, Serialize)]
pub(crate) struct WireToolCallFunction {
    pub name: String,
    pub arguments: Value,
}

#[derive(Debug, Serialize)]
pub(crate) struct WireTool {
    #[serde(rename = "type")]
    pub kind: &'static str,
    pub function: WireFunction,
}

#[derive(Debug, Serialize)]
pub(crate) struct WireFunction {
    pub name: String,
    pub description: String,
    pub parameters: Value,
}

#[derive(Debug, Deserialize)]
pub(crate) struct ChatResponseBody {
    #[serde(default)]
    pub model: String,
    #[serde(default)]
    pub message: Option<RespMessage>,
    #[serde(default)]
    pub done: bool,
    #[serde(default)]
    pub done_reason: Option<String>,
    #[serde(default)]
    pub prompt_eval_count: Option<u32>,
    #[serde(default)]
    pub eval_count: Option<u32>,
}

#[derive(Debug, Deserialize)]
pub(crate) struct RespMessage {
    #[serde(default)]
    pub content: String,
    #[serde(default)]
    pub tool_calls: Option<Vec<RespToolCall>>,
}

#[derive(Debug, Deserialize)]
pub(crate) struct RespToolCall {
    pub function: RespToolCallFunction,
}

#[derive(Debug, Deserialize)]
pub(crate) struct RespToolCallFunction {
    pub name: String,
    #[serde(default)]
    pub arguments: Value,
}

#[derive(Debug, Serialize)]
pub(crate) struct EmbeddingsRequestBody {
    pub model: String,
    pub input: Vec<String>,
}

#[derive(Debug, Deserialize)]
pub(crate) struct EmbeddingsResponseBody {
    #[serde(default)]
    pub model: String,
    #[serde(default)]
    pub embeddings: Vec<Vec<f32>>,
    #[serde(default)]
    pub prompt_eval_count: Option<u32>,
}