Skip to content

feat: keyless web tier is now a 5-vendor free rotation (Exa/Parallel/Tavily/Firecrawl/Keenable) with ring failover + honest doctor readiness - #90572

Merged
teknium1 merged 24 commits into
mainfrom
feat/keyless-tavily-firecrawl-failover
Aug 20, 2026
Merged

feat: keyless web tier is now a 5-vendor free rotation (Exa/Parallel/Tavily/Firecrawl/Keenable) with ring failover + honest doctor readiness#90572
teknium1 merged 24 commits into
mainfrom
feat/keyless-tavily-firecrawl-failover

Conversation

@teknium1

Copy link
Copy Markdown
Contributor

Summary

Every keyless-capable web vendor now works keyless in Hermes, throttled keyless requests automatically fail over to the peer free tier, and hermes doctor reports the web tools' real readiness instead of a false green (#78412).

Salvages two contributor PRs onto current main with authorship preserved:

Changes

  • plugins/web/keyless_mcp.py: cross-vendor failover — a rate-limit-shaped error on Exa's/Parallel's keyless tier retries once on the peer's free endpoint (search + whole-batch extract; served_by marks the actual vendor; a peer pinned paid is never used; non-throttle errors never fail over)
  • plugins/web/tavily/*: keyless headers/keyed Bearer split, error bodies surfaced on HTTP ≥400, optional-key setup schema (salvage, adapted to current strict-selection main)
  • plugins/web/firecrawl/*: _KeylessFirecrawlClient (v2 search/scrape, no auth header) as a third client_mode inside the strict-selection resolver; keyless requires explicit selection
  • tools/web_tools.py: _provider_is_ready() (doctor/readiness gate) counts keyed OR keyless-capable as ready; check_web_api_key() routes through it
  • plugins/web/{tavily,firecrawl}/provider.py: is_keyless_available() — True only when explicitly selected, keeping both OUT of the automatic zero-config fallback (that stays Exa/Parallel 50/50)
  • hermes_cli/doctor.py: per-capability web rows + plugin-discovery kick (fresh doctor processes saw an empty registry and warned on everything)
  • hermes_cli/nous_subscription.py: selected-keyless Tavily counts as web-active
  • Docs: web-search.md + configuration.md (failover note, Tavily/Firecrawl keyless-when-selected)

Validation

Check Result
Live E2E: web.backend: tavily, no key search + 1.7KB extract OK, keyless headers
Live E2E: web.backend: firecrawl, no key search + 1.8KB extract OK via keyless cloud REST
Live E2E: simulated Exa throttle failover served by Parallel, served_by set
Doctor E2E (5 scenarios) searxng-no-URL warns (#78412 repro); zero-config, tavily-keyless, firecrawl-keyless ok; parallel-pinned-paid-no-key warns
Test suites (keyless 47, doctor, web config/providers/tavily) green (2 pre-existing lazy-install failures + 1 pre-existing doctor failure, all reproduced on clean origin/main)

Infographic

Keyless vendors + failover + doctor readiness

lakshyaag-tavily and others added 7 commits August 19, 2026 22:42
- Updated the Tavily API key description to clarify that it is optional and keyless access is supported.
- Modified the Tavily plugin and provider to handle requests with or without an API key, using Bearer authentication when the key is provided.
- Enhanced documentation to reflect the new keyless functionality and updated environment variable descriptions.
- Added tests to ensure correct behavior for both keyed and keyless requests.
- Added support for keyless Tavily integration in the onboarding flow, allowing it to be recognized as available without an API key.
…ic cloud API

Salvaged from #50659 by @LeonSGP43 onto current main (the client
resolver was rewritten for strict-selection semantics since the PR;
reapplied the keyless mode as a third client_mode inside the new
resolver). An explicit firecrawl selection with no FIRECRAWL_API_KEY /
FIRECRAWL_API_URL now routes through a minimal REST client (v2 search +
scrape, no Authorization header) instead of erroring. Unconfigured
installs never route here — the keyless path requires the explicit
selection. Fixes #49912.
- Cross-vendor failover: when Exa's or Parallel's keyless free tier
  returns a rate-limit-shaped error, the request retries once on the
  other vendor's free endpoint (search + whole-batch extract). Result
  notes served_by; a peer pinned to its paid tier is never used;
  non-throttle errors never fail over.
- Docs: failover note + Tavily/Firecrawl keyless-when-selected rows.
- Firecrawl keyless test expectations aligned with the keyless tier.
#78412)

Salvaged from #78434 by @Slobaka (also the issue reporter; earlier than
the competing #78436). hermes doctor no longer paints a green web check
when the explicitly selected provider cannot initialize — web splits
into per-capability rows (web search / web extract) resolved through
the same registry resolvers the dispatchers use, with readiness from a
true availability probe (_provider_is_ready).

Keyless-tier integration on top of the salvage:
- _provider_is_ready counts is_keyless_available() as ready — keyless
  mode is a working state, not a misconfiguration (zero-config installs
  and selected-keyless Tavily/Firecrawl show ok, not warn)
- Tavily/Firecrawl gain is_keyless_available() (True only when
  explicitly selected — they stay out of the zero-config fallback)
- doctor triggers plugin discovery before reading the registry (fresh
  doctor processes saw an empty registry and warned on everything)

E2E: searxng-selected-without-URL warns (the #78412 repro);
zero-config, tavily-keyless, firecrawl-keyless all read ok;
parallel pinned paid without a key warns.
@github-actions

github-actions Bot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

૮ >ﻌ< ა ci review

ran on e7e3885 — test: pin ring entry vendor in provider-routing tests (ring

⚠️ Warnings

OSV vulnerability scan · View job

7 known vulnerabilities found in pinned dependencies.

How to fix:

Review the findings in the Security tab. Update the affected dependencies if a patched version is available.


debug info

CI timings

CI timings · View report · View job

Wall time 6m58s vs 10m11s (-31.6%). 3 job(s) slower, 21 faster, 1 unchanged.

  • Python tests / Run tests slice 7/12: -161.0s
  • Python tests / Run tests slice 11/12: -50.0s
  • OS-specific tests / macOS-only tests: -49.0s
  • Python tests / e2e: -37.0s
  • Docs Site / docs-site-checks: -36.0s

@alt-glitch alt-glitch added type/feature New feature or request P3 Low — cosmetic, nice to have comp/plugins Plugin system and bundled plugins comp/cli CLI entry point, hermes_cli/, setup wizard tool/web Web search and extraction labels Aug 20, 2026
@alt-glitch

Copy link
Copy Markdown
Collaborator

This was generated by AI during triage.

Supersedes the related keyless/readiness attempts #88591, #50659, and #78434 with a combined maintainer salvage; #57151 remains a competing Firecrawl keyless approach.

@teknium1
teknium1 requested a review from a team August 20, 2026 06:40
…ly, Firecrawl, Keenable)

Fresh installs with zero web credentials now rotate web_search/
web_extract across FIVE vendors' public free tiers — Exa, Parallel,
Tavily, Firecrawl, Keenable — instead of a 2-vendor 50/50 split, with
next-in-line ring failover on rate limits (multi-hop until a vendor
serves or the ring is exhausted; served_by marks the actual vendor).

- plugins/web/keenable/: new bundled provider (search via /v1/search,
  fetch via /v1/fetch; keyed Bearer or keyless with the mandatory
  X-Keenable-Title app header). Credit: integration proposed by
  Ilya Gusev (Keenable) in #49758; Free/Paid picker rows included.
- keyless_mcp: tavily/firecrawl/keenable keyless search+extract
  wrappers, _KEYLESS_RING + per-process round-robin cursor (seeded by
  the random session id, advances per unpinned request), pinned-vendor
  entry (pin = start there; rotation off), paid-pinned vendors excluded
  from the ring entirely.
- Tavily/Firecrawl providers route keyless traffic through the ring;
  both are now default-on ring members (no longer selection-gated).
- web_tools/registry: keenable in backend sets, auto-detect, availability
  probes; _keyless_preference() delegates to the ring cursor.
- KEENABLE_API_KEY in OPTIONAL_ENV_VARS; docs updated (ring semantics).

Live E2E: all 10 vendorXcapability paths (5 search + 5 extract) served
real results keyless; rotation cycled all five vendors over 5 dispatch
calls; double-throttle failover walked exa->parallel->tavily.
@teknium1 teknium1 changed the title feat: Tavily + Firecrawl keyless tiers, keyless failover, honest doctor web readiness (salvages #88591, #50659, #78434) feat: keyless web tier is now a 5-vendor free rotation (Exa/Parallel/Tavily/Firecrawl/Keenable) with ring failover + honest doctor readiness Aug 20, 2026
@teknium1
teknium1 merged commit f796239 into main Aug 20, 2026
47 checks passed
@teknium1
teknium1 deleted the feat/keyless-tavily-firecrawl-failover branch August 20, 2026 08:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

comp/cli CLI entry point, hermes_cli/, setup wizard comp/plugins Plugin system and bundled plugins P3 Low — cosmetic, nice to have tool/web Web search and extraction type/feature New feature or request

Projects

None yet

5 participants