mod context;
mod filter;
pub(crate) mod rerank;
pub use context::{ContextCandidates, ContextRequest};
pub use filter::SearchFilter;
use crate::config::RecallWeights;
use crate::experience::Experience;
#[derive(Clone, Debug)]
pub struct SearchOptions {
pub k: usize,
pub filter: SearchFilter,
pub weights: Option<RecallWeights>,
}
impl Default for SearchOptions {
fn default() -> Self {
Self {
k: 10,
filter: SearchFilter::default(),
weights: None,
}
}
}
#[derive(Clone, Debug)]
pub struct SearchResult {
pub experience: Experience,
pub similarity: f32,
}
#[cfg(test)]
mod tests {
use super::*;
use crate::experience::ExperienceType;
use crate::types::{AgentId, CollectiveId, ExperienceId, Timestamp};
fn make_result(similarity: f32) -> SearchResult {
let timestamp = Timestamp::now();
SearchResult {
experience: Experience {
id: ExperienceId::new(),
collective_id: CollectiveId::new(),
content: format!("test sim={}", similarity),
embedding: vec![0.1; 384],
experience_type: ExperienceType::default(),
importance: 0.5,
confidence: 0.8,
applications: std::collections::BTreeMap::new(),
domain: vec!["test".to_string()],
related_files: vec![],
source_agent: AgentId::new("agent-1"),
source_task: None,
timestamp,
last_reinforced: timestamp,
archived: false,
},
similarity,
}
}
#[test]
fn test_search_result_clone_and_debug() {
let result = make_result(0.95);
let cloned = result.clone();
assert_eq!(cloned.similarity, 0.95);
let debug = format!("{:?}", result);
assert!(!debug.is_empty());
}
#[test]
fn test_search_result_similarity_identity() {
let result = make_result(1.0);
assert_eq!(result.similarity, 1.0);
}
#[test]
fn test_search_result_similarity_can_be_negative() {
let result = make_result(-1.0);
assert!(result.similarity < 0.0);
}
}