Root cause: web tools are silently removed from the tool schema because Firecrawl credentials aren't detected by Hermes.
Here's the chain:
- You run
hermes chat --toolsets "web,terminal,skills,memory"
- Hermes resolves the
web toolset → includes web_search and web_extract
- BUT before sending tool schemas to the model, each tool's
check_fn is called
- For web tools,
check_web_api_key() checks for env vars: FIRECRAWL_API_KEY, FIRECRAWL_API_URL, PARALLEL_API_KEY, TAVILY_API_KEY, or EXA_API_KEY
- If NONE are found → the tool is silently dropped from the schema
- Your model receives only 6 tools (terminal, process, skill_manage, skill_view, skills_list, memory) — no web tools at all
- When you say "Research X", the model has no web_search tool to call → returns empty content → retry 3x → "(empty)"
You can confirm this by looking at the startup output. You should see:
🛠️ Loaded 6 tools: memory, process, skill_manage, skill_view, skills_list, terminal
Notice web_search and web_extract are missing.
The fix — set FIRECRAWL_API_URL in ~/.hermes/.env pointing to your local Firecrawl instance:
FIRECRAWL_API_URL=http://<your-firecrawl-host>:<port>
For example if Firecrawl is running on the same machine:
FIRECRAWL_API_URL=http://localhost:3002
Or if it's on your LAN:
FIRECRAWL_API_URL=http://192.168.1.X:3002
No FIRECRAWL_API_KEY is needed for self-hosted Firecrawl — just the URL is enough. The check at line 133 of web_tools.py passes when either FIRECRAWL_API_KEY or
FIRECRAWL_API_URL is set.
Alternatively, you can set the backend explicitly in ~/.hermes/config.yaml:
web:
backend: firecrawl