1
0

fix: prune dead web_search tool — ddgs never installed (#87)

Remove DuckDuckGoTools import, all web_search registrations across 4 toolkit
factories, catalog entry, safety classification, prompt references, and
session regex. Total: -41 lines of dead code.

consult_grok is functional (grok_enabled=True, API key set) and opt-in,
so it stays — but Timmy never calls it autonomously, which is correct
sovereign behavior (no cloud calls unless user permits).

Closes #87
This commit is contained in:
2026-03-14 18:13:51 -04:00
parent 7ff012883a
commit b3a1e0ce36
7 changed files with 14 additions and 55 deletions

View File

@@ -1,7 +1,6 @@
"""Tool integration for the agent swarm.
Provides agents with capabilities for:
- Web search (DuckDuckGo)
- File read/write (local filesystem)
- Shell command execution (sandboxed)
- Python code execution
@@ -38,15 +37,6 @@ except ImportError as e:
_AGNO_TOOLS_AVAILABLE = False
_ImportError = e
# DuckDuckGo is optional — don't let it kill all tools
try:
from agno.tools.duckduckgo import DuckDuckGoTools
_DUCKDUCKGO_AVAILABLE = True
except ImportError:
_DUCKDUCKGO_AVAILABLE = False
DuckDuckGoTools = None # type: ignore[assignment, misc]
# Track tool usage stats
_TOOL_USAGE: dict[str, list[dict]] = {}
@@ -228,17 +218,12 @@ def _make_smart_read_file(file_tools: FileTools) -> Callable:
def create_research_tools(base_dir: str | Path | None = None):
"""Create tools for the research agent (Echo).
Includes: web search, file reading
Includes: file reading
"""
if not _AGNO_TOOLS_AVAILABLE:
raise ImportError(f"Agno tools not available: {_ImportError}")
toolkit = Toolkit(name="research")
# Web search via DuckDuckGo
if _DUCKDUCKGO_AVAILABLE:
search_tools = DuckDuckGoTools()
toolkit.register(search_tools.web_search, name="web_search")
# File reading
from config import settings
@@ -355,11 +340,6 @@ def create_data_tools(base_dir: str | Path | None = None):
toolkit.register(_make_smart_read_file(file_tools), name="read_file")
toolkit.register(file_tools.list_files, name="list_files")
# Web search for finding datasets
if _DUCKDUCKGO_AVAILABLE:
search_tools = DuckDuckGoTools()
toolkit.register(search_tools.web_search, name="web_search")
return toolkit
@@ -385,7 +365,7 @@ def create_writing_tools(base_dir: str | Path | None = None):
def create_security_tools(base_dir: str | Path | None = None):
"""Create tools for the security agent (Mace).
Includes: shell commands (for scanning), web search (for threat intel), file read
Includes: shell commands (for scanning), file read
"""
if not _AGNO_TOOLS_AVAILABLE:
raise ImportError(f"Agno tools not available: {_ImportError}")
@@ -395,11 +375,6 @@ def create_security_tools(base_dir: str | Path | None = None):
shell_tools = ShellTools()
toolkit.register(shell_tools.run_shell_command, name="shell")
# Web search for threat intelligence
if _DUCKDUCKGO_AVAILABLE:
search_tools = DuckDuckGoTools()
toolkit.register(search_tools.web_search, name="web_search")
# File reading for logs/configs
base_path = Path(base_dir) if base_dir else Path(settings.repo_root)
file_tools = FileTools(base_dir=base_path)
@@ -510,13 +485,6 @@ def create_full_toolkit(base_dir: str | Path | None = None):
# Function gets requires_confirmation=True). Fixes #79.
toolkit.requires_confirmation_tools = list(DANGEROUS_TOOLS)
# Web search (optional — degrades gracefully if ddgs not installed)
if _DUCKDUCKGO_AVAILABLE:
search_tools = DuckDuckGoTools()
toolkit.register(search_tools.web_search, name="web_search")
else:
logger.debug("DuckDuckGo tools unavailable (ddgs not installed) — skipping web_search")
# Python execution
python_tools = PythonTools()
toolkit.register(python_tools.run_python_code, name="python")
@@ -739,11 +707,6 @@ def get_all_available_tools() -> dict[str, dict]:
Dict mapping tool categories to their tools and descriptions.
"""
catalog = {
"web_search": {
"name": "Web Search",
"description": "Search the web using DuckDuckGo",
"available_in": ["echo", "seer", "mace", "orchestrator"],
},
"shell": {
"name": "Shell Commands",
"description": "Execute shell commands (sandboxed)",