Skip to main content

routa_core/models/
message.rs

1use 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}