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}