Compatibility
Verification
Tags
Web Search Plus Plugin
<p align="center"> <img src="docs/assets/web-search-plus-logo.png" alt="web search plus logo" width="180"> </p>Native OpenClaw source-only plugin for one clean set of web tools.
Current version: 4.0.3
It registers:
web_search_plus— Routing v2 intelligent multi-provider web search with research mode and canonical-source rerankingweb_extract_plus— Tavily-first URL extraction across supported providersweb_routing_config_plus— process-local routing preferences, valid until host restartweb_search_health_plus— read-only process-local provider health and shadow-quality observationsweb_extract_benchmark_plus— explicit bounded extraction-provider benchmark with a process-local recommendation
web_answer_plus is removed in v3.0.0. Use search plus extraction; fewer tools, less mush.
All five tools are registered as optional OpenClaw tools. Installing or enabling the plugin does not by itself make them callable. Add the exact tools you want to the host's existing tool profile with tools.alsoAllow:
{
"tools": {
"alsoAllow": [
"web_search_plus",
"web_extract_plus",
"web_routing_config_plus",
"web_search_health_plus",
"web_extract_benchmark_plus"
]
}
}
List only the tools the agent needs. tools.alsoAllow is additive; it does not replace profile-derived or existing tools. Use tools.allow only when you intentionally want a restrictive absolute allowlist, in which case it must include these exact names plus every other tool the agent requires. plugins.allow is a separate plugin-load gate: if it is present, include web-search-plus-plugin-v2 there as well.
Install
openclaw plugins install clawhub:web-search-plus-plugin-v2
ClawHub: https://clawhub.ai/plugins/web-search-plus-plugin-v2 Source: https://github.com/robbyczgw-cla/web-search-plus-plugin
Quick setup
You only need one provider configured to start. The recommended starter stack is:
- You.com for fast snippets / factual queries
- Serper for Google-style local, shopping, and community search
- Linkup for source-grounded search and citations
Onboarding CLI:
web-search-plus-setup status --config ./web-search-plus-plugin.config.json
web-search-plus-setup list providers
web-search-plus-setup list presets
web-search-plus-setup setup --preset starter --config ./web-search-plus-plugin.config.json
web-search-plus-setup config --config ./web-search-plus-plugin.config.json --set routingConfigPath=memory:default
Runtime credentials still come from explicit OpenClaw plugin config fields. The CLI writes a JSON helper file for setup/onboarding, not runtime secret discovery.
Provider coverage
Search providers
- Serper — Google-style web/news/shopping/local
- Brave — independent-index current web and multilingual search in the default auto pool
- Tavily — source-result search; generated-answer output is disabled
- Exa — source-only neural search for docs/API and arXiv sources with native freshness bounds; synthesis/deep modes are not exposed
- Querit — multilingual/current AI search; guarded in auto routing
- Linkup — citation/source-grounded search
- Firecrawl — search with scrape-friendly metadata and vendor/source pages
- Parallel — stable v1 source search and extraction;
fastmode by default and part of the normal auto pool when configured - SerpBase — Google-style alternate search; guarded in auto routing
- You.com — current web / RAG-style snippets
- SearXNG — self-hosted metasearch
- Keenable — independent web index; keyed or opt-in keyless public tier, lowest-priority fallback
- Octen via Monid — source-only search with freshness and domain filters; explicit-only by default
- TinyFish — source-only web/news search with freshness, locale, and domain filters; BYOK and explicit-only by default
- DonSeTch — separately installed local stdio MCP source search and Markdown extraction; explicit-only by default
Extraction providers
Auto fallback order:
- Tavily
- Exa
- Linkup
- Parallel
- Firecrawl
- You.com
- Keenable (keyed or opt-in keyless public tier)
- Serper (webpage scraper via
scrape.serper.dev, last resort) - DonSeTch (separately installed local provider; skipped automatically until deliberately auto-allowed)
Tavily is the default first call because it was the fastest reliable benchmark head; Firecrawl stays the robust scraper safety net. Extraction targets are validated against private/internal destinations by default (see extractAllowPrivateUrls). Calls process at most 10 URLs and return at most 60,000 aggregate Unicode codepoints by default; max_urls and max_context_chars may request lower limits, while extractMaxUrls and extractMaxContextChars set operator ceilings. The aggregate budget first selects a deterministic prefix; extractCharLimit then turns an oversized prefix into the documented head/tail window with a truncation marker. Inline base64 images are replaced with [IMAGE: alt] placeholders. Inline raw_content mirrors the final budgeted content; a distinct provider raw text is retained only behind full_content_ref. Call web_extract_plus with that reference plus content_start/content_end to read a content range (at most 60,000 Unicode codepoints). When distinct provider raw text exists, the reference read reports its availability and length; request it with its own raw_content_start/raw_content_end range. The reference is only valid while its process-local cache entry remains in the LRU; restart or eviction expires both ranges.
Set spans: true to add up to three deterministic, non-overlapping passages per successful result. spans_query conditions lexical ranking. A query-matching ATX Markdown heading can retain its query-free body and deeper subheadings through the next same-or-shallower heading; heading candidates are capped at two sections and 1,200 Unicode codepoints each. Span offsets address the complete cleaned NFC text in Unicode codepoints using half-open [start,end) ranges; within_preview reports whether the selected text survived inline truncation.
DonSeTch installation and OpenClaw host runner
DonSeTch is not bundled or redistributed by this plugin. It is an independent AGPL-3.0-only component and must be installed and reviewed separately. The adapter is tested with DonSeTch 3.2.1:
npm install -g donsetch@3.2.1
command -v donsetch
donsetch --version
donsetch doctor
Set donsetchBin to the absolute path printed by command -v donsetch. The plugin does not spawn through a shell or import its own process runner. It delegates the exact executable invocation to OpenClaw's trusted api.runtime.system.runCommandWithTimeout host runner, sends one bounded stdio MCP session per Web Search Plus request, and reuses that session for all URLs in a multi-URL extraction. The adapter isolates unrelated provider credentials, bounds time/output/content, sanitizes diagnostics, and treats browser or anti-bot success as host-dependent. Chromium/Chrome and display infrastructure may still be required by DonSeTch on Linux.
Installing DonSeTch does not put it into automatic traffic. Use it explicitly with provider: "donsetch"; after local verification, opt it in with web_routing_config_plus(action="set_auto_allow", provider="donsetch", enabled=true). Search queries and fetched URLs can still reach public engines and target sites even though the control-plane process is local.
TinyFish data-use warning
TinyFish's standard Terms permit Customer Data, including queries, to be used for analytics, model training, and fine-tuning. Explicit-only routing is a traffic-control default, not a privacy guarantee. Review the current Terms and Privacy Policy, and do not send sensitive data unless your own contract provides acceptable protections.
Configuration
web_search_health_plus is a read-only tool for the adaptive provider samples collected by the current host process. It reports its process start time and only in-process observations; it does not run an HTTP server or retain history after restart.
The same tool includes passive shadow-quality aggregates from completed successful search requests (result/domain counts, thin snippets, and degraded outcomes). They are observational only and never change routing or returned sources.
Use routing_override_provider on web_search_plus or web_extract_plus to force a configured provider for one call and disable automatic selection. The response's routing.override_provider makes that override explicit.
web_extract_benchmark_plus is the only way to benchmark extraction providers. It is never automatic, has a hard limit of one to three provider calls, bypasses the cache, and returns a process-local recommended priority. Explicit-only providers such as DonSeTch remain excluded unless their auto_allow gate is enabled.
Use explicit OpenClaw plugin config fields. The runtime uses only plugin config fields for credentials.
Search provider fields
serperApiKeybraveApiKeytavilyApiKeyexaApiKeyqueritApiKeylinkupApiKeyfirecrawlApiKeyparallelApiKeyserpbaseApiKeyyouApiKeysearxngInstanceUrlkeenableApiKeymonidApiKey— Octen access through MonidtinyfishApiKeydonsetchBin— absolute path to the separately installed DonSeTch executable
Extra fields
braveSafesearchsearxngAllowPrivateroutingConfigPath— optional namespace for in-memory routing preferenceskeenableAllowPublic— opt-in keyless Keenable public tier (unauthenticated shared service, off by default)parallelMode— Parallel stable v1 Search mode:turbo,fast(default),basic, oradvancedoctenTimeoutSeconds/tinyfishTimeoutSeconds— bounded hosted-provider request timeoutsdonsetchTimeoutSeconds/donsetchMaxContentChars/donsetchTier— bounded host-runner timeout, extraction content, and browser tier (auto,1, or2)extractAllowPrivateUrls— opt-in: allow extraction of private/internal URLs (trusted intranets only)extractCharLimit— per-result inline character budget applied after aggregate prefix allocation and before head/tail truncation (default 15000)extractMaxUrls— operator ceiling for URLs processed per extraction call (default 10, hard maximum 50)extractMaxContextChars— operator ceiling for aggregate inline extraction content (default 60000 Unicode codepoints, maximum 200000)extractCacheMaxEntries— process-local LRU capacity for completed extraction requests (default 64, range 1–500; lost on host restart)extractCacheMaxChars— process-local full-text cache budget in Unicode codepoints (default 4,000,000, range 1–20,000,000); an oversized response is returned normally but has nofull_content_refextractDeadlineSeconds— request-scoped provider-start deadline ceiling (default 30 seconds, range 1–180); no daily quota is kept because that would require a persistent ledgerlocaleCountry/localeLanguage— default search locale for Serper, Brave, Querit, Firecrawl, You.com, and SearXNG;localeLanguage: "auto"enables conservative query language inference. Explicit location hints in the query win the country; query language never implies the country. Without these fields the providers keep their us/en defaults.parallelMaxCharsPerResult/parallelMaxCharsTotal— Parallel extraction full-content budgets (defaults 60000 / 120000)qualityBlockedDomains/qualityAllowedDomains— extend or rescue from the built-in spam/mirror result blocklist
Example:
{
"plugins": {
"entries": {
"web-search-plus-plugin-v2": {
"config": {
"youApiKey": "...",
"serperApiKey": "...",
"linkupApiKey": "..."
}
}
}
}
}
Routing v2
web_search_plus(provider="auto") uses class-aware benchmarked routing. Diagnostics expose language_hint, routing_class, and routing_policy on every response.
Classes:
- multilingual/current → Querit/Brave when allowed
- local/shopping → Serper
- docs/api → Exa/Firecrawl
- academic/arxiv → Exa
- community/reddit → Serper/Brave
- security/cve → Firecrawl for vendor/source pages
- official/vendor-release → You.com/Linkup for vendor announcements (Anthropic, OpenAI, Mistral, …)
- official/regulatory → Linkup
- finance/IR → Linkup/Tavily
- weather/factual → You.com snippet-first
- oss-discovery → Exa neural source discovery
Default search priority is You.com, Serper, Exa, Firecrawl, Tavily, Linkup, Brave, Parallel, SerpBase, Querit, SearXNG, then Keenable. Configured Parallel and Brave are in the normal automatic pool; operators can still opt either out with auto_allow=false.
Guarded providers require auto_allow=true for automatic traffic: SerpBase, Querit, DonSeTch, Octen, and TinyFish. Explicit calls remain available when the provider is configured and enabled. This gate is operational policy, not a privacy or contractual guarantee.
Search provider_priority and extraction extract_provider_priority are independent. Partial extraction lists are completed in the public Tavily-first order, and can be updated with web_routing_config_plus(action="set_extract_provider_priority", providers=[...]).
web_routing_config_plus(action="set_profile", profile="self_hosted") derives a local-first routing view: SearXNG then Keenable for search, and Keenable first for extraction. Other providers are excluded from automatic selection and fallback but remain available when explicitly requested. Auto mode fails with a clear readiness error until searxngInstanceUrl, keenableApiKey, or the opted-in Keenable public tier is configured. Return to the normal pool with profile="standard". The setup CLI also exposes --preset self-hosted.
Pass quality_report: true to receive routing scores, result-quality hints, fallback-chain diagnostics, authority_signals (canonical domain hits, demoted domain hits, and whether the top result is a primary source), and a deterministic diversity score. The score combines registrable-domain coverage, canonical-URL uniqueness, snippet-trigram diversity, and provider mix. Set qualityDiversityRerank: true to move near-duplicate Research candidates behind the diverse head without removing results.
Auto routing additionally learns from recent provider behavior: every call records latency, result volume, and errors into an in-memory rolling window, and routing scores get a bounded (±1.0) adjustment (routing.adaptive_adjustments) once enough fresh samples exist — enough to break ties, never enough to override a clear query-class winner.
Result hygiene
Results from known SEO mirror/scraper domains (Stack Overflow clones, GitHub issue mirrors, documentation mirrors) are removed, and a single domain is capped at two head slots via a stable diversity rerank (overflow is demoted, not dropped). Explicit site: queries and include_domains bypass both. Removals and demotions are reported in metadata.result_filter.
Freshness, news vertical, and locale
freshness: day|week|month|yearmaps to each provider's native recency filter; providers without one run normally and reportfreshness.applied=falsein metadata. Exa translates the unified value into absolute UTCstartPublishedDate/endPublishedDatebounds for/searchand reports the effective range.search_type: newsuses Serper's native/newsendpoint (with date, source, thumbnail, and position metadata); other providers reportsearch_type.applied=false.localeCountry/localeLanguageset default region and language for the locale-capable providers, with query-aware language inference whenlocaleLanguage: "auto". The resolved locale and its per-value source are reported inmetadata.locale.
Canonical-source reranking
For routing classes where source authority beats snippet luck (official/vendor-release, docs/api, official/regulatory, finance/IR, security/cve), auto-routed results are reranked so primary sources (vendor blogs, official docs, regulators, IR pages, NVD/CVE records) outrank mirrors like YouTube, Medium, or Reddit. When the order changes, metadata.intent_rerank reports the routing class and the top domain before/after.
Research mode
web_search_plus(mode="research") runs a compact multi-provider sweep for grounding-heavy questions:
- Picks up to 3 configured, auto-allowed providers (primary route first, then Linkup/Tavily/Exa/Firecrawl/… by preference), or uses an explicit
research_providerslist. - Queries them concurrently and harvests completions as they arrive, so a blocked earlier submission cannot hide a later useful provider. Final results, attempts, and diagnostics are restored to deterministic submission order.
- Deduplicates canonical URLs without discarding contributing observations. Cross-provider clusters retain deterministic observation ids and attributed snippet fragments, plus transparent
source_typeandfetch_priorityhints. - Extracts the top
research_extract_countURLs (default 3, max 5) viaweb_extract_plusauto fallback intosource_summaries.
Research mode is best-effort: each launched/skipped provider is recorded in routing.provider_attempts; provider or extraction failures produce diagnostics in routing.provider_errors / routing.extraction_error. Partial evidence returns status="degraded", while total fan-out failure returns a complete status="failed" envelope. A research_time_budget (seconds, default 55) gates launches, cancels the response wait for started overruns, and gates extraction. Quality reports are attached once after the merge. Optional qualityDiversityRerank moves later URL/content duplicate candidates behind the diverse result head before source extraction.
The 3.3 quality quorum is enabled by default. Once at least two providers have contributed the unique-result target (min(count, 5)) across the unique-domain target (min(result_target, 3)), still-pending work may be preempted. Such providers remain visible as preempted_after_quorum; this optimization does not degrade an otherwise successful response. metadata.research_quorum reports the thresholds, contributors, unique result/domain counts, and whether the quorum triggered.
{
"query": "What changed in the EU AI Act enforcement timeline?",
"mode": "research",
"research_extract_count": 3,
"research_time_budget": 55
}
Routing preferences
web_routing_config_plus manages runtime routing behavior in memory, separate from provider secrets. ClawHub scanner constraints intentionally avoid runtime filesystem reads in this package.
Supported actions:
showset_default_providerset_auto_routingset_auto_allowset_provider_priorityset_extract_provider_priorityset_profileset_fallback_providerdisable_providerenable_providerset_confidence_thresholdreset
Behavior notes:
- if
auto_routing=false,provider:autobecomes strictdefault_provider - explicit provider requests stay strict and do not silently fall back
- normal auto mode can still use priority order, fallback provider, cooldowns, and retries
- invalid plugin-provided routing config falls back to defaults with a warning
- reset restores in-memory defaults for the selected namespace
Verification
Recommended checks:
npm test -- --test-reporter=spec
npm run build
npm pack --dry-run
Contributing
See CONTRIBUTING.md for the upstream-first porting model, OpenClaw runtime boundaries, provider requirements, security/privacy rules, package synchronization, and pull-request expectations.
Acknowledgments
This OpenClaw plugin tracks the useful feature direction from the Hermes and MCP sister projects, adapted for OpenClaw/ClawHub instead of copied blindly.
