use std::collections::HashSet;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum OutputCapability {
BulkSummarizable,
ExactContent,
Unknown,
}
pub(super) fn rlm_eligible_tools() -> &'static HashSet<&'static str> {
static TOOLS: std::sync::OnceLock<HashSet<&'static str>> = std::sync::OnceLock::new();
TOOLS.get_or_init(|| ["webfetch", "websearch", "batch"].into_iter().collect())
}
fn rlm_exact_content_tools() -> &'static HashSet<&'static str> {
static TOOLS: std::sync::OnceLock<HashSet<&'static str>> = std::sync::OnceLock::new();
TOOLS.get_or_init(|| {
[
"read",
"grep",
"bash",
"glob",
"ls",
"edit",
"write",
"session_recall",
"notebook_read",
"notebook_edit",
]
.into_iter()
.collect()
})
}
pub fn output_capability(tool_id: &str) -> OutputCapability {
if tool_id == "session_context" || rlm_eligible_tools().contains(tool_id) {
OutputCapability::BulkSummarizable
} else if rlm_exact_content_tools().contains(tool_id) {
OutputCapability::ExactContent
} else {
OutputCapability::Unknown
}
}
#[cfg(test)]
mod tests {
use super::{OutputCapability, output_capability};
#[test]
fn classifies_known_tools() {
assert_eq!(
output_capability("webfetch"),
OutputCapability::BulkSummarizable
);
assert_eq!(
output_capability("session_context"),
OutputCapability::BulkSummarizable
);
assert_eq!(output_capability("read"), OutputCapability::ExactContent);
assert_eq!(output_capability("bash"), OutputCapability::ExactContent);
assert_eq!(
output_capability("session_recall"),
OutputCapability::ExactContent
);
assert_eq!(
output_capability("brand_new_tool"),
OutputCapability::Unknown
);
}
}