use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct Dream {
pub id: String,
pub status: DreamStatus,
#[serde(default)]
pub inputs: Vec<DreamInput>,
#[serde(default)]
pub outputs: Vec<DreamOutput>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub model: Option<serde_json::Value>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub instructions: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub session_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub usage: Option<serde_json::Value>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub error: Option<serde_json::Value>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub created_at: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub ended_at: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub archived_at: Option<String>,
#[serde(flatten)]
pub extra: serde_json::Map<String, serde_json::Value>,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum DreamStatus {
Pending,
Running,
Completed,
Failed,
Canceled,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum DreamInput {
MemoryStore { memory_store_id: String },
Sessions { session_ids: Vec<String> },
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum DreamOutput {
MemoryStore { memory_store_id: String },
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct CreateDreamParams {
pub inputs: Vec<DreamInput>,
pub model: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub instructions: Option<String>,
}
impl CreateDreamParams {
pub fn new(
memory_store_id: impl Into<String>,
session_ids: Vec<String>,
model: impl Into<String>,
) -> Self {
Self {
inputs: vec![
DreamInput::MemoryStore { memory_store_id: memory_store_id.into() },
DreamInput::Sessions { session_ids },
],
model: model.into(),
instructions: None,
}
}
pub fn with_instructions(mut self, instructions: impl Into<String>) -> Self {
self.instructions = Some(instructions.into());
self
}
}
impl Dream {
pub fn output_store_id(&self) -> Option<&str> {
self.outputs.iter().find(|o| matches!(o, DreamOutput::MemoryStore { .. })).map(
|o| match o {
DreamOutput::MemoryStore { memory_store_id } => memory_store_id.as_str(),
},
)
}
pub fn is_terminal(&self) -> bool {
matches!(self.status, DreamStatus::Completed | DreamStatus::Failed | DreamStatus::Canceled)
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub(crate) struct DreamListResponse {
pub data: Vec<Dream>,
}