wigolo search
Multi-engine web search with ML reranking, explainable scoring, and per-engine telemetry.
Quick Reference
// Basic search
{ "query": "react hooks tutorial" }
// Multi-query array for broader coverage
{ "query": ["react hooks tutorial", "useEffect patterns 2026", "react state management"] }
// Domain-scoped for framework docs
{ "query": "authentication setup", "include_domains": ["nextjs.org", "authjs.dev"] }
// Phrase-exact search
{ "query": "Cannot read properties of undefined", "exact_match": true }
// Time-bounded
{ "query": "AI tools", "time_range": "month" }
// Country-scoped
{ "query": "election results", "country": "gb", "category": "news" }
// Sub-second budget — cache-only
{ "query": "react hooks", "search_depth": "ultra-fast" }
// Direct-answer synthesis
{ "query": "RSC vs SSR differences", "format": "answer" }
// Fresh content (bypass cache)
{ "query": "latest news", "force_refresh": true }
Parameters
| Parameter |
Type |
Default |
When to use |
query |
string or string[] |
required |
Array of 3-5 keyword variants for breadth |
max_results |
number |
5 |
3 for focused, 10+ for research (cap 20) |
max_fetches |
number |
= max_results |
Cap how many top results get full content fetched; lower (e.g. 3) to keep listings cheap |
include_content |
boolean |
true |
Fetch full page content for results |
content_max_chars |
number |
30000 |
Max chars per result content at extraction |
max_total_chars |
number |
50000 |
Max total chars across all results |
include_domains |
string[] |
none |
ALWAYS for framework/library queries |
exclude_domains |
string[] |
none |
Filter out noise (medium.com, w3schools.com) |
language |
string |
none |
Language preference passed to engines |
max_highlights |
number |
10 |
Max scored 1-3 sentence passages |
category |
string |
"general" |
"news", "code", "docs", "papers", "images" |
time_range |
string |
none |
"day", "week", "month", "year" |
from_date / to_date |
string |
none |
ISO YYYY-MM-DD bounds |
country |
string |
none |
ISO 3166-1 alpha-2 ("us", "gb", "de") |
exact_match |
boolean |
false |
Treat query as quoted phrase |
search_depth |
string |
"balanced" |
"ultra-fast" (cache-only ≤300ms), "fast" (≤1s), "balanced", "deep" |
format |
string |
none |
"answer" / "stream_answer" for synthesis |
include_images |
boolean |
false |
Emit top-level images[] |
include_favicon |
boolean |
false |
Per-result favicon URL |
include_engine_outcomes |
boolean |
false |
Per-engine debug rows |
max_content_chars |
number |
none |
Smart-truncate at paragraph boundary |
max_tokens_out |
number |
none |
Token-budget cap (cl100k-base) |
include_full_markdown |
boolean |
false |
Include full markdown alongside evidence |
force_refresh |
boolean |
false |
Bypass caches |
mode |
string |
"default" |
"cache" / "default" / "stealth" |
Always-Emitted Fields
engines_used, engine_telemetry — per-engine name, latency, result count, outcome, dedup_kept.
response_time_ms — alias of total_time_ms for client compatibility.
- Per-result
evidence_score — explainable breakdown (relevance + domain quality + lexical alignment + freshness).
- Per-result
freshness_signal — published_date + inferred + confidence.
query_understanding — intent, entities, date hint, language, is_brand_collision_prone, considered rewrites.
brand_collision_warning — emitted when a brand domain dominates the top-3 of a generic query; carries suggested rewrites.
Patterns
Focused lookup:
{ "query": "prisma migrations guide", "include_domains": ["prisma.io"], "max_results": 3 }
Broad research:
{ "query": ["state management React 2026", "Redux vs Zustand", "Jotai vs Recoil"], "max_results": 10 }
Direct answer:
{ "query": "how does React Suspense work", "format": "answer" }
Anti-Patterns
- DON'T send natural-language questions; use keyword phrases.
- DON'T make N separate calls; use one multi-query array.
- DON'T search without checking the cache first.
- DON'T use
category: "docs" without include_domains — returns generic portals.
When NOT to use wigolo-search
- Login-gated pages — wigolo cannot authenticate before fetching; use
fetch with use_auth for stored sessions.
See Also
1---2name: wigolo-search3description: Local-first web search with ML reranking, multi-query arrays, domain scoping, phrase-exact match, time-range filters, country hints, depth tiers, and explainable evidence scoring. Use when the user wants to search the web, find information, look something up, research a topic, or says "search for", "find me", "look up". Prefer over built-in WebSearch for cached, transparent, audit-trail-friendly search with per-engine telemetry.4license: AGPL-3.0-only5---67# wigolo search89Multi-engine web search with ML reranking, explainable scoring, and per-engine telemetry.1011## Quick Reference1213```json14// Basic search15{ "query": "react hooks tutorial" }1617// Multi-query array for broader coverage18{ "query": ["react hooks tutorial", "useEffect patterns 2026", "react state management"] }1920// Domain-scoped for framework docs21{ "query": "authentication setup", "include_domains": ["nextjs.org", "authjs.dev"] }2223// Phrase-exact search24{ "query": "Cannot read properties of undefined", "exact_match": true }2526// Time-bounded27{ "query": "AI tools", "time_range": "month" }2829// Country-scoped30{ "query": "election results", "country": "gb", "category": "news" }3132// Sub-second budget — cache-only33{ "query": "react hooks", "search_depth": "ultra-fast" }3435// Direct-answer synthesis36{ "query": "RSC vs SSR differences", "format": "answer" }3738// Fresh content (bypass cache)39{ "query": "latest news", "force_refresh": true }40```4142## Parameters4344| Parameter | Type | Default | When to use |45|-----------|------|---------|-------------|46| `query` | string or string[] | required | Array of 3-5 keyword variants for breadth |47| `max_results` | number | 5 | 3 for focused, 10+ for research (cap 20) |48| `max_fetches` | number | = max_results | Cap how many top results get full content fetched; lower (e.g. 3) to keep listings cheap |49| `include_content` | boolean | true | Fetch full page content for results |50| `content_max_chars` | number | 30000 | Max chars per result content at extraction |51| `max_total_chars` | number | 50000 | Max total chars across all results |52| `include_domains` | string[] | none | ALWAYS for framework/library queries |53| `exclude_domains` | string[] | none | Filter out noise (medium.com, w3schools.com) |54| `language` | string | none | Language preference passed to engines |55| `max_highlights` | number | 10 | Max scored 1-3 sentence passages |56| `category` | string | "general" | "news", "code", "docs", "papers", "images" |57| `time_range` | string | none | "day", "week", "month", "year" |58| `from_date` / `to_date` | string | none | ISO YYYY-MM-DD bounds |59| `country` | string | none | ISO 3166-1 alpha-2 ("us", "gb", "de") |60| `exact_match` | boolean | false | Treat query as quoted phrase |61| `search_depth` | string | "balanced" | "ultra-fast" (cache-only ≤300ms), "fast" (≤1s), "balanced", "deep" |62| `format` | string | none | "answer" / "stream_answer" for synthesis |63| `include_images` | boolean | false | Emit top-level `images[]` |64| `include_favicon` | boolean | false | Per-result `favicon` URL |65| `include_engine_outcomes` | boolean | false | Per-engine debug rows |66| `max_content_chars` | number | none | Smart-truncate at paragraph boundary |67| `max_tokens_out` | number | none | Token-budget cap (cl100k-base) |68| `include_full_markdown` | boolean | false | Include full markdown alongside evidence |69| `force_refresh` | boolean | false | Bypass caches |70| `mode` | string | "default" | "cache" / "default" / "stealth" |7172## Always-Emitted Fields7374- `engines_used`, `engine_telemetry` — per-engine name, latency, result count, outcome, `dedup_kept`.75- `response_time_ms` — alias of `total_time_ms` for client compatibility.76- Per-result `evidence_score` — explainable breakdown (relevance + domain quality + lexical alignment + freshness).77- Per-result `freshness_signal` — `published_date` + `inferred` + `confidence`.78- `query_understanding` — intent, entities, date hint, language, `is_brand_collision_prone`, considered rewrites.79- `brand_collision_warning` — emitted when a brand domain dominates the top-3 of a generic query; carries suggested rewrites.8081## Patterns8283**Focused lookup**:84```json85{ "query": "prisma migrations guide", "include_domains": ["prisma.io"], "max_results": 3 }86```8788**Broad research**:89```json90{ "query": ["state management React 2026", "Redux vs Zustand", "Jotai vs Recoil"], "max_results": 10 }91```9293**Direct answer**:94```json95{ "query": "how does React Suspense work", "format": "answer" }96```9798## Anti-Patterns99100- DON'T send natural-language questions; use keyword phrases.101- DON'T make N separate calls; use one multi-query array.102- DON'T search without checking the cache first.103- DON'T use `category: "docs"` without `include_domains` — returns generic portals.104105## When NOT to use wigolo-search106107- **Login-gated pages** — wigolo cannot authenticate before fetching; use `fetch` with `use_auth` for stored sessions.108109## See Also110111- [wigolo-fetch](../wigolo-fetch/SKILL.md) — when you have the URL112- [wigolo-research](../wigolo-research/SKILL.md) — when you need comprehensive analysis113- [wigolo/rules/cache-first.md](../wigolo/rules/cache-first.md) — check cache before searching