feat(web): add Tavily as web search/extract/crawl backend

Adds Tavily (tavily.com) as a third web backend alongside Firecrawl
and Parallel using the Tavily REST API via httpx.

- Backend selection via hermes tools → saved as web.backend in config.yaml
- Tavily support for all three tools: search, extract, and crawl
- TAVILY_API_KEY in config registry, doctor, status, setup wizard
- _tavily_request() helper with error handling
- Normalizer functions for search results and documents
- 15 new Tavily-specific tests + 9 backend selection tests
- Backward compatible — existing Firecrawl/Parallel users unaffected

Co-authored-by: kshitijk4poor <kshitijk4poor@users.noreply.github.com>
This commit is contained in:
kshitijk4poor
2026-03-17 04:21:56 -07:00
committed by teknium1
parent 4433b83378
commit a0e4cea2b4
9 changed files with 577 additions and 12 deletions

View File

@@ -444,11 +444,11 @@ def _print_setup_summary(config: dict, hermes_home):
else:
tool_status.append(("Mixture of Agents", False, "OPENROUTER_API_KEY"))
# Web tools (Parallel or Firecrawl)
if get_env_value("PARALLEL_API_KEY") or get_env_value("FIRECRAWL_API_KEY") or get_env_value("FIRECRAWL_API_URL"):
# Web tools (Parallel, Firecrawl, or Tavily)
if get_env_value("PARALLEL_API_KEY") or get_env_value("FIRECRAWL_API_KEY") or get_env_value("FIRECRAWL_API_URL") or get_env_value("TAVILY_API_KEY"):
tool_status.append(("Web Search & Extract", True, None))
else:
tool_status.append(("Web Search & Extract", False, "PARALLEL_API_KEY or FIRECRAWL_API_KEY"))
tool_status.append(("Web Search & Extract", False, "PARALLEL_API_KEY, FIRECRAWL_API_KEY, or TAVILY_API_KEY"))
# Browser tools (local Chromium or Browserbase cloud)
import shutil