use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "lowercase")]
pub enum Role {
User,
Assistant,
System,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct Message {
pub role: Role,
pub content: String,
}
impl Message {
pub fn user(content: impl Into<String>) -> Self {
Self {
role: Role::User,
content: content.into(),
}
}
pub fn assistant(content: impl Into<String>) -> Self {
Self {
role: Role::Assistant,
content: content.into(),
}
}
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct Transcript {
pub messages: Vec<Message>,
}
impl Transcript {
pub fn from_input(input: impl Into<String>) -> Self {
Self {
messages: vec![Message::user(input)],
}
}
pub fn push(&mut self, message: Message) {
self.messages.push(message);
}
#[must_use]
pub fn assistant_turns(&self) -> usize {
self.messages
.iter()
.filter(|m| m.role == Role::Assistant)
.count()
}
}