ainl_failure_learning/
search.rs1use ainl_memory::{AinlMemoryNode, AinlNodeType, GraphMemory};
4use uuid::Uuid;
5
6#[derive(Debug, Clone, PartialEq)]
8pub struct FailureRecallHit {
9 pub id: Uuid,
11 pub source: String,
12 pub message: String,
13 pub tool_name: Option<String>,
14 pub source_namespace: Option<String>,
16 pub source_tool: Option<String>,
18 pub score: f32,
20}
21
22fn hit_from_node(node: AinlMemoryNode) -> Option<FailureRecallHit> {
23 let AinlNodeType::Failure { failure } = node.node_type else {
24 return None;
25 };
26 Some(FailureRecallHit {
27 id: node.id,
28 source: failure.source,
29 message: failure.message,
30 tool_name: failure.tool_name,
31 source_namespace: failure.source_namespace,
32 source_tool: failure.source_tool,
33 score: 1.0,
34 })
35}
36
37pub fn search_failures_for_agent(
39 memory: &GraphMemory,
40 agent_id: &str,
41 query: &str,
42 limit: usize,
43) -> Result<Vec<FailureRecallHit>, String> {
44 let nodes = memory.search_failures_for_agent(agent_id, query, limit)?;
45 Ok(nodes.into_iter().filter_map(hit_from_node).collect())
46}