Add automatic per-request MCP selection
This commit is contained in:
@@ -117,6 +117,67 @@ class StabilityGuardTests(unittest.IsolatedAsyncioTestCase):
|
||||
self.assertLess(len(result["messages"][1]["content"]), 3000)
|
||||
|
||||
|
||||
class AutoToolSelectorTests(unittest.IsolatedAsyncioTestCase):
|
||||
async def asyncSetUp(self):
|
||||
self.module = _load("auto_tool_selector")
|
||||
self.selector = self.module.Filter()
|
||||
|
||||
async def _select(self, prompt: str, existing=None):
|
||||
body = {
|
||||
"model": "mikeai-medium",
|
||||
"messages": [{"role": "user", "content": prompt}],
|
||||
}
|
||||
if existing is not None:
|
||||
body["tool_ids"] = existing
|
||||
return await self.selector.inlet(body)
|
||||
|
||||
async def test_homeassistant_is_selected_for_room_temperature(self):
|
||||
result = await self._select("Wie warm ist es gerade in der Küche?")
|
||||
self.assertEqual(
|
||||
result["tool_ids"], ["server:mcp:homeassistant-local"]
|
||||
)
|
||||
|
||||
async def test_weather_uses_web_not_homeassistant(self):
|
||||
result = await self._select("Soll es heute in Rastatt regnen?")
|
||||
self.assertEqual(result["tool_ids"], ["server:mcp:web-local"])
|
||||
|
||||
async def test_unraid_uses_readonly_not_mua(self):
|
||||
result = await self._select(
|
||||
"Welche Docker-Container laufen aktuell auf Unraid?"
|
||||
)
|
||||
self.assertEqual(
|
||||
result["tool_ids"], ["server:mcp:unraid-readonly-local"]
|
||||
)
|
||||
self.assertNotIn("server:mcp:mua", result["tool_ids"])
|
||||
|
||||
async def test_github_and_explicit_web_are_bounded_to_two(self):
|
||||
result = await self._select(
|
||||
"Prüfe dieses GitHub Repository und suche zusätzlich im Netz nach Nutzerstimmen."
|
||||
)
|
||||
self.assertEqual(
|
||||
result["tool_ids"],
|
||||
["server:mcp:github-local", "server:mcp:web-local"],
|
||||
)
|
||||
|
||||
async def test_manual_tool_is_preserved(self):
|
||||
result = await self._select(
|
||||
"Prüfe Sonarr.", ["server:mcp:manually-selected"]
|
||||
)
|
||||
self.assertEqual(
|
||||
result["tool_ids"],
|
||||
["server:mcp:manually-selected", "server:mcp:arr-local"],
|
||||
)
|
||||
|
||||
async def test_plain_chat_gets_no_tools(self):
|
||||
result = await self._select("Erkläre mir den Unterschied zwischen RAM und SSD.")
|
||||
self.assertNotIn("tool_ids", result)
|
||||
|
||||
async def test_selection_adds_write_safety_rule(self):
|
||||
result = await self._select("Zeige mir die Home Assistant Automatisierungen.")
|
||||
self.assertEqual(result["messages"][0]["role"], "system")
|
||||
self.assertIn("Availability is not authorization", result["messages"][0]["content"])
|
||||
|
||||
|
||||
class MetricsTests(unittest.IsolatedAsyncioTestCase):
|
||||
async def test_metrics_file_contains_no_chat_content_or_ids(self):
|
||||
module = _load("local_performance_metrics")
|
||||
|
||||
Reference in New Issue
Block a user