use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Text {
pub text: String,
}
impl From<&str> for Text {
fn from(s: &str) -> Self {
Self { text: s.to_owned() }
}
}
impl From<String> for Text {
fn from(s: String) -> Self {
Self { text: s }
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ToolCall {
pub id: String,
pub name: String,
pub arguments: serde_json::Value,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ToolResult {
pub call_id: String,
pub name: String,
pub content: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum UserContent {
Text(Text),
ToolResult(ToolResult),
}
impl From<&str> for UserContent {
fn from(s: &str) -> Self {
UserContent::Text(s.into())
}
}
impl From<String> for UserContent {
fn from(s: String) -> Self {
UserContent::Text(s.into())
}
}
impl From<ToolResult> for UserContent {
fn from(r: ToolResult) -> Self {
UserContent::ToolResult(r)
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum AssistantContent {
Text(Text),
ToolCall(ToolCall),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "role", rename_all = "lowercase")]
pub enum Message {
System { content: String },
User { content: Vec<UserContent> },
Assistant { content: Vec<AssistantContent> },
}
impl Message {
pub fn user(text: impl Into<String>) -> Self {
Message::User {
content: vec![UserContent::Text(Text { text: text.into() })],
}
}
pub fn assistant(text: impl Into<String>) -> Self {
Message::Assistant {
content: vec![AssistantContent::Text(Text { text: text.into() })],
}
}
pub fn system(text: impl Into<String>) -> Self {
Message::System { content: text.into() }
}
}