use crate::types::common::{LettaId, Timestamp};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ManagerType {
RoundRobin,
Supervisor,
Dynamic,
Sleeptime,
VoiceSleeptime,
Swarm,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Group {
pub id: LettaId,
pub manager_type: ManagerType,
pub agent_ids: Vec<LettaId>,
pub description: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub shared_block_ids: Option<Vec<LettaId>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub manager_agent_id: Option<LettaId>,
#[serde(skip_serializing_if = "Option::is_none")]
pub termination_token: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_turns: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sleeptime_agent_frequency: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub turns_counter: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_processed_message_id: Option<LettaId>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_message_buffer_length: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub min_message_buffer_length: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_by_id: Option<LettaId>,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_updated_by_id: Option<LettaId>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_at: Option<Timestamp>,
#[serde(skip_serializing_if = "Option::is_none")]
pub updated_at: Option<Timestamp>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "manager_type", rename_all = "snake_case")]
pub enum GroupCreateManagerConfig {
RoundRobin(RoundRobinManager),
Supervisor(SupervisorManager),
Dynamic(DynamicManager),
Sleeptime(SleeptimeManager),
VoiceSleeptime(VoiceSleeptimeManager),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "manager_type", rename_all = "snake_case")]
pub enum GroupUpdateManagerConfig {
RoundRobin(RoundRobinManagerUpdate),
Supervisor(SupervisorManagerUpdate),
Dynamic(DynamicManagerUpdate),
Sleeptime(SleeptimeManagerUpdate),
VoiceSleeptime(VoiceSleeptimeManagerUpdate),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RoundRobinManager {
#[serde(skip_serializing_if = "Option::is_none")]
pub max_turns: Option<i32>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct RoundRobinManagerUpdate {
#[serde(skip_serializing_if = "Option::is_none")]
pub max_turns: Option<i32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SupervisorManager {
pub manager_agent_id: LettaId,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct SupervisorManagerUpdate {
#[serde(skip_serializing_if = "Option::is_none")]
pub manager_agent_id: Option<LettaId>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DynamicManager {
pub manager_agent_id: LettaId,
#[serde(skip_serializing_if = "Option::is_none")]
pub termination_token: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_turns: Option<i32>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct DynamicManagerUpdate {
#[serde(skip_serializing_if = "Option::is_none")]
pub manager_agent_id: Option<LettaId>,
#[serde(skip_serializing_if = "Option::is_none")]
pub termination_token: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_turns: Option<i32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SleeptimeManager {
pub manager_agent_id: LettaId,
#[serde(skip_serializing_if = "Option::is_none")]
pub sleeptime_agent_frequency: Option<i32>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct SleeptimeManagerUpdate {
#[serde(skip_serializing_if = "Option::is_none")]
pub manager_agent_id: Option<LettaId>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sleeptime_agent_frequency: Option<i32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VoiceSleeptimeManager {
pub manager_agent_id: LettaId,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_message_buffer_length: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub min_message_buffer_length: Option<i32>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct VoiceSleeptimeManagerUpdate {
#[serde(skip_serializing_if = "Option::is_none")]
pub manager_agent_id: Option<LettaId>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_message_buffer_length: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub min_message_buffer_length: Option<i32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GroupCreate {
pub agent_ids: Vec<LettaId>,
pub description: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub manager_config: Option<GroupCreateManagerConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
pub shared_block_ids: Option<Vec<LettaId>>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct GroupUpdate {
#[serde(skip_serializing_if = "Option::is_none")]
pub agent_ids: Option<Vec<LettaId>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub manager_config: Option<GroupUpdateManagerConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
pub shared_block_ids: Option<Vec<LettaId>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct GroupsListRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub manager_type: Option<ManagerType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub before: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub after: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub limit: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub project_id: Option<String>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_manager_type_serialization() {
assert_eq!(
serde_json::to_string(&ManagerType::RoundRobin).unwrap(),
"\"round_robin\""
);
assert_eq!(
serde_json::to_string(&ManagerType::Supervisor).unwrap(),
"\"supervisor\""
);
assert_eq!(
serde_json::to_string(&ManagerType::VoiceSleeptime).unwrap(),
"\"voice_sleeptime\""
);
}
#[test]
fn test_manager_config_serialization() {
let config = GroupCreateManagerConfig::RoundRobin(RoundRobinManager {
max_turns: Some(10),
});
let json = serde_json::to_string(&config).unwrap();
assert!(json.contains("\"manager_type\":\"round_robin\""));
assert!(json.contains("\"max_turns\":10"));
}
}