use serde::{Deserialize, Serialize};
use serde_json::{Map, Value as Json};
#[derive(Clone, Debug, Default, Serialize, Deserialize)]
pub struct RenderInput {
pub messages: Vec<Message>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub tools: Vec<Json>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub documents: Vec<Json>,
#[serde(default)]
pub add_generation_prompt: bool,
#[serde(default, flatten)]
pub extra: Map<String, Json>,
}
#[derive(Clone, Debug, Default, Serialize, Deserialize)]
pub struct Message {
pub role: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub content: Option<Content>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub tool_calls: Vec<Json>,
#[serde(default, flatten)]
pub extra: Map<String, Json>,
}
impl Message {
pub fn new(role: impl Into<String>, content: impl Into<String>) -> Self {
Message {
role: role.into(),
content: Some(Content::Text(content.into())),
tool_calls: Vec::new(),
extra: Map::new(),
}
}
pub fn system(content: impl Into<String>) -> Self {
Message::new("system", content)
}
pub fn user(content: impl Into<String>) -> Self {
Message::new("user", content)
}
pub fn assistant(content: impl Into<String>) -> Self {
Message::new("assistant", content)
}
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(untagged)]
pub enum Content {
Text(String),
Parts(Vec<Json>),
}
impl Default for Content {
fn default() -> Self {
Content::Text(String::new())
}
}