Skip to content

[Bug]: Plugin-registered web providers can't be selected via web.extract_backend #57581

Description

@LeMoussel

Bug Description

Setting web.extract_backend to the name of a provider that was registered by a plugin (as opposed to one of the built-in backends) is silently ignored. web_extract() ends up dispatching to a different, auto-detected backend instead of surfacing an error or honoring the configured plugin.

Impact: Any web-extract or web-search plugin that introduces a new provider name (not in the hardcoded list in _is_backend_available()/_get_backend()) cannot be selected via web.extract_backend / web.search_backend / web.backend — the config is silently overridden by whatever backend auto-detection happens to pick, with no error or warning to the user.

Steps to Reproduce

  1. Install a web-extract plugin that registers a provider under a custom name, e.g. a local plugin at .hermes/plugins/web/pageprune/ with plugin.yaml declaring:
    provides_web_providers:
      - pageprune
  2. Set the following in .hermes/config.yaml:
    web:
      backend: ''
      search_backend: exa
      extract_backend: pageprune
  3. Make sure another backend's credentials are also present in the environment (e.g. TAVILY_API_KEY).
  4. Start Hermes and ask the agent to fetch/extract the content of a URL (triggers web_extract).
  5. Check .hermes/logs/agent.log.

Expected Behavior

web_extract() should dispatch the URL extraction through the pageprune provider, as explicitly configured in web.extract_backend.

Actual Behavior

Plugin discovery correctly finds and registers the plugin:

INFO hermes_cli.plugins: Plugin 'web-pageprune' registered web provider: pageprune
INFO hermes_cli.plugins: Plugin discovery complete: 55 found, 31 enabled

But web_extract dispatches to tavily instead of pageprune:

INFO tools.web_tools: Web extract via tavily: 1 URL(s)
INFO plugins.web.tavily.provider: Tavily extract: 1 URL(s)

TAVILY_API_KEY happens to be set in the environment, which is why tavily is chosen — with no key set, a similarly wrong (but different) backend would be picked instead. Either way, the explicit extract_backend: pageprune setting is never honored, and no warning or error is surfaced to the user.

Affected Component

Tools (terminal, file ops, web, code execution, etc.)

Messaging Platform (if gateway-related)

No response

Debug Report

[hermes debug share: log content redacted at upload time. run with --no-redact to disable]
--- hermes dump ---
version:          0.18.0 [42bc07d1] (2026-07-03)
os:               Linux 6.8.0-134-generic x86_64
python:           3.11.14
openai_sdk:       2.24.0
profile:          default
hermes_home:      ~/.hermes
model:            deepreinforce-ai/Ornith-1.0-35B-GGUF:Q4_K_M
provider:         llama-cpp
terminal:         local

api_keys:
  openrouter           set
  openai               not set
  anthropic            not set
  anthropic_token      not set
  nous                 not set
  google/gemini        not set
  gemini               not set
  glm/zai              not set
  zai                  not set
  kimi                 not set
  minimax              not set
  deepseek             not set
  dashscope            not set
  huggingface          not set
  nvidia               set
  opencode_zen         not set
  opencode_go          not set
  kilocode             not set
  firecrawl            not set
  tavily               set
  browserbase          not set
  fal                  not set
  elevenlabs           not set
  github               not set

features:
  toolsets:           hermes-cli
  mcp_servers:        0
  memory_provider:    built-in
  gateway:            stopped (systemd (user))
  platforms:          none
  cron_jobs:          0
  skills:             102
--- end dump ---


--- agent.log (last 200 lines) ---
2026-07-03 08:44:21,025 INFO hermes_cli.plugins: Plugin 'openrouter' registered image_gen provider: openrouter
2026-07-03 08:44:21,025 INFO hermes_cli.plugins: Plugin 'openrouter' registered image_gen provider: nous
2026-07-03 08:44:21,316 INFO hermes_cli.plugins: Plugin 'web-exa' registered web provider: exa
2026-07-03 08:44:21,316 INFO hermes_cli.plugins: Plugin 'web-tavily' registered web provider: tavily
2026-07-03 08:44:21,326 INFO hermes_plugins.get_serp_data: DataForSEO SERP plugin registered
2026-07-03 08:44:21,327 INFO hermes_plugins.research_serp: research_serp plugin registered
2026-07-03 08:44:21,330 INFO hermes_plugins.weather: Chaining-ready weather plugin registered
2026-07-03 08:44:21,384 INFO hermes_cli.plugins: Plugin 'web-pageprune' registered web provider: pageprune
2026-07-03 08:44:21,385 INFO hermes_cli.plugins: Plugin discovery complete: 55 found, 31 enabled
2026-07-03 08:44:24,544 INFO run_agent: Loaded environment variables from /home/dev/.hermes/.env
2026-07-03 08:44:24,545 INFO run_agent: Loaded environment variables from /home/dev/Python/HermesAgent/hermes-agent/.env
2026-07-03 08:44:25,027 INFO hermes_cli.plugins: Plugin 'openrouter' registered image_gen provider: openrouter
2026-07-03 08:44:25,027 INFO hermes_cli.plugins: Plugin 'openrouter' registered image_gen provider: nous
2026-07-03 08:44:25,258 INFO hermes_cli.plugins: Plugin 'web-exa' registered web provider: exa
2026-07-03 08:44:25,259 INFO hermes_cli.plugins: Plugin 'web-tavily' registered web provider: tavily
2026-07-03 08:44:25,262 INFO hermes_plugins.get_serp_data: DataForSEO SERP plugin registered
2026-07-03 08:44:25,264 INFO hermes_plugins.research_serp: research_serp plugin registered
2026-07-03 08:44:25,267 INFO hermes_plugins.weather: Chaining-ready weather plugin registered
2026-07-03 08:44:25,323 INFO hermes_cli.plugins: Plugin 'web-pageprune' registered web provider: pageprune
2026-07-03 08:44:25,323 INFO hermes_cli.plugins: Plugin discovery complete: 55 found, 31 enabled
2026-07-03 08:44:25,737 INFO run_agent: OpenAI client created (agent_init, shared=True) thread=Thread-5 (_build):137433500866240 provider=custom base_url=http://192.168.1.42:18080/v1 model=deepreinforce-ai/Ornith-1.0-35B-GGUF:Q4_K_M
2026-07-03 08:44:25,739 WARNING tools.registry: check_fn check_browser_requirements returned False; dependent tools will be unavailable this turn
2026-07-03 08:44:25,740 WARNING tools.registry: check_fn _browser_cdp_check returned False; dependent tools will be unavailable this turn
2026-07-03 08:44:25,741 WARNING tools.registry: check_fn _browser_dialog_check returned False; dependent tools will be unavailable this turn
2026-07-03 08:44:25,743 WARNING tools.registry: check_fn check_browser_vision_requirements returned False; dependent tools will be unavailable this turn
2026-07-03 08:44:25,743 WARNING tools.registry: check_fn check_close_terminal_requirements returned False; dependent tools will be unavailable this turn
2026-07-03 08:44:25,780 WARNING tools.registry: check_fn _check_kanban_mode returned False; dependent tools will be unavailable this turn
2026-07-03 08:44:25,781 WARNING tools.registry: check_fn _check_kanban_orchestrator_mode returned False; dependent tools will be unavailable this turn
2026-07-03 08:44:25,781 WARNING tools.registry: check_fn check_read_terminal_requirements returned False; dependent tools will be unavailable this turn
2026-07-03 08:44:25,878 INFO agent.auxiliary_client: Vision auto-detect: using main provider llama-cpp (deepreinforce-ai/Ornith-1.0-35B-GGUF:Q4_K_M)
2026-07-03 08:45:29,056 INFO [20260703_084424_595704] agent.turn_context: conversation turn: session=20260703_084424_595704 model=deepreinforce-ai/Ornith-1.0-35B-GGUF:Q4_K_M provider=custom platform=tui history=0 msg='donne le contenu de la page https://zonetuto.fr'
2026-07-03 08:45:29,758 WARNING [20260703_084424_595704] agent.prompt_builder: ⚠️  Context file AGENTS.md TRUNCATED: 70678 chars exceeds limit of 62914 — trim the file, pin a larger context_file_max_chars, or use a larger-context model!
2026-07-03 08:45:29,830 INFO [20260703_084424_595704] hermes_plugins.observability__langfuse: Langfuse tracing: started trace dd4ce308b314913fa2a397cc00b13b07 for task:20260703_084424_595704:turn:20260703_084424_595704:20260703_084424_595704:3834b4f1
2026-07-03 08:45:29,841 INFO run_agent: OpenAI client created (chat_completion_stream_request, shared=False) thread=Thread-14 (_call):137432477447872 provider=custom base_url=http://192.168.1.42:18080/v1 model=deepreinforce-ai/Ornith-1.0-35B-GGUF:Q4_K_M
2026-07-03 08:46:43,407 INFO run_agent: OpenAI client closed (stream_request_complete, shared=False, tcp_force_closed=0) thread=Thread-14 (_call):137432477447872 provider=custom base_url=http://192.168.1.42:18080/v1 model=deepreinforce-ai/Ornith-1.0-35B-GGUF:Q4_K_M
2026-07-03 08:46:43,408 INFO [20260703_084424_595704] agent.conversation_loop: API call #1: model=deepreinforce-ai/Ornith-1.0-35B-GGUF:Q4_K_M provider=custom in=32988 out=74 total=33062 latency=73.6s
2026-07-03 08:46:43,427 INFO [20260703_084424_595704] tools.web_tools: Extracting content from 1 URL(s)
2026-07-03 08:46:43,466 INFO [20260703_084424_595704] tools.web_tools: Web extract via tavily: 1 URL(s)
2026-07-03 08:46:43,466 INFO plugins.web.tavily.provider: Tavily extract: 1 URL(s)
2026-07-03 08:46:43,466 INFO plugins.web.tavily.provider: Tavily extract request to https://api.tavily.com/extract
2026-07-03 08:46:43,992 INFO [20260703_084424_595704] tools.web_tools: Extracted content from 1 pages
2026-07-03 08:46:43,994 INFO [20260703_084424_595704] tools.web_tools: https://zonetuto.fr (9524 chars, whole)
2026-07-03 08:46:43,995 INFO [20260703_084424_595704] agent.tool_executor: tool web_extract completed (0.57s, 9789 chars)
2026-07-03 08:46:44,015 INFO run_agent: OpenAI client created (chat_completion_stream_request, shared=False) thread=Thread-15 (_call):137432469055168 provider=custom base_url=http://192.168.1.42:18080/v1 model=deepreinforce-ai/Ornith-1.0-35B-GGUF:Q4_K_M
2026-07-03 08:47:05,803 INFO run_agent: OpenAI client closed (stream_request_complete, shared=False, tcp_force_closed=0) thread=Thread-15 (_call):137432469055168 provider=custom base_url=http://192.168.1.42:18080/v1 model=deepreinforce-ai/Ornith-1.0-35B-GGUF:Q4_K_M
2026-07-03 08:47:05,804 INFO [20260703_084424_595704] agent.conversation_loop: API call #2: model=deepreinforce-ai/Ornith-1.0-35B-GGUF:Q4_K_M provider=custom in=36033 out=1364 total=37397 latency=21.8s cache=32965/36033 (91%)
2026-07-03 08:47:05,944 INFO [20260703_084424_595704] agent.conversation_loop: Turn ended: reason=text_response(finish_reason=stop) model=deepreinforce-ai/Ornith-1.0-35B-GGUF:Q4_K_M api_calls=2/90 budget=2/90 tool_turns=1 last_msg_role=assistant response_len=3987 session=20260703_084424_595704
2026-07-03 08:47:05,964 INFO agent.auxiliary_client: Auxiliary title_generation: using custom (deepreinforce-ai/Ornith-1.0-35B-GGUF:Q4_K_M) at http://192.168.1.42:1234/v1/
2026-07-03 08:47:05,966 INFO agent.auxiliary_client: Auxiliary title_generation: transient transport error; retrying once on the same provider before fallback: Connection error.
2026-07-03 08:47:05,968 INFO agent.auxiliary_client: Auxiliary title_generation: connection error on custom (Connection error.), trying fallback
2026-07-03 08:47:05,970 WARNING agent.auxiliary_client: Auxiliary title_generation: connection error on custom and all fallbacks exhausted (fallback_chain + main agent model). Raising original error.
2026-07-03 08:47:05,970 WARNING agent.title_generator: Title generation failed: Connection error.
2026-07-03 08:47:39,851 INFO run_agent: OpenAI client closed (agent_close, shared=True, tcp_force_closed=0) thread=MainThread:137433645086528 provider=custom base_url=http://192.168.1.42:18080/v1 model=deepreinforce-ai/Ornith-1.0-35B-GGUF:Q4_K_M
2026-07-03 08:57:03,492 INFO hermes_cli.backup: State snapshot created: 20260703-065703-pre-update (9 files)
2026-07-03 08:57:07,401 INFO tools.lazy_deps: Lazy-installing google-auth==2.55.1 for feature 'provider.vertex'
2026-07-03 08:57:07,966 INFO tools.lazy_deps: Lazy install complete for feature 'provider.vertex'
2026-07-03 08:57:07,980 INFO tools.lazy_deps: Lazy-installing mautrix[encryption]==0.21.0 aiosqlite==0.22.1 asyncpg==0.31.0 aiohttp-socks==0.11.0 for feature 'platform.matrix'
2026-07-03 08:57:08,637 INFO tools.lazy_deps: Lazy install complete for feature 'platform.matrix'
2026-07-03 09:03:13,085 INFO hermes_cli.plugins: Plugin 'openrouter' registered image_gen provider: openrouter
2026-07-03 09:03:13,085 INFO hermes_cli.plugins: Plugin 'openrouter' registered image_gen provider: nous
2026-07-03 09:03:13,457 INFO hermes_cli.plugins: Plugin 'web-exa' registered web provider: exa
2026-07-03 09:03:13,479 INFO hermes_cli.plugins: Plugin 'web-tavily' registered web provider: tavily
2026-07-03 09:03:13,489 INFO hermes_plugins.get_serp_data: DataForSEO SERP plugin registered
2026-07-03 09:03:13,491 INFO hermes_plugins.research_serp: research_serp plugin registered
2026-07-03 09:03:13,494 INFO hermes_plugins.weather: Chaining-ready weather plugin registered
2026-07-03 09:03:13,528 INFO hermes_cli.plugins: Plugin 'web-pageprune' registered web provider: pageprune
2026-07-03 09:03:13,528 INFO hermes_cli.plugins: Plugin discovery complete: 55 found, 31 enabled
2026-07-03 09:03:18,748 INFO run_agent: Loaded environment variables from /home/dev/.hermes/.env
2026-07-03 09:03:18,748 INFO run_agent: Loaded environment variables from /home/dev/Python/HermesAgent/hermes-agent/.env
2026-07-03 09:03:19,508 INFO hermes_cli.plugins: Plugin 'openrouter' registered image_gen provider: openrouter
2026-07-03 09:03:19,508 INFO hermes_cli.plugins: Plugin 'openrouter' registered image_gen provider: nous
2026-07-03 09:03:19,741 INFO hermes_cli.plugins: Plugin 'web-exa' registered web provider: exa
2026-07-03 09:03:19,741 INFO hermes_cli.plugins: Plugin 'web-tavily' registered web provider: tavily
2026-07-03 09:03:19,745 INFO hermes_plugins.get_serp_data: DataForSEO SERP plugin registered
2026-07-03 09:03:19,746 INFO hermes_plugins.research_serp: research_serp plugin registered
2026-07-03 09:03:19,749 INFO hermes_plugins.weather: Chaining-ready weather plugin registered
2026-07-03 09:03:19,805 INFO hermes_cli.plugins: Plugin 'web-pageprune' registered web provider: pageprune
2026-07-03 09:03:19,805 INFO hermes_cli.plugins: Plugin discovery complete: 55 found, 31 enabled
2026-07-03 09:03:20,410 INFO run_agent: OpenAI client created (agent_init, shared=True) thread=Thread-5 (_build):136183920182976 provider=custom base_url=http://192.168.1.42:18080/v1 model=deepreinforce-ai/Ornith-1.0-35B-GGUF:Q4_K_M
2026-07-03 09:03:20,412 WARNING tools.registry: check_fn check_browser_requirements returned False; dependent tools will be unavailable this turn
2026-07-03 09:03:20,413 WARNING tools.registry: check_fn _browser_cdp_check returned False; dependent tools will be unavailable this turn
2026-07-03 09:03:20,414 WARNING tools.registry: check_fn _browser_dialog_check returned False; dependent tools will be unavailable this turn
2026-07-03 09:03:20,415 WARNING tools.registry: check_fn check_browser_vision_requirements returned False; dependent tools will be unavailable this turn
2026-07-03 09:03:20,415 WARNING tools.registry: check_fn check_close_terminal_requirements returned False; dependent tools will be unavailable this turn
2026-07-03 09:03:20,556 WARNING tools.registry: check_fn _check_kanban_mode returned False; dependent tools will be unavailable this turn
2026-07-03 09:03:20,558 WARNING tools.registry: check_fn _check_kanban_orchestrator_mode returned False; dependent tools will be unavailable this turn
2026-07-03 09:03:20,558 WARNING tools.registry: check_fn check_read_terminal_requirements returned False; dependent tools will be unavailable this turn
2026-07-03 09:03:20,694 INFO agent.auxiliary_client: Vision auto-detect: using main provider llama-cpp (deepreinforce-ai/Ornith-1.0-35B-GGUF:Q4_K_M)

--- errors.log (last 100 lines) ---
2026-07-03 08:44:25,739 WARNING tools.registry: check_fn check_browser_requirements returned False; dependent tools will be unavailable this turn
2026-07-03 08:44:25,740 WARNING tools.registry: check_fn _browser_cdp_check returned False; dependent tools will be unavailable this turn
2026-07-03 08:44:25,741 WARNING tools.registry: check_fn _browser_dialog_check returned False; dependent tools will be unavailable this turn
2026-07-03 08:44:25,743 WARNING tools.registry: check_fn check_browser_vision_requirements returned False; dependent tools will be unavailable this turn
2026-07-03 08:44:25,743 WARNING tools.registry: check_fn check_close_terminal_requirements returned False; dependent tools will be unavailable this turn
2026-07-03 08:44:25,780 WARNING tools.registry: check_fn _check_kanban_mode returned False; dependent tools will be unavailable this turn
2026-07-03 08:44:25,781 WARNING tools.registry: check_fn _check_kanban_orchestrator_mode returned False; dependent tools will be unavailable this turn
2026-07-03 08:44:25,781 WARNING tools.registry: check_fn check_read_terminal_requirements returned False; dependent tools will be unavailable this turn
2026-07-03 08:45:29,758 WARNING [20260703_084424_595704] agent.prompt_builder: ⚠️  Context file AGENTS.md TRUNCATED: 70678 chars exceeds limit of 62914 — trim the file, pin a larger context_file_max_chars, or use a larger-context model!
2026-07-03 08:47:05,970 WARNING agent.auxiliary_client: Auxiliary title_generation: connection error on custom and all fallbacks exhausted (fallback_chain + main agent model). Raising original error.
2026-07-03 08:47:05,970 WARNING agent.title_generator: Title generation failed: Connection error.
2026-07-03 09:03:20,412 WARNING tools.registry: check_fn check_browser_requirements returned False; dependent tools will be unavailable this turn
2026-07-03 09:03:20,413 WARNING tools.registry: check_fn _browser_cdp_check returned False; dependent tools will be unavailable this turn
2026-07-03 09:03:20,414 WARNING tools.registry: check_fn _browser_dialog_check returned False; dependent tools will be unavailable this turn
2026-07-03 09:03:20,415 WARNING tools.registry: check_fn check_browser_vision_requirements returned False; dependent tools will be unavailable this turn
2026-07-03 09:03:20,415 WARNING tools.registry: check_fn check_close_terminal_requirements returned False; dependent tools will be unavailable this turn
2026-07-03 09:03:20,556 WARNING tools.registry: check_fn _check_kanban_mode returned False; dependent tools will be unavailable this turn
2026-07-03 09:03:20,558 WARNING tools.registry: check_fn _check_kanban_orchestrator_mode returned False; dependent tools will be unavailable this turn
2026-07-03 09:03:20,558 WARNING tools.registry: check_fn check_read_terminal_requirements returned False; dependent tools will be unavailable this turn

--- gateway.log (last 100 lines) ---
(file not found)

--- gui.log (last 100 lines) ---
(file not found)

--- desktop.log (last 100 lines) ---
(file not found)



============================================================
FULL agent.log
============================================================

[hermes debug share: log content redacted at upload time. run with --no-redact to disable]
--- hermes dump ---
version:          0.18.0 [42bc07d1] (2026-07-03)
os:               Linux 6.8.0-134-generic x86_64
python:           3.11.14
openai_sdk:       2.24.0
profile:          default
hermes_home:      ~/.hermes
model:            deepreinforce-ai/Ornith-1.0-35B-GGUF:Q4_K_M
provider:         llama-cpp
terminal:         local

api_keys:
  openrouter           set
  openai               not set
  anthropic            not set
  anthropic_token      not set
  nous                 not set
  google/gemini        not set
  gemini               not set
  glm/zai              not set
  zai                  not set
  kimi                 not set
  minimax              not set
  deepseek             not set
  dashscope            not set
  huggingface          not set
  nvidia               set
  opencode_zen         not set
  opencode_go          not set
  kilocode             not set
  firecrawl            not set
  tavily               set
  browserbase          not set
  fal                  not set
  elevenlabs           not set
  github               not set

features:
  toolsets:           hermes-cli
  mcp_servers:        0
  memory_provider:    built-in
  gateway:            stopped (systemd (user))
  platforms:          none
  cron_jobs:          0
  skills:             102
--- end dump ---


--- full agent.log ---
2026-07-03 08:44:21,025 INFO hermes_cli.plugins: Plugin 'openrouter' registered image_gen provider: openrouter
2026-07-03 08:44:21,025 INFO hermes_cli.plugins: Plugin 'openrouter' registered image_gen provider: nous
2026-07-03 08:44:21,316 INFO hermes_cli.plugins: Plugin 'web-exa' registered web provider: exa
2026-07-03 08:44:21,316 INFO hermes_cli.plugins: Plugin 'web-tavily' registered web provider: tavily
2026-07-03 08:44:21,326 INFO hermes_plugins.get_serp_data: DataForSEO SERP plugin registered
2026-07-03 08:44:21,327 INFO hermes_plugins.research_serp: research_serp plugin registered
2026-07-03 08:44:21,330 INFO hermes_plugins.weather: Chaining-ready weather plugin registered
2026-07-03 08:44:21,384 INFO hermes_cli.plugins: Plugin 'web-pageprune' registered web provider: pageprune
2026-07-03 08:44:21,385 INFO hermes_cli.plugins: Plugin discovery complete: 55 found, 31 enabled
2026-07-03 08:44:24,544 INFO run_agent: Loaded environment variables from /home/dev/.hermes/.env
2026-07-03 08:44:24,545 INFO run_agent: Loaded environment variables from /home/dev/Python/HermesAgent/hermes-agent/.env
2026-07-03 08:44:25,027 INFO hermes_cli.plugins: Plugin 'openrouter' registered image_gen provider: openrouter
2026-07-03 08:44:25,027 INFO hermes_cli.plugins: Plugin 'openrouter' registered image_gen provider: nous
2026-07-03 08:44:25,258 INFO hermes_cli.plugins: Plugin 'web-exa' registered web provider: exa
2026-07-03 08:44:25,259 INFO hermes_cli.plugins: Plugin 'web-tavily' registered web provider: tavily
2026-07-03 08:44:25,262 INFO hermes_plugins.get_serp_data: DataForSEO SERP plugin registered
2026-07-03 08:44:25,264 INFO hermes_plugins.research_serp: research_serp plugin registered
2026-07-03 08:44:25,267 INFO hermes_plugins.weather: Chaining-ready weather plugin registered
2026-07-03 08:44:25,323 INFO hermes_cli.plugins: Plugin 'web-pageprune' registered web provider: pageprune
2026-07-03 08:44:25,323 INFO hermes_cli.plugins: Plugin discovery complete: 55 found, 31 enabled
2026-07-03 08:44:25,737 INFO run_agent: OpenAI client created (agent_init, shared=True) thread=Thread-5 (_build):137433500866240 provider=custom base_url=http://192.168.1.42:18080/v1 model=deepreinforce-ai/Ornith-1.0-35B-GGUF:Q4_K_M
2026-07-03 08:44:25,739 WARNING tools.registry: check_fn check_browser_requirements returned False; dependent tools will be unavailable this turn
2026-07-03 08:44:25,740 WARNING tools.registry: check_fn _browser_cdp_check returned False; dependent tools will be unavailable this turn
2026-07-03 08:44:25,741 WARNING tools.registry: check_fn _browser_dialog_check returned False; dependent tools will be unavailable this turn
2026-07-03 08:44:25,743 WARNING tools.registry: check_fn check_browser_vision_requirements returned False; dependent tools will be unavailable this turn
2026-07-03 08:44:25,743 WARNING tools.registry: check_fn check_close_terminal_requirements returned False; dependent tools will be unavailable this turn
2026-07-03 08:44:25,780 WARNING tools.registry: check_fn _check_kanban_mode returned False; dependent tools will be unavailable this turn
2026-07-03 08:44:25,781 WARNING tools.registry: check_fn _check_kanban_orchestrator_mode returned False; dependent tools will be unavailable this turn
2026-07-03 08:44:25,781 WARNING tools.registry: check_fn check_read_terminal_requirements returned False; dependent tools will be unavailable this turn
2026-07-03 08:44:25,878 INFO agent.auxiliary_client: Vision auto-detect: using main provider llama-cpp (deepreinforce-ai/Ornith-1.0-35B-GGUF:Q4_K_M)
2026-07-03 08:45:29,056 INFO [20260703_084424_595704] agent.turn_context: conversation turn: session=20260703_084424_595704 model=deepreinforce-ai/Ornith-1.0-35B-GGUF:Q4_K_M provider=custom platform=tui history=0 msg='donne le contenu de la page https://zonetuto.fr'
2026-07-03 08:45:29,758 WARNING [20260703_084424_595704] agent.prompt_builder: ⚠️  Context file AGENTS.md TRUNCATED: 70678 chars exceeds limit of 62914 — trim the file, pin a larger context_file_max_chars, or use a larger-context model!
2026-07-03 08:45:29,830 INFO [20260703_084424_595704] hermes_plugins.observability__langfuse: Langfuse tracing: started trace dd4ce308b314913fa2a397cc00b13b07 for task:20260703_084424_595704:turn:20260703_084424_595704:20260703_084424_595704:3834b4f1
2026-07-03 08:45:29,841 INFO run_agent: OpenAI client created (chat_completion_stream_request, shared=False) thread=Thread-14 (_call):137432477447872 provider=custom base_url=http://192.168.1.42:18080/v1 model=deepreinforce-ai/Ornith-1.0-35B-GGUF:Q4_K_M
2026-07-03 08:46:43,407 INFO run_agent: OpenAI client closed (stream_request_complete, shared=False, tcp_force_closed=0) thread=Thread-14 (_call):137432477447872 provider=custom base_url=http://192.168.1.42:18080/v1 model=deepreinforce-ai/Ornith-1.0-35B-GGUF:Q4_K_M
2026-07-03 08:46:43,408 INFO [20260703_084424_595704] agent.conversation_loop: API call #1: model=deepreinforce-ai/Ornith-1.0-35B-GGUF:Q4_K_M provider=custom in=32988 out=74 total=33062 latency=73.6s
2026-07-03 08:46:43,427 INFO [20260703_084424_595704] tools.web_tools: Extracting content from 1 URL(s)
2026-07-03 08:46:43,466 INFO [20260703_084424_595704] tools.web_tools: Web extract via tavily: 1 URL(s)
2026-07-03 08:46:43,466 INFO plugins.web.tavily.provider: Tavily extract: 1 URL(s)
2026-07-03 08:46:43,466 INFO plugins.web.tavily.provider: Tavily extract request to https://api.tavily.com/extract
2026-07-03 08:46:43,992 INFO [20260703_084424_595704] tools.web_tools: Extracted content from 1 pages
2026-07-03 08:46:43,994 INFO [20260703_084424_595704] tools.web_tools: https://zonetuto.fr (9524 chars, whole)
2026-07-03 08:46:43,995 INFO [20260703_084424_595704] agent.tool_executor: tool web_extract completed (0.57s, 9789 chars)
2026-07-03 08:46:44,015 INFO run_agent: OpenAI client created (chat_completion_stream_request, shared=False) thread=Thread-15 (_call):137432469055168 provider=custom base_url=http://192.168.1.42:18080/v1 model=deepreinforce-ai/Ornith-1.0-35B-GGUF:Q4_K_M
2026-07-03 08:47:05,803 INFO run_agent: OpenAI client closed (stream_request_complete, shared=False, tcp_force_closed=0) thread=Thread-15 (_call):137432469055168 provider=custom base_url=http://192.168.1.42:18080/v1 model=deepreinforce-ai/Ornith-1.0-35B-GGUF:Q4_K_M
2026-07-03 08:47:05,804 INFO [20260703_084424_595704] agent.conversation_loop: API call #2: model=deepreinforce-ai/Ornith-1.0-35B-GGUF:Q4_K_M provider=custom in=36033 out=1364 total=37397 latency=21.8s cache=32965/36033 (91%)
2026-07-03 08:47:05,944 INFO [20260703_084424_595704] agent.conversation_loop: Turn ended: reason=text_response(finish_reason=stop) model=deepreinforce-ai/Ornith-1.0-35B-GGUF:Q4_K_M api_calls=2/90 budget=2/90 tool_turns=1 last_msg_role=assistant response_len=3987 session=20260703_084424_595704
2026-07-03 08:47:05,964 INFO agent.auxiliary_client: Auxiliary title_generation: using custom (deepreinforce-ai/Ornith-1.0-35B-GGUF:Q4_K_M) at http://192.168.1.42:1234/v1/
2026-07-03 08:47:05,966 INFO agent.auxiliary_client: Auxiliary title_generation: transient transport error; retrying once on the same provider before fallback: Connection error.
2026-07-03 08:47:05,968 INFO agent.auxiliary_client: Auxiliary title_generation: connection error on custom (Connection error.), trying fallback
2026-07-03 08:47:05,970 WARNING agent.auxiliary_client: Auxiliary title_generation: connection error on custom and all fallbacks exhausted (fallback_chain + main agent model). Raising original error.
2026-07-03 08:47:05,970 WARNING agent.title_generator: Title generation failed: Connection error.
2026-07-03 08:47:39,851 INFO run_agent: OpenAI client closed (agent_close, shared=True, tcp_force_closed=0) thread=MainThread:137433645086528 provider=custom base_url=http://192.168.1.42:18080/v1 model=deepreinforce-ai/Ornith-1.0-35B-GGUF:Q4_K_M
2026-07-03 08:57:03,492 INFO hermes_cli.backup: State snapshot created: 20260703-065703-pre-update (9 files)
2026-07-03 08:57:07,401 INFO tools.lazy_deps: Lazy-installing google-auth==2.55.1 for feature 'provider.vertex'
2026-07-03 08:57:07,966 INFO tools.lazy_deps: Lazy install complete for feature 'provider.vertex'
2026-07-03 08:57:07,980 INFO tools.lazy_deps: Lazy-installing mautrix[encryption]==0.21.0 aiosqlite==0.22.1 asyncpg==0.31.0 aiohttp-socks==0.11.0 for feature 'platform.matrix'
2026-07-03 08:57:08,637 INFO tools.lazy_deps: Lazy install complete for feature 'platform.matrix'
2026-07-03 09:03:13,085 INFO hermes_cli.plugins: Plugin 'openrouter' registered image_gen provider: openrouter
2026-07-03 09:03:13,085 INFO hermes_cli.plugins: Plugin 'openrouter' registered image_gen provider: nous
2026-07-03 09:03:13,457 INFO hermes_cli.plugins: Plugin 'web-exa' registered web provider: exa
2026-07-03 09:03:13,479 INFO hermes_cli.plugins: Plugin 'web-tavily' registered web provider: tavily
2026-07-03 09:03:13,489 INFO hermes_plugins.get_serp_data: DataForSEO SERP plugin registered
2026-07-03 09:03:13,491 INFO hermes_plugins.research_serp: research_serp plugin registered
2026-07-03 09:03:13,494 INFO hermes_plugins.weather: Chaining-ready weather plugin registered
2026-07-03 09:03:13,528 INFO hermes_cli.plugins: Plugin 'web-pageprune' registered web provider: pageprune
2026-07-03 09:03:13,528 INFO hermes_cli.plugins: Plugin discovery complete: 55 found, 31 enabled
2026-07-03 09:03:18,748 INFO run_agent: Loaded environment variables from /home/dev/.hermes/.env
2026-07-03 09:03:18,748 INFO run_agent: Loaded environment variables from /home/dev/Python/HermesAgent/hermes-agent/.env
2026-07-03 09:03:19,508 INFO hermes_cli.plugins: Plugin 'openrouter' registered image_gen provider: openrouter
2026-07-03 09:03:19,508 INFO hermes_cli.plugins: Plugin 'openrouter' registered image_gen provider: nous
2026-07-03 09:03:19,741 INFO hermes_cli.plugins: Plugin 'web-exa' registered web provider: exa
2026-07-03 09:03:19,741 INFO hermes_cli.plugins: Plugin 'web-tavily' registered web provider: tavily
2026-07-03 09:03:19,745 INFO hermes_plugins.get_serp_data: DataForSEO SERP plugin registered
2026-07-03 09:03:19,746 INFO hermes_plugins.research_serp: research_serp plugin registered
2026-07-03 09:03:19,749 INFO hermes_plugins.weather: Chaining-ready weather plugin registered
2026-07-03 09:03:19,805 INFO hermes_cli.plugins: Plugin 'web-pageprune' registered web provider: pageprune
2026-07-03 09:03:19,805 INFO hermes_cli.plugins: Plugin discovery complete: 55 found, 31 enabled
2026-07-03 09:03:20,410 INFO run_agent: OpenAI client created (agent_init, shared=True) thread=Thread-5 (_build):136183920182976 provider=custom base_url=http://192.168.1.42:18080/v1 model=deepreinforce-ai/Ornith-1.0-35B-GGUF:Q4_K_M
2026-07-03 09:03:20,412 WARNING tools.registry: check_fn check_browser_requirements returned False; dependent tools will be unavailable this turn
2026-07-03 09:03:20,413 WARNING tools.registry: check_fn _browser_cdp_check returned False; dependent tools will be unavailable this turn
2026-07-03 09:03:20,414 WARNING tools.registry: check_fn _browser_dialog_check returned False; dependent tools will be unavailable this turn
2026-07-03 09:03:20,415 WARNING tools.registry: check_fn check_browser_vision_requirements returned False; dependent tools will be unavailable this turn
2026-07-03 09:03:20,415 WARNING tools.registry: check_fn check_close_terminal_requirements returned False; dependent tools will be unavailable this turn
2026-07-03 09:03:20,556 WARNING tools.registry: check_fn _check_kanban_mode returned False; dependent tools will be unavailable this turn
2026-07-03 09:03:20,558 WARNING tools.registry: check_fn _check_kanban_orchestrator_mode returned False; dependent tools will be unavailable this turn
2026-07-03 09:03:20,558 WARNING tools.registry: check_fn check_read_terminal_requirements returned False; dependent tools will be unavailable this turn
2026-07-03 09:03:20,694 INFO agent.auxiliary_client: Vision auto-detect: using main provider llama-cpp (deepreinforce-ai/Ornith-1.0-35B-GGUF:Q4_K_M)

Operating System

Ubuntu 24.04.4 LTS (kernel 6.8.0-134-generic, x86_64)

Python Version

3.11.14

Hermes Version

0.18.0

Additional Logs / Traceback (optional)

2026-07-03 08:44:21,384 INFO hermes_cli.plugins: Plugin 'web-pageprune' registered web provider: pageprune
2026-07-03 08:44:21,385 INFO hermes_cli.plugins: Plugin discovery complete: 55 found, 31 enabled
...
2026-07-03 08:46:43,427 INFO [20260703_084424_595704] tools.web_tools: Extracting content from 1 URL(s)
2026-07-03 08:46:43,466 INFO [20260703_084424_595704] tools.web_tools: Web extract via tavily: 1 URL(s)
2026-07-03 08:46:43,466 INFO plugins.web.tavily.provider: Tavily extract: 1 URL(s)
2026-07-03 08:46:43,466 INFO plugins.web.tavily.provider: Tavily extract request to https://api.tavily.com/extract
2026-07-03 08:46:43,995 INFO [20260703_084424_595704] agent.tool_executor: tool web_extract completed (0.57s, 9789 chars)

Root Cause Analysis (optional)

tools/web_tools.py still resolves the extract backend through a legacy helper chain that predates the plugin-based provider registry, and that chain uses a hardcoded backend allow-list that doesn't include plugin-provided names:

  • web_extract() calls backend = _get_extract_backend() at tools/web_tools.py:709
  • _get_extract_backend()_get_capability_backend("extract") → checks _is_backend_available(specific) at tools/web_tools.py:199-209
  • _is_backend_available() only recognizes a fixed set of names — exa, parallel, firecrawl, tavily, searxng, brave-free, ddgs, xai — and returns False for anything else, including pageprune (tools/web_tools.py:212-238)
  • Because "pageprune" fails that check, _get_capability_backend discards it and falls through to _get_backend() (tools/web_tools.py:139-171), which reads web.backend (empty here) and then auto-detects from env vars, landing on tavily because TAVILY_API_KEY is set.
  • Back in web_extract() (tools/web_tools.py:724), provider = _wsp_get_provider(backend) now looks up "tavily" (not "pageprune") in the registry, finds it, and uses it directly — the correct, plugin-aware fallback get_active_extract_provider() (agent/web_search_registry.py:232) is only reached if the registry lookup for backend fails, which doesn't happen here since tavily is a valid, registered provider.

Notably, agent/web_search_registry.py already implements the correct resolution logic and is plugin-aware: get_active_extract_provider() / _resolve() (agent/web_search_registry.py:133-219) explicitly documents "explicit config wins, ignoring availability" and works against the live _providers registry rather than a hardcoded list. The bug is that web_extract()/web_search() consult the old _get_extract_backend()/_get_search_backend() first and only fall back to the correct resolver as an afterthought.

The same bug affects web_search() via _get_search_backend() at tools/web_tools.py:571 for any plugin-registered search provider not in the hardcoded allow-list.

Proposed Fix (optional)

In web_search() and web_extract(), resolve the active provider directly via the registry (get_active_search_provider() / get_active_extract_provider()) instead of first computing a backend name through _get_search_backend() / _get_extract_backend() and looking it up by name. The registry resolver already implements the desired precedence (explicit per-capability config → shared web.backend → single eligible provider → legacy preference order) and is aware of plugin-registered providers, so this removes the need to keep a hardcoded backend allow-list in sync with every provider plugin that can be installed.

Are you willing to submit a PR for this?

  • I'd like to fix this myself and submit a PR

Metadata

Metadata

Assignees

No one assigned

    Labels

    P3Low — cosmetic, nice to havebugcomp/toolsTool registry, model_tools, toolsetsduplicateThis issue or pull request already existstool/webWeb search and extractiontype/bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions