use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum Role {
System,
User,
Assistant,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Message {
pub role: Role,
pub content: Vec<ContentBlock>,
}
impl Message {
#[must_use]
pub fn user(text: impl Into<String>) -> Self {
Self { role: Role::User, content: vec![ContentBlock::Text(text.into())] }
}
#[must_use]
pub fn system(text: impl Into<String>) -> Self {
Self { role: Role::System, content: vec![ContentBlock::Text(text.into())] }
}
#[must_use]
pub fn assistant(text: impl Into<String>) -> Self {
Self { role: Role::Assistant, content: vec![ContentBlock::Text(text.into())] }
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
#[non_exhaustive]
pub enum ContentBlock {
Text(String),
}
impl ContentBlock {
#[must_use]
pub fn as_text(&self) -> Option<&str> {
let Self::Text(t) = self;
Some(t)
}
}
#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize)]
pub struct Usage {
pub input_tokens: u32,
pub output_tokens: u32,
pub cache_creation_input_tokens: u32,
pub cache_read_input_tokens: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Citation {
pub cited_text: String,
pub source: String,
pub start_index: Option<u32>,
pub end_index: Option<u32>,
}