use std::fmt;
use crate::types::common::{LettaId, Timestamp};
use serde::{Deserialize, Serialize};
use smart_default::SmartDefault;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, SmartDefault)]
#[serde(rename_all = "lowercase")]
pub enum JobStatus {
#[default]
Created,
Running,
Completed,
Failed,
Pending,
Cancelled,
Expired,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum JobType {
Job,
Run,
Batch,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Job {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<LettaId>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<JobStatus>,
#[serde(skip_serializing_if = "Option::is_none")]
pub job_type: Option<JobType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_at: Option<Timestamp>,
#[serde(skip_serializing_if = "Option::is_none")]
pub completed_at: Option<Timestamp>,
#[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 updated_at: Option<Timestamp>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub callback_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub callback_sent_at: Option<Timestamp>,
#[serde(skip_serializing_if = "Option::is_none")]
pub callback_status_code: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub callback_error: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Run {
pub id: LettaId,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<JobStatus>,
#[serde(skip_serializing_if = "Option::is_none")]
pub job_type: Option<JobType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_at: Option<Timestamp>,
#[serde(skip_serializing_if = "Option::is_none")]
pub completed_at: Option<Timestamp>,
#[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 updated_at: Option<Timestamp>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub callback_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub callback_sent_at: Option<Timestamp>,
#[serde(skip_serializing_if = "Option::is_none")]
pub callback_status_code: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub callback_error: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_config: Option<RunRequestConfig>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct RunRequestConfig {
#[serde(skip_serializing_if = "Option::is_none")]
pub agent_id: Option<LettaId>,
#[serde(skip_serializing_if = "Option::is_none")]
pub messages: Option<Vec<crate::types::message::MessageCreate>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_steps: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub use_assistant_message: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub assistant_message_tool_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub assistant_message_tool_kwarg: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub include_return_message_types: Option<Vec<crate::types::message::MessageType>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ListRunsParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub after: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub before: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub limit: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<JobStatus>,
#[serde(skip_serializing_if = "Option::is_none")]
pub agent_id: Option<LettaId>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UpdateRunStatus {
pub status: JobStatus,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ListStepsParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub run_id: Option<LettaId>,
#[serde(skip_serializing_if = "Option::is_none")]
pub agent_id: Option<LettaId>,
#[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 tags: Option<Vec<String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Step {
pub id: LettaId,
pub run_id: LettaId,
pub step_number: i32,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub messages: Option<Vec<crate::types::message::LettaMessageUnion>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_calls: Option<Vec<crate::types::message::ToolCall>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub usage: Option<StepUsage>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_at: Option<Timestamp>,
#[serde(skip_serializing_if = "Option::is_none")]
pub provider_trace: Option<ProviderTrace>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StepUsage {
#[serde(skip_serializing_if = "Option::is_none")]
pub completion_tokens: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub prompt_tokens: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub total_tokens: Option<i32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProviderTrace {
#[serde(skip_serializing_if = "Option::is_none")]
pub provider: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub model: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub duration_ms: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub raw_response: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum StepFeedback {
Positive,
Negative,
}
impl fmt::Display for StepFeedback {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Positive => f.write_str("positive"),
Self::Negative => f.write_str("negative"),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BatchJob {
#[serde(flatten)]
pub job: Job,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_count: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub completed_count: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub failed_count: Option<i32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LettaBatchRequest {
pub messages: Vec<crate::types::message::MessageCreate>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_steps: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub use_assistant_message: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub assistant_message_tool_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub assistant_message_tool_kwarg: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub include_return_message_types: Option<Vec<crate::types::message::MessageType>>,
pub agent_id: LettaId,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateBatch {
pub requests: Vec<LettaBatchRequest>,
#[serde(skip_serializing_if = "Option::is_none")]
pub callback_url: Option<String>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_job_status_serialization() {
assert_eq!(
serde_json::to_string(&JobStatus::Running).unwrap(),
"\"running\""
);
assert_eq!(
serde_json::to_string(&JobStatus::Completed).unwrap(),
"\"completed\""
);
}
#[test]
fn test_job_type_serialization() {
assert_eq!(serde_json::to_string(&JobType::Run).unwrap(), "\"run\"");
assert_eq!(serde_json::to_string(&JobType::Batch).unwrap(), "\"batch\"");
}
#[test]
fn test_step_feedback_serialization() {
assert_eq!(
serde_json::to_string(&StepFeedback::Positive).unwrap(),
"\"positive\""
);
assert_eq!(
serde_json::to_string(&StepFeedback::Negative).unwrap(),
"\"negative\""
);
}
}