use std::collections::BTreeMap;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use crate::ontology::SurfaceKey;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct AgentDecl {
pub name: String,
pub profile: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub label: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub parent: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub sponsor: Option<String>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub residue: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum ConversationKind {
Thread,
Private,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum ParticipantRole {
To,
Cc,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct Participant {
pub principal: String,
pub role: ParticipantRole,
pub since: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub until: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum SpeakerPolicy {
Addressed {
#[serde(default, skip_serializing_if = "Option::is_none")]
default: Option<String>,
},
All,
RoundRobin {
order: Vec<String>,
},
Selector {
selector: String,
},
Floor,
}
impl Default for SpeakerPolicy {
fn default() -> Self {
Self::Addressed { default: None }
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum HistoryRef {
Platform,
Mailbox {
thread: String,
},
Transcript {
session: String,
},
}
impl Default for HistoryRef {
fn default() -> Self {
Self::Platform
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct Conversation {
pub id: String,
pub kind: ConversationKind,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub surface: Option<SurfaceKey>,
#[serde(default)]
pub participants: Vec<Participant>,
#[serde(default)]
pub speaker: SpeakerPolicy,
#[serde(default)]
pub history: HistoryRef,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub holder: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub last_speaker: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum TransferHistory {
Full,
Filtered,
None,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum TransferState {
Pending,
Done,
Refused,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct Transfer {
pub conversation: String,
pub from: String,
pub to: String,
pub by: String,
pub reason: String,
pub history: TransferHistory,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub filter: Option<Value>,
pub state: TransferState,
pub at: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub error: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum HandoffState {
Pending,
Done,
Failed,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct Handoff {
pub session: String,
pub to: String,
pub by: String,
pub state: HandoffState,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub error: Option<String>,
pub at: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct Cost {
pub amount: f64,
pub currency: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub source: Option<String>,
}
impl Eq for Cost {}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct Usage {
pub at: String,
pub model: String,
pub input_tokens: u64,
pub output_tokens: u64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub cache_read_tokens: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub cache_write_tokens: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub cost: Option<Cost>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct SessionUsage {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub agent: Option<String>,
#[serde(default)]
pub usage: Vec<Usage>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum BudgetPeriod {
Run,
Day,
Month,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct BudgetLimit {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tokens: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub cost: Option<Cost>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct Budget {
pub period: BudgetPeriod,
pub limit: BudgetLimit,
}