hermes - 💡(How to fix) Fix web_tools.py: missing _ensure_plugins_discovered() at search/extract/crawl dispatch sites causes web tools to silently fail

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…

Two related defects prevent web search, extract, and crawl from working out of the box on a fresh Hermes install. Both stem from the plugin system not being initialised before the web registry is consulted.

Error Message

Each site calls get_provider() or get_active_*_provider() from agent.web_search_registry. If _ensure_plugins_discovered() has not been called first, the registry is empty and every lookup returns None. The result is a silent fallback or a "provider not configured" error even when the correct backend is installed and configured.

Root Cause

Two related defects prevent web search, extract, and crawl from working out of the box on a fresh Hermes install. Both stem from the plugin system not being initialised before the web registry is consulted.

Fix Action

Fix

Add a plugin.yaml to each directory. Minimal working example for ddgs:

name: ddgs
kind: backend
description: DuckDuckGo search backend via the ddgs Python package -- no API key required
version: "1.0"

kind: backend triggers auto-loading as a bundled backend without requiring an entry in plugins.enabled.


Workaround

We are running a post-install patch script as ExecStartPre in our systemd unit that re-applies both fixes after every hermes update. Happy to share the script if useful.

Code Example

from agent.web_search_registry import get_provider
p = get_provider("ddgs")
print(p)  # None -- registry was never populated

---

from hermes_cli.plugins import _ensure_plugins_discovered
_ensure_plugins_discovered()
from agent.web_search_registry import get_provider
p = get_provider("ddgs")
print(p)  # <DDGSWebSearchProvider> -- works

---

# search dispatch site (same pattern needed at extract and crawl sites)
from hermes_cli.plugins import _ensure_plugins_discovered as _epp_web_search
_epp_web_search()
from agent.web_search_registry import (
    get_active_search_provider,
    get_provider as _wsp_get_provider,
)

---

plugins/web/ddgs/
plugins/web/brave_free/
plugins/web/searxng/
plugins/web/exa/
plugins/web/tavily/
plugins/web/firecrawl/
plugins/web/parallel/

---

name: ddgs
kind: backend
description: DuckDuckGo search backend via the ddgs Python package -- no API key required
version: "1.0"
RAW_BUFFERClick to expand / collapse

Summary

Two related defects prevent web search, extract, and crawl from working out of the box on a fresh Hermes install. Both stem from the plugin system not being initialised before the web registry is consulted.

Environment

  • Hermes Agent v0.13.0 (2026.5.7)
  • Python 3.12.3
  • Platform: Ubuntu 24.04.2 LTS (Linux, amd64)
  • Config: web.backend: ddgs, ddgs package installed

Defect 1: web_tools.py missing _ensure_plugins_discovered() at three registry dispatch sites

Affected functions

FunctionSiteLine (v0.13.0)
web searchsearch dispatch~787
web extractextract dispatch~921
web crawlcrawl dispatch~1167

What happens

Each site calls get_provider() or get_active_*_provider() from agent.web_search_registry. If _ensure_plugins_discovered() has not been called first, the registry is empty and every lookup returns None. The result is a silent fallback or a "provider not configured" error even when the correct backend is installed and configured.

Comparison with other tools

image_generation_tool.py and video_generation_tool.py both correctly call _ensure_plugins_discovered() before using their respective registries. web_tools.py does not.

Minimal reproduction

from agent.web_search_registry import get_provider
p = get_provider("ddgs")
print(p)  # None -- registry was never populated

vs.

from hermes_cli.plugins import _ensure_plugins_discovered
_ensure_plugins_discovered()
from agent.web_search_registry import get_provider
p = get_provider("ddgs")
print(p)  # <DDGSWebSearchProvider> -- works

Fix

Add _ensure_plugins_discovered() before each registry lookup in web_tools.py:

# search dispatch site (same pattern needed at extract and crawl sites)
from hermes_cli.plugins import _ensure_plugins_discovered as _epp_web_search
_epp_web_search()
from agent.web_search_registry import (
    get_active_search_provider,
    get_provider as _wsp_get_provider,
)

Defect 2: Web provider plugin directories missing plugin.yaml manifests

Affected directories

All 7 web provider plugin directories ship without a plugin.yaml (or plugin.yml) file:

plugins/web/ddgs/
plugins/web/brave_free/
plugins/web/searxng/
plugins/web/exa/
plugins/web/tavily/
plugins/web/firecrawl/
plugins/web/parallel/

What happens

The Hermes plugin scanner (_scan_directory_level) requires a plugin.yaml or plugin.yml manifest to recognise a directory as a plugin. Without the manifest the directory is skipped at the depth cap and the provider is never registered -- even after Defect 1 is fixed.

Fix

Add a plugin.yaml to each directory. Minimal working example for ddgs:

name: ddgs
kind: backend
description: DuckDuckGo search backend via the ddgs Python package -- no API key required
version: "1.0"

kind: backend triggers auto-loading as a bundled backend without requiring an entry in plugins.enabled.


Impact

Both defects must be fixed together for web search to work. With only Defect 1 fixed, _ensure_plugins_discovered() runs but finds nothing to register. With only Defect 2 fixed, the manifests exist but the registry is still empty at call time.

Workaround

We are running a post-install patch script as ExecStartPre in our systemd unit that re-applies both fixes after every hermes update. Happy to share the script if useful.

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING

hermes - 💡(How to fix) Fix web_tools.py: missing _ensure_plugins_discovered() at search/extract/crawl dispatch sites causes web tools to silently fail