Skip to main content

routa_core/models/
agent.rs

1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3use std::collections::HashMap;
4
5#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
6pub enum AgentRole {
7    #[serde(rename = "ROUTA")]
8    Routa,
9    #[serde(rename = "CRAFTER")]
10    Crafter,
11    #[serde(rename = "GATE")]
12    Gate,
13    #[serde(rename = "DEVELOPER")]
14    Developer,
15}
16
17impl AgentRole {
18    pub fn as_str(&self) -> &'static str {
19        match self {
20            Self::Routa => "ROUTA",
21            Self::Crafter => "CRAFTER",
22            Self::Gate => "GATE",
23            Self::Developer => "DEVELOPER",
24        }
25    }
26
27    #[allow(clippy::should_implement_trait)]
28    pub fn from_str(s: &str) -> Option<Self> {
29        match s {
30            "ROUTA" => Some(Self::Routa),
31            "CRAFTER" => Some(Self::Crafter),
32            "GATE" => Some(Self::Gate),
33            "DEVELOPER" => Some(Self::Developer),
34            _ => None,
35        }
36    }
37}
38
39#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
40pub enum ModelTier {
41    #[serde(rename = "SMART")]
42    Smart,
43    #[serde(rename = "BALANCED")]
44    Balanced,
45    #[serde(rename = "FAST")]
46    Fast,
47}
48
49impl ModelTier {
50    pub fn as_str(&self) -> &'static str {
51        match self {
52            Self::Smart => "SMART",
53            Self::Balanced => "BALANCED",
54            Self::Fast => "FAST",
55        }
56    }
57
58    #[allow(clippy::should_implement_trait)]
59    pub fn from_str(s: &str) -> Option<Self> {
60        match s {
61            "SMART" => Some(Self::Smart),
62            "BALANCED" => Some(Self::Balanced),
63            "FAST" => Some(Self::Fast),
64            _ => None,
65        }
66    }
67}
68
69#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
70pub enum AgentStatus {
71    #[serde(rename = "PENDING")]
72    Pending,
73    #[serde(rename = "ACTIVE")]
74    Active,
75    #[serde(rename = "COMPLETED")]
76    Completed,
77    #[serde(rename = "ERROR")]
78    Error,
79    #[serde(rename = "CANCELLED")]
80    Cancelled,
81}
82
83impl AgentStatus {
84    pub fn as_str(&self) -> &'static str {
85        match self {
86            Self::Pending => "PENDING",
87            Self::Active => "ACTIVE",
88            Self::Completed => "COMPLETED",
89            Self::Error => "ERROR",
90            Self::Cancelled => "CANCELLED",
91        }
92    }
93
94    #[allow(clippy::should_implement_trait)]
95    pub fn from_str(s: &str) -> Option<Self> {
96        match s {
97            "PENDING" => Some(Self::Pending),
98            "ACTIVE" => Some(Self::Active),
99            "COMPLETED" => Some(Self::Completed),
100            "ERROR" => Some(Self::Error),
101            "CANCELLED" => Some(Self::Cancelled),
102            _ => None,
103        }
104    }
105}
106
107#[derive(Debug, Clone, Serialize, Deserialize)]
108#[serde(rename_all = "camelCase")]
109pub struct Agent {
110    pub id: String,
111    pub name: String,
112    pub role: AgentRole,
113    pub model_tier: ModelTier,
114    pub workspace_id: String,
115    #[serde(skip_serializing_if = "Option::is_none")]
116    pub parent_id: Option<String>,
117    pub status: AgentStatus,
118    pub created_at: DateTime<Utc>,
119    pub updated_at: DateTime<Utc>,
120    #[serde(default)]
121    pub metadata: HashMap<String, String>,
122}
123
124impl Agent {
125    pub fn new(
126        id: String,
127        name: String,
128        role: AgentRole,
129        workspace_id: String,
130        parent_id: Option<String>,
131        model_tier: Option<ModelTier>,
132        metadata: Option<HashMap<String, String>>,
133    ) -> Self {
134        let now = Utc::now();
135        Self {
136            id,
137            name,
138            role,
139            model_tier: model_tier.unwrap_or(ModelTier::Smart),
140            workspace_id,
141            parent_id,
142            status: AgentStatus::Pending,
143            created_at: now,
144            updated_at: now,
145            metadata: metadata.unwrap_or_default(),
146        }
147    }
148}