use serde::Serialize;
#[derive(Serialize)]
pub struct RememberResponse {
pub memory_id: i64,
pub name: String,
pub namespace: String,
pub action: String,
pub operation: String,
pub version: i64,
pub entities_persisted: usize,
pub relationships_persisted: usize,
pub relationships_truncated: bool,
pub chunks_created: usize,
pub chunks_persisted: usize,
#[serde(default)]
pub urls_persisted: usize,
#[serde(skip_serializing_if = "Option::is_none")]
pub extraction_method: Option<String>,
pub merged_into_memory_id: Option<i64>,
pub warnings: Vec<String>,
pub created_at: i64,
pub created_at_iso: String,
pub elapsed_ms: u64,
#[serde(default)]
pub name_was_normalized: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub original_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub backend_invoked: Option<&'static str>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub entities_created: Vec<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub enrich_recommended: Vec<String>,
}
#[derive(Serialize, Clone)]
pub struct RecallItem {
pub memory_id: i64,
pub name: String,
pub namespace: String,
#[serde(rename = "type")]
pub memory_type: String,
pub description: String,
pub snippet: String,
pub distance: f32,
pub score: f32,
pub source: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub graph_depth: Option<u32>,
}
impl RecallItem {
#[inline]
pub fn score_from_distance(distance: f32) -> f32 {
let raw = 1.0 - distance;
if raw.is_nan() {
0.0
} else {
raw.clamp(0.0, 1.0)
}
}
}
#[derive(Serialize)]
pub struct RecallResponse {
pub query: String,
pub k: usize,
pub direct_matches: Vec<RecallItem>,
pub graph_matches: Vec<RecallItem>,
pub results: Vec<RecallItem>,
pub elapsed_ms: u64,
#[serde(skip_serializing_if = "std::ops::Not::not", default)]
pub vec_degraded: bool,
#[serde(skip_serializing_if = "std::option::Option::is_none")]
pub vec_error: Option<String>,
#[serde(skip_serializing_if = "std::option::Option::is_none")]
pub warning: Option<String>,
#[serde(skip_serializing_if = "std::option::Option::is_none")]
pub backend_invoked: Option<&'static str>,
#[serde(skip_serializing_if = "std::option::Option::is_none")]
pub vec_degraded_reason: Option<String>,
}