skilltest_core/
conversation.rs1use schemars::JsonSchema;
5use serde::{Deserialize, Serialize};
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
9#[serde(rename_all = "lowercase")]
10pub enum Role {
11 User,
13 Assistant,
15 System,
17}
18
19#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
21pub struct Message {
22 pub role: Role,
23 pub content: String,
24}
25
26impl Message {
27 pub fn user(content: impl Into<String>) -> Self {
29 Self {
30 role: Role::User,
31 content: content.into(),
32 }
33 }
34
35 pub fn assistant(content: impl Into<String>) -> Self {
37 Self {
38 role: Role::Assistant,
39 content: content.into(),
40 }
41 }
42}
43
44#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
47pub struct Transcript {
48 pub messages: Vec<Message>,
49}
50
51impl Transcript {
52 pub fn from_input(input: impl Into<String>) -> Self {
54 Self {
55 messages: vec![Message::user(input)],
56 }
57 }
58
59 pub fn push(&mut self, message: Message) {
61 self.messages.push(message);
62 }
63
64 #[must_use]
66 pub fn assistant_turns(&self) -> usize {
67 self.messages
68 .iter()
69 .filter(|m| m.role == Role::Assistant)
70 .count()
71 }
72}