routa_core/models/
message.rs1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
5pub enum MessageRole {
6 #[serde(rename = "SYSTEM")]
7 System,
8 #[serde(rename = "USER")]
9 User,
10 #[serde(rename = "ASSISTANT")]
11 Assistant,
12 #[serde(rename = "TOOL")]
13 Tool,
14}
15
16impl MessageRole {
17 pub fn as_str(&self) -> &'static str {
18 match self {
19 Self::System => "SYSTEM",
20 Self::User => "USER",
21 Self::Assistant => "ASSISTANT",
22 Self::Tool => "TOOL",
23 }
24 }
25
26 #[allow(clippy::should_implement_trait)]
27 pub fn from_str(s: &str) -> Option<Self> {
28 match s {
29 "SYSTEM" => Some(Self::System),
30 "USER" => Some(Self::User),
31 "ASSISTANT" => Some(Self::Assistant),
32 "TOOL" => Some(Self::Tool),
33 _ => None,
34 }
35 }
36}
37
38#[derive(Debug, Clone, Serialize, Deserialize)]
39#[serde(rename_all = "camelCase")]
40pub struct Message {
41 pub id: String,
42 pub agent_id: String,
43 pub role: MessageRole,
44 pub content: String,
45 pub timestamp: DateTime<Utc>,
46 #[serde(skip_serializing_if = "Option::is_none")]
47 pub tool_name: Option<String>,
48 #[serde(skip_serializing_if = "Option::is_none")]
49 pub tool_args: Option<String>,
50 #[serde(skip_serializing_if = "Option::is_none")]
51 pub turn: Option<i32>,
52}
53
54impl Message {
55 pub fn new(
56 id: String,
57 agent_id: String,
58 role: MessageRole,
59 content: String,
60 tool_name: Option<String>,
61 tool_args: Option<String>,
62 turn: Option<i32>,
63 ) -> Self {
64 Self {
65 id,
66 agent_id,
67 role,
68 content,
69 timestamp: Utc::now(),
70 tool_name,
71 tool_args,
72 turn,
73 }
74 }
75}