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>,
}