Skip to main content

tandem_types/
message.rs

1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3use serde_json::Value;
4use uuid::Uuid;
5
6#[derive(Debug, Clone, Serialize, Deserialize)]
7#[serde(rename_all = "snake_case")]
8pub enum MessageRole {
9    User,
10    Assistant,
11    System,
12    Tool,
13}
14
15#[derive(Debug, Clone, Serialize, Deserialize)]
16pub struct Message {
17    pub id: String,
18    pub role: MessageRole,
19    #[serde(default)]
20    pub parts: Vec<MessagePart>,
21    pub created_at: DateTime<Utc>,
22}
23
24impl Message {
25    pub fn new(role: MessageRole, parts: Vec<MessagePart>) -> Self {
26        Self {
27            id: Uuid::new_v4().to_string(),
28            role,
29            parts,
30            created_at: Utc::now(),
31        }
32    }
33}
34
35#[derive(Debug, Clone, Serialize, Deserialize)]
36#[serde(tag = "type", rename_all = "snake_case")]
37pub enum MessagePart {
38    Text {
39        text: String,
40    },
41    Reasoning {
42        text: String,
43    },
44    ToolInvocation {
45        tool: String,
46        args: Value,
47        result: Option<Value>,
48        error: Option<String>,
49    },
50}
51
52#[derive(Debug, Clone, Serialize, Deserialize)]
53#[serde(tag = "type", rename_all = "snake_case")]
54pub enum MessagePartInput {
55    Text {
56        text: String,
57    },
58    File {
59        mime: String,
60        filename: Option<String>,
61        url: String,
62    },
63}