use serde::{Deserialize, Serialize};
use serde_json::Value;
use super::{LettaId, Message, MessageCreateContent, MessageRole};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum BatchStatus {
Created,
Running,
Completed,
Failed,
Cancelled,
}
impl std::fmt::Display for BatchStatus {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Created => write!(f, "created"),
Self::Running => write!(f, "running"),
Self::Completed => write!(f, "completed"),
Self::Failed => write!(f, "failed"),
Self::Cancelled => write!(f, "cancelled"),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum BatchJobType {
Job,
Batch,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BatchRun {
pub created_by_id: Option<String>,
pub last_updated_by_id: Option<String>,
pub created_at: Option<String>,
pub updated_at: Option<String>,
pub status: BatchStatus,
pub completed_at: Option<String>,
#[serde(default)]
pub metadata: Value,
pub job_type: BatchJobType,
pub id: LettaId,
#[serde(skip_serializing_if = "Option::is_none")]
pub callback_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub callback_sent_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub callback_status_code: Option<u16>,
#[serde(skip_serializing_if = "Option::is_none")]
pub callback_error: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BatchMessageRequest {
pub messages: Vec<BatchMessage>,
pub agent_id: LettaId,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BatchMessage {
pub role: MessageRole,
pub content: MessageCreateContent,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_calls: Option<Vec<super::MessageToolCall>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_call_id: Option<String>,
}
impl BatchMessage {
pub fn user(content: impl Into<MessageCreateContent>) -> Self {
Self {
role: MessageRole::User,
content: content.into(),
name: None,
tool_calls: None,
tool_call_id: None,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateBatchRequest {
pub requests: Vec<BatchMessageRequest>,
#[serde(skip_serializing_if = "Option::is_none")]
pub callback_url: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ListBatchMessagesParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub limit: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cursor: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub agent_id: Option<LettaId>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sort_descending: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BatchMessagesResponse {
pub messages: Vec<Message>,
}