use serde::{Deserialize, Serialize};
use crate::{
services::llm::{message::Message, models::base::BaseRequest},
Agent, Tool,
};
#[derive(Serialize, Debug, Clone, Deserialize)]
pub struct ChatRequest {
#[serde(flatten)]
pub base: BaseRequest,
pub messages: Vec<Message>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<Vec<Tool>>,
}
impl From<&Agent> for ChatRequest {
fn from(val: &Agent) -> Self {
ChatRequest {
base: BaseRequest {
model: val.model.clone(),
format: val.response_format.clone(),
options: val.inference_options().into_option(),
stream: Some(val.stream),
keep_alive: val.keep_alive.clone(),
},
messages: val.history.clone(),
tools: val.tools.clone(),
}
}
}
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct ChatResponse {
pub model: String,
pub created_at: String,
pub message: Message,
pub done: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub done_reason: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub total_duration: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub load_duration: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub prompt_eval_count: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub prompt_eval_duration: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub eval_count: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub eval_duration: Option<u64>,
}
#[derive(serde::Serialize, serde::Deserialize, Debug, Clone)]
pub struct ChatStreamChunk {
pub model: String,
pub created_at: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub message: Option<Message>,
pub done: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub done_reason: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub total_duration: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub load_duration: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub prompt_eval_count: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub prompt_eval_duration: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub eval_count: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub eval_duration: Option<u64>,
}