Warn about confusing agent tool catalogs
Deploy / deploy (push) Successful in 1m34s
CI / Rust Checks (push) Successful in 5m3s
CI / UI Checks (push) Successful in 5s
CI / Deployment Manifests (push) Successful in 3s
CI / Frontend E2E (push) Successful in 4m44s

This commit is contained in:
github-ops
2026-06-20 21:09:45 +00:00
parent ce773e6196
commit 7099faad2b
6 changed files with 218 additions and 6 deletions
+76 -2
View File
@@ -1,6 +1,7 @@
use crank_core::{
ToolDescription, ToolQualityFinding, ToolQualityMappingRule, ToolQualityMappingSet,
ToolQualityReport, ToolQualitySchemaNode, ToolQualitySeverity, analyze_tool_identity_quality,
ToolDescription, ToolQualityCatalogTool, ToolQualityFinding, ToolQualityMappingRule,
ToolQualityMappingSet, ToolQualityReport, ToolQualitySchemaNode, ToolQualitySeverity,
analyze_agent_tool_catalog_quality, analyze_tool_identity_quality,
analyze_tool_response_projection_quality, analyze_tool_schema_quality,
};
@@ -235,6 +236,79 @@ fn marks_large_output_projection_as_info() {
));
}
#[test]
fn warns_about_large_agent_tool_catalog() {
let tools: Vec<ToolQualityCatalogTool> = (0..9)
.map(|index| {
catalog_tool(
&format!("tool_{index}"),
&format!("Tool {index}"),
"Does one task",
)
})
.collect();
let report = analyze_agent_tool_catalog_quality(&tools);
assert!(has_finding(
&report,
"agent_catalog_too_large",
ToolQualitySeverity::Warning
));
}
#[test]
fn warns_about_similar_agent_tools() {
let tools = vec![
catalog_tool(
"get_exchange_rate",
"Получить курс валюты",
"Получает последний курс валюты",
),
catalog_tool(
"fetch_exchange_rate",
"Запросить курс валюты",
"Получает текущий курс валюты",
),
];
let report = analyze_agent_tool_catalog_quality(&tools);
assert!(has_finding(
&report,
"agent_catalog_similar_tools",
ToolQualitySeverity::Warning
));
}
#[test]
fn accepts_small_catalog_with_distinct_tools() {
let tools = vec![
catalog_tool(
"get_exchange_rate",
"Получить курс валюты",
"Получает курс валюты",
),
catalog_tool(
"get_weather_forecast",
"Получить прогноз погоды",
"Получает прогноз погоды",
),
];
let report = analyze_agent_tool_catalog_quality(&tools);
assert!(report.findings.is_empty());
}
fn catalog_tool(name: &str, display_name: &str, description: &str) -> ToolQualityCatalogTool {
ToolQualityCatalogTool {
name: name.to_owned(),
display_name: display_name.to_owned(),
description: description.to_owned(),
}
}
fn has_finding(report: &ToolQualityReport, code: &str, severity: ToolQualitySeverity) -> bool {
report
.findings