use serde::{Deserialize, Serialize};
#[non_exhaustive]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum AgentMessage {
Llm(#[serde(with = "llm_message_serde")] opi_ai::message::Message),
CompactionSummary(CompactionSummaryMessage),
BranchSummary(BranchSummaryMessage),
Custom(CustomAgentMessage),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CompactionSummaryMessage {
pub summary: String,
pub first_kept_entry_id: String,
pub tokens_before: u64,
pub tokens_after: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BranchSummaryMessage {
pub parent_session_id: String,
pub summary: String,
pub entry_count: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CustomAgentMessage {
pub kind: String,
pub data: serde_json::Value,
pub include_in_llm_context: bool,
}
mod llm_message_serde {
use opi_ai::message::Message;
use serde::{Deserialize, Deserializer, Serializer};
pub fn serialize<S>(msg: &Message, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
use serde::Serialize as _;
serde_json::to_value(msg)
.map_err(serde::ser::Error::custom)
.and_then(|v| v.serialize(serializer))
}
pub fn deserialize<'de, D>(deserializer: D) -> Result<Message, D::Error>
where
D: Deserializer<'de>,
{
let v = serde_json::Value::deserialize(deserializer)?;
serde_json::from_value(v).map_err(serde::de::Error::custom)
}
}