[{"data":1,"prerenderedAt":1131},["ShallowReactive",2],{"navigation_docs":3,"-guide-fanout":96,"-guide-fanout-surround":1126},[4,44],{"title":5,"path":6,"stem":7,"children":8,"icon":43},"Guide","\u002Fguide","1.guide\u002F1.index",[9,11,15,19,23,27,31,35,39],{"title":10,"path":6,"stem":7},"Getting Started",{"title":12,"path":13,"stem":14},"Searching","\u002Fguide\u002Fsearch","1.guide\u002F2.search",{"title":16,"path":17,"stem":18},"Fan-out","\u002Fguide\u002Ffanout","1.guide\u002F3.fanout",{"title":20,"path":21,"stem":22},"Reading","\u002Fguide\u002Fread","1.guide\u002F4.read",{"title":24,"path":25,"stem":26},"Reverse Image Search","\u002Fguide\u002Fimage","1.guide\u002F5.image",{"title":28,"path":29,"stem":30},"CLI","\u002Fguide\u002Fcli","1.guide\u002F6.cli",{"title":32,"path":33,"stem":34},"Agents","\u002Fguide\u002Fagents","1.guide\u002F7.agents",{"title":36,"path":37,"stem":38},"Custom Providers","\u002Fguide\u002Fcustom","1.guide\u002F8.custom",{"title":40,"path":41,"stem":42},"Explorer","\u002Fguide\u002Fexplorer","1.guide\u002F9.explorer","i-lucide-book-open",{"title":45,"path":46,"stem":47,"children":48,"icon":95},"Providers","\u002Fproviders","2.providers\u002F0.index",[49,51,55,59,63,67,71,75,79,83,87,91],{"title":50,"path":46,"stem":47},"Overview",{"title":52,"path":53,"stem":54},"Brave","\u002Fproviders\u002Fbrave","2.providers\u002F01.brave",{"title":56,"path":57,"stem":58},"Context.dev","\u002Fproviders\u002Fcontext","2.providers\u002F02.context",{"title":60,"path":61,"stem":62},"Exa","\u002Fproviders\u002Fexa","2.providers\u002F03.exa",{"title":64,"path":65,"stem":66},"Firecrawl","\u002Fproviders\u002Ffirecrawl","2.providers\u002F04.firecrawl",{"title":68,"path":69,"stem":70},"Jina","\u002Fproviders\u002Fjina","2.providers\u002F05.jina",{"title":72,"path":73,"stem":74},"Mojeek","\u002Fproviders\u002Fmojeek","2.providers\u002F06.mojeek",{"title":76,"path":77,"stem":78},"SearXNG","\u002Fproviders\u002Fsearxng","2.providers\u002F07.searxng",{"title":80,"path":81,"stem":82},"SerpAPI","\u002Fproviders\u002Fserpapi","2.providers\u002F08.serpapi",{"title":84,"path":85,"stem":86},"SerpBase","\u002Fproviders\u002Fserpbase","2.providers\u002F09.serpbase",{"title":88,"path":89,"stem":90},"Tavily","\u002Fproviders\u002Ftavily","2.providers\u002F10.tavily",{"title":92,"path":93,"stem":94},"TinyFish","\u002Fproviders\u002Ftinyfish","2.providers\u002F11.tinyfish","i-lucide-library",{"id":97,"title":16,"body":98,"description":1119,"extension":1120,"links":1121,"meta":1122,"navigation":159,"path":17,"seo":1124,"stem":18,"__hash__":1125},"docs\u002F1.guide\u002F3.fanout.md",{"type":99,"value":100,"toc":1112},"minimark",[101,106,312,331,408,422,425,494,498,652,678,682,685,793,808,811,815,932,958,962,1083,1108],[102,103,105],"h2",{"id":104},"ask-them-all","Ask them all",[107,108,113],"pre",{"className":109,"code":110,"language":111,"meta":112,"style":112},"language-ts shiki shiki-themes github-light github-light poimandres","import { searchAll } from \"@agntn\u002Fweb\";\n\n\u002F\u002F Detects providers from env vars, queries them in parallel\nconst results = await searchAll(\"latest node.js release\");\n\nfor (const result of results) {\n  console.log(`[${result.providers.join(\", \")}]`, result.title, result.url);\n}\n","ts","",[114,115,116,154,161,168,202,207,230,306],"code",{"__ignoreMap":112},[117,118,121,125,129,133,136,140,144,148,151],"span",{"class":119,"line":120},"line",1,[117,122,124],{"class":123},"sP0CR","import",[117,126,128],{"class":127},"sKlNE"," {",[117,130,132],{"class":131},"snHMy"," searchAll",[117,134,135],{"class":127}," }",[117,137,139],{"class":138},"stCPd"," from",[117,141,143],{"class":142},"scVjq"," \"",[117,145,147],{"class":146},"sQ7BG","@agntn\u002Fweb",[117,149,150],{"class":142},"\"",[117,152,153],{"class":127},";\n",[117,155,157],{"class":119,"line":156},2,[117,158,160],{"emptyLinePlaceholder":159},true,"\n",[117,162,164],{"class":119,"line":163},3,[117,165,167],{"class":166},"sjhu3","\u002F\u002F Detects providers from env vars, queries them in parallel\n",[117,169,171,175,179,182,186,189,192,194,197,199],{"class":119,"line":170},4,[117,172,174],{"class":173},"s1TYA","const",[117,176,178],{"class":177},"saoiD"," results",[117,180,181],{"class":173}," =",[117,183,185],{"class":184},"sZW6a"," await",[117,187,132],{"class":188},"sULi6",[117,190,191],{"class":127},"(",[117,193,150],{"class":142},[117,195,196],{"class":146},"latest node.js release",[117,198,150],{"class":142},[117,200,201],{"class":127},");\n",[117,203,205],{"class":119,"line":204},5,[117,206,160],{"emptyLinePlaceholder":159},[117,208,210,213,216,218,221,224,227],{"class":119,"line":209},6,[117,211,212],{"class":138},"for",[117,214,215],{"class":127}," (",[117,217,174],{"class":173},[117,219,220],{"class":177}," result",[117,222,223],{"class":173}," of",[117,225,178],{"class":226},"spVlQ",[117,228,229],{"class":127},") {\n",[117,231,233,236,239,242,244,247,250,253,256,258,261,263,266,268,270,273,275,278,281,284,286,288,290,292,295,297,299,301,304],{"class":119,"line":232},7,[117,234,235],{"class":226},"  console",[117,237,238],{"class":127},".",[117,240,241],{"class":188},"log",[117,243,191],{"class":127},[117,245,246],{"class":142},"`",[117,248,249],{"class":146},"[",[117,251,252],{"class":142},"${",[117,254,255],{"class":226},"result",[117,257,238],{"class":142},[117,259,260],{"class":226},"providers",[117,262,238],{"class":142},[117,264,265],{"class":188},"join",[117,267,191],{"class":142},[117,269,150],{"class":142},[117,271,272],{"class":146},", ",[117,274,150],{"class":142},[117,276,277],{"class":142},")",[117,279,280],{"class":142},"}",[117,282,283],{"class":146},"]",[117,285,246],{"class":142},[117,287,272],{"class":127},[117,289,255],{"class":226},[117,291,238],{"class":127},[117,293,294],{"class":226},"title",[117,296,272],{"class":127},[117,298,255],{"class":226},[117,300,238],{"class":127},[117,302,303],{"class":226},"url",[117,305,201],{"class":127},[117,307,309],{"class":119,"line":308},8,[117,310,311],{"class":127},"}\n",[313,314,315,318,319,322,323,326,327,330],"p",{},[114,316,317],{},"searchAll"," runs every configured search provider through ",[114,320,321],{},"Promise.allSettled",", so one engine failing does not empty the list. Results are deduplicated by normalized URL (fragment removed, trailing slashes trimmed, ",[114,324,325],{},"utm_*"," junk dropped, the rest sorted) and capped by ",[114,328,329],{},"maxResults",", ten by default.",[107,332,334],{"className":109,"code":333,"language":111,"meta":112,"style":112},"interface SearchAllResult extends SearchResult {\n  provider: string; \u002F\u002F the representative record's provider\n  providers: string[]; \u002F\u002F every provider that returned this URL, in requested order\n  evidence: SearchAllEvidence[]; \u002F\u002F each provider's complete record, scores untouched\n}\n",[114,335,336,355,374,389,404],{"__ignoreMap":112},[117,337,338,341,345,348,352],{"class":119,"line":120},[117,339,340],{"class":173},"interface",[117,342,344],{"class":343},"sCrqT"," SearchAllResult",[117,346,347],{"class":123}," extends",[117,349,351],{"class":350},"scZRh"," SearchResult",[117,353,354],{"class":127}," {\n",[117,356,357,361,364,368,371],{"class":119,"line":156},[117,358,360],{"class":359},"s0VbO","  provider",[117,362,363],{"class":173},":",[117,365,367],{"class":366},"s8yaW"," string",[117,369,370],{"class":127},"; ",[117,372,373],{"class":166},"\u002F\u002F the representative record's provider\n",[117,375,376,379,381,383,386],{"class":119,"line":163},[117,377,378],{"class":359},"  providers",[117,380,363],{"class":173},[117,382,367],{"class":366},[117,384,385],{"class":127},"[]; ",[117,387,388],{"class":166},"\u002F\u002F every provider that returned this URL, in requested order\n",[117,390,391,394,396,399,401],{"class":119,"line":170},[117,392,393],{"class":359},"  evidence",[117,395,363],{"class":173},[117,397,398],{"class":343}," SearchAllEvidence",[117,400,385],{"class":127},[117,402,403],{"class":166},"\u002F\u002F each provider's complete record, scores untouched\n",[117,405,406],{"class":119,"line":204},[117,407,311],{"class":127},[313,409,410,411,413,414,417,418,421],{},"The first provider in requested order gives the representative ",[114,412,294],{}," and ",[114,415,416],{},"snippet",". ",[114,419,420],{},"evidence"," keeps every record, so you can compare what Brave and Exa said about the same page. What the library does not do is merge their scores. A Brave score and an Exa score are not on the same scale and pretending otherwise would be dumb.",[313,423,424],{},"Pick the providers yourself when env has more keys than you want to spend:",[107,426,428],{"className":109,"code":427,"language":111,"meta":112,"style":112},"const results = await searchAll(\"query\", { providers: [\"exa\", \"brave\"], maxResults: 5 });\n",[114,429,430],{"__ignoreMap":112},[117,431,432,434,436,438,440,442,444,446,449,451,454,457,459,462,464,467,469,472,474,477,479,482,485,487,491],{"class":119,"line":120},[117,433,174],{"class":173},[117,435,178],{"class":177},[117,437,181],{"class":173},[117,439,185],{"class":184},[117,441,132],{"class":188},[117,443,191],{"class":127},[117,445,150],{"class":142},[117,447,448],{"class":146},"query",[117,450,150],{"class":142},[117,452,453],{"class":127},", {",[117,455,456],{"class":131}," providers",[117,458,363],{"class":127},[117,460,461],{"class":127}," [",[117,463,150],{"class":142},[117,465,466],{"class":146},"exa",[117,468,150],{"class":142},[117,470,471],{"class":127},",",[117,473,143],{"class":142},[117,475,476],{"class":146},"brave",[117,478,150],{"class":142},[117,480,481],{"class":127},"],",[117,483,484],{"class":131}," maxResults",[117,486,363],{"class":127},[117,488,490],{"class":489},"siHFe"," 5",[117,492,493],{"class":127}," });\n",[102,495,497],{"id":496},"the-detailed-answer","The detailed answer",[107,499,501],{"className":109,"code":500,"language":111,"meta":112,"style":112},"import { searchAllDetailed } from \"@agntn\u002Fweb\";\n\nconst answer = await searchAllDetailed(\"query\", { concurrency: 3 });\n\nanswer.results; \u002F\u002F SearchAllResult[]\nanswer.successfulProviders; \u002F\u002F every provider that answered, even with nothing left after deduplication\nanswer.errors; \u002F\u002F [{ provider, error }] for the ones that failed\nanswer.filterReports; \u002F\u002F ignored and undeclared filters, per provider\nanswer.providerPagination; \u002F\u002F [{ provider, pagination }], one independent state per provider\nanswer.providerMetadata; \u002F\u002F [{ provider, metadata }] when a provider returned response metadata\n",[114,502,503,524,528,561,565,580,594,608,622,637],{"__ignoreMap":112},[117,504,505,507,509,512,514,516,518,520,522],{"class":119,"line":120},[117,506,124],{"class":123},[117,508,128],{"class":127},[117,510,511],{"class":131}," searchAllDetailed",[117,513,135],{"class":127},[117,515,139],{"class":138},[117,517,143],{"class":142},[117,519,147],{"class":146},[117,521,150],{"class":142},[117,523,153],{"class":127},[117,525,526],{"class":119,"line":156},[117,527,160],{"emptyLinePlaceholder":159},[117,529,530,532,535,537,539,541,543,545,547,549,551,554,556,559],{"class":119,"line":163},[117,531,174],{"class":173},[117,533,534],{"class":177}," answer",[117,536,181],{"class":173},[117,538,185],{"class":184},[117,540,511],{"class":188},[117,542,191],{"class":127},[117,544,150],{"class":142},[117,546,448],{"class":146},[117,548,150],{"class":142},[117,550,453],{"class":127},[117,552,553],{"class":131}," concurrency",[117,555,363],{"class":127},[117,557,558],{"class":489}," 3",[117,560,493],{"class":127},[117,562,563],{"class":119,"line":170},[117,564,160],{"emptyLinePlaceholder":159},[117,566,567,570,572,575,577],{"class":119,"line":204},[117,568,569],{"class":226},"answer",[117,571,238],{"class":127},[117,573,574],{"class":226},"results",[117,576,370],{"class":127},[117,578,579],{"class":166},"\u002F\u002F SearchAllResult[]\n",[117,581,582,584,586,589,591],{"class":119,"line":209},[117,583,569],{"class":226},[117,585,238],{"class":127},[117,587,588],{"class":226},"successfulProviders",[117,590,370],{"class":127},[117,592,593],{"class":166},"\u002F\u002F every provider that answered, even with nothing left after deduplication\n",[117,595,596,598,600,603,605],{"class":119,"line":232},[117,597,569],{"class":226},[117,599,238],{"class":127},[117,601,602],{"class":226},"errors",[117,604,370],{"class":127},[117,606,607],{"class":166},"\u002F\u002F [{ provider, error }] for the ones that failed\n",[117,609,610,612,614,617,619],{"class":119,"line":308},[117,611,569],{"class":226},[117,613,238],{"class":127},[117,615,616],{"class":226},"filterReports",[117,618,370],{"class":127},[117,620,621],{"class":166},"\u002F\u002F ignored and undeclared filters, per provider\n",[117,623,625,627,629,632,634],{"class":119,"line":624},9,[117,626,569],{"class":226},[117,628,238],{"class":127},[117,630,631],{"class":226},"providerPagination",[117,633,370],{"class":127},[117,635,636],{"class":166},"\u002F\u002F [{ provider, pagination }], one independent state per provider\n",[117,638,640,642,644,647,649],{"class":119,"line":639},10,[117,641,569],{"class":226},[117,643,238],{"class":127},[117,645,646],{"class":226},"providerMetadata",[117,648,370],{"class":127},[117,650,651],{"class":166},"\u002F\u002F [{ provider, metadata }] when a provider returned response metadata\n",[313,653,654,655,658,659,662,663,665,666,669,670,673,674,677],{},"Fan-out has no single cursor, and it cannot have one. Take a ",[114,656,657],{},"next"," or ",[114,660,661],{},"unknown"," token from ",[114,664,631],{}," and continue it with ",[114,667,668],{},"searchProviderDetailed"," and that provider. ",[114,671,672],{},"searchAllDetailed"," rejects a ",[114,675,676],{},"continuation"," of its own.",[102,679,681],{"id":680},"one-query-automatic-fallback","One query, automatic fallback",[313,683,684],{},"When you want one answer and do not care which engine gives it:",[107,686,688],{"className":109,"code":687,"language":111,"meta":112,"style":112},"import { searchWithFallback } from \"@agntn\u002Fweb\";\n\nconst answer = await searchWithFallback(\"typescript runtimes\", { maxResults: 10 });\n\nanswer.provider; \u002F\u002F the provider that answered\nanswer.attempts; \u002F\u002F [\"exa\", \"brave\"], everything tried, in order\nanswer.failures; \u002F\u002F [{ provider: \"exa\", error: \"HTTP 402: …\" }]\n",[114,689,690,711,715,747,751,765,779],{"__ignoreMap":112},[117,691,692,694,696,699,701,703,705,707,709],{"class":119,"line":120},[117,693,124],{"class":123},[117,695,128],{"class":127},[117,697,698],{"class":131}," searchWithFallback",[117,700,135],{"class":127},[117,702,139],{"class":138},[117,704,143],{"class":142},[117,706,147],{"class":146},[117,708,150],{"class":142},[117,710,153],{"class":127},[117,712,713],{"class":119,"line":156},[117,714,160],{"emptyLinePlaceholder":159},[117,716,717,719,721,723,725,727,729,731,734,736,738,740,742,745],{"class":119,"line":163},[117,718,174],{"class":173},[117,720,534],{"class":177},[117,722,181],{"class":173},[117,724,185],{"class":184},[117,726,698],{"class":188},[117,728,191],{"class":127},[117,730,150],{"class":142},[117,732,733],{"class":146},"typescript runtimes",[117,735,150],{"class":142},[117,737,453],{"class":127},[117,739,484],{"class":131},[117,741,363],{"class":127},[117,743,744],{"class":489}," 10",[117,746,493],{"class":127},[117,748,749],{"class":119,"line":170},[117,750,160],{"emptyLinePlaceholder":159},[117,752,753,755,757,760,762],{"class":119,"line":204},[117,754,569],{"class":226},[117,756,238],{"class":127},[117,758,759],{"class":226},"provider",[117,761,370],{"class":127},[117,763,764],{"class":166},"\u002F\u002F the provider that answered\n",[117,766,767,769,771,774,776],{"class":119,"line":209},[117,768,569],{"class":226},[117,770,238],{"class":127},[117,772,773],{"class":226},"attempts",[117,775,370],{"class":127},[117,777,778],{"class":166},"\u002F\u002F [\"exa\", \"brave\"], everything tried, in order\n",[117,780,781,783,785,788,790],{"class":119,"line":232},[117,782,569],{"class":226},[117,784,238],{"class":127},[117,786,787],{"class":226},"failures",[117,789,370],{"class":127},[117,791,792],{"class":166},"\u002F\u002F [{ provider: \"exa\", error: \"HTTP 402: …\" }]\n",[313,794,795,796,799,800,413,802,804,805,238],{},"The library starts with the first configured provider in detection order (Exa, Brave, Context.dev, Firecrawl, Jina, Tavily, TinyFish, SerpAPI, SerpBase, Mojeek, then custom ones) and moves on after a payment, rate limit, timeout, connection or server failure. Auth failures and invalid requests stop the chain right there. A bad key is your configuration problem, not a reason to burn the next provider's quota. When every eligible provider fails you get ",[114,797,798],{},"ProviderFallbackError"," with the full ",[114,801,773],{},[114,803,787],{}," and the last error as ",[114,806,807],{},"cause",[313,809,810],{},"A continuation from a fallback answer pins later calls to the provider inside the token. Two pages never come from two engines.",[102,812,814],{"id":813},"batches","Batches",[107,816,818],{"className":109,"code":817,"language":111,"meta":112,"style":112},"import { readBatch, searchBatch } from \"@agntn\u002Fweb\";\n\nconst searches = await searchBatch([\"TypeScript 7\", \"Node.js releases\"], { provider: \"exa\" });\nconst pages = await readBatch([\"https:\u002F\u002Fexample.com\u002Fone\", \"https:\u002F\u002Fexample.com\u002Ftwo\"]);\n",[114,819,820,846,850,898],{"__ignoreMap":112},[117,821,822,824,826,829,831,834,836,838,840,842,844],{"class":119,"line":120},[117,823,124],{"class":123},[117,825,128],{"class":127},[117,827,828],{"class":131}," readBatch",[117,830,471],{"class":127},[117,832,833],{"class":131}," searchBatch",[117,835,135],{"class":127},[117,837,139],{"class":138},[117,839,143],{"class":142},[117,841,147],{"class":146},[117,843,150],{"class":142},[117,845,153],{"class":127},[117,847,848],{"class":119,"line":156},[117,849,160],{"emptyLinePlaceholder":159},[117,851,852,854,857,859,861,863,866,868,871,873,875,877,880,882,885,888,890,892,894,896],{"class":119,"line":163},[117,853,174],{"class":173},[117,855,856],{"class":177}," searches",[117,858,181],{"class":173},[117,860,185],{"class":184},[117,862,833],{"class":188},[117,864,865],{"class":127},"([",[117,867,150],{"class":142},[117,869,870],{"class":146},"TypeScript 7",[117,872,150],{"class":142},[117,874,272],{"class":127},[117,876,150],{"class":142},[117,878,879],{"class":146},"Node.js releases",[117,881,150],{"class":142},[117,883,884],{"class":127},"], {",[117,886,887],{"class":131}," provider",[117,889,363],{"class":127},[117,891,143],{"class":142},[117,893,466],{"class":146},[117,895,150],{"class":142},[117,897,493],{"class":127},[117,899,900,902,905,907,909,911,913,915,918,920,922,924,927,929],{"class":119,"line":170},[117,901,174],{"class":173},[117,903,904],{"class":177}," pages",[117,906,181],{"class":173},[117,908,185],{"class":184},[117,910,828],{"class":188},[117,912,865],{"class":127},[117,914,150],{"class":142},[117,916,917],{"class":146},"https:\u002F\u002Fexample.com\u002Fone",[117,919,150],{"class":142},[117,921,272],{"class":127},[117,923,150],{"class":142},[117,925,926],{"class":146},"https:\u002F\u002Fexample.com\u002Ftwo",[117,928,150],{"class":142},[117,930,931],{"class":127},"]);\n",[313,933,934,935,938,939,942,943,946,947,950,951,954,955,957],{},"Up to ",[114,936,937],{},"MAX_BATCH_ITEMS"," (10) inputs, ",[114,940,941],{},"DEFAULT_CONCURRENCY"," (3) at a time, ",[114,944,945],{},"MAX_CONCURRENCY"," (10) at most. Order is preserved and one failure does not throw away the others. Each search item is the detailed answer for its query, or ",[114,948,949],{},"{ query, error, attempts, failures }"," when automatic selection ran out of providers. Without an explicit provider each query falls back on its own. With ",[114,952,953],{},"provider: \"all\""," every query fans out and one scheduler bounds the outer queries and the inner providers together, otherwise ten queries times nine providers would be ninety requests in flight. A single ",[114,956,676],{}," is rejected for a batch, it cannot belong to several queries.",[102,959,961],{"id":960},"configured-reachable-default","Configured, reachable, default",[107,963,965],{"className":109,"code":964,"language":111,"meta":112,"style":112},"import {\n  detectAvailableProviders,\n  detectAvailableProvidersAsync,\n  listProviders,\n  listProvidersAsync,\n  resolveDefaultProvider,\n  resolveDefaultProviderAsync,\n} from \"@agntn\u002Fweb\";\n\ndetectAvailableProviders(); \u002F\u002F [\"exa\", \"brave\", …] from env vars, no network\nawait detectAvailableProvidersAsync(); \u002F\u002F the same, minus providers whose isAvailable() probe fails\nresolveDefaultProvider(); \u002F\u002F the first of them, or NoProviderConfiguredError\nawait resolveDefaultProviderAsync(); \u002F\u002F the first reachable one, or NoProviderAvailableError\n",[114,966,967,973,981,988,995,1002,1009,1016,1030,1034,1045,1059,1070],{"__ignoreMap":112},[117,968,969,971],{"class":119,"line":120},[117,970,124],{"class":123},[117,972,354],{"class":127},[117,974,975,978],{"class":119,"line":156},[117,976,977],{"class":131},"  detectAvailableProviders",[117,979,980],{"class":127},",\n",[117,982,983,986],{"class":119,"line":163},[117,984,985],{"class":131},"  detectAvailableProvidersAsync",[117,987,980],{"class":127},[117,989,990,993],{"class":119,"line":170},[117,991,992],{"class":131},"  listProviders",[117,994,980],{"class":127},[117,996,997,1000],{"class":119,"line":204},[117,998,999],{"class":131},"  listProvidersAsync",[117,1001,980],{"class":127},[117,1003,1004,1007],{"class":119,"line":209},[117,1005,1006],{"class":131},"  resolveDefaultProvider",[117,1008,980],{"class":127},[117,1010,1011,1014],{"class":119,"line":232},[117,1012,1013],{"class":131},"  resolveDefaultProviderAsync",[117,1015,980],{"class":127},[117,1017,1018,1020,1022,1024,1026,1028],{"class":119,"line":308},[117,1019,280],{"class":127},[117,1021,139],{"class":138},[117,1023,143],{"class":142},[117,1025,147],{"class":146},[117,1027,150],{"class":142},[117,1029,153],{"class":127},[117,1031,1032],{"class":119,"line":624},[117,1033,160],{"emptyLinePlaceholder":159},[117,1035,1036,1039,1042],{"class":119,"line":639},[117,1037,1038],{"class":188},"detectAvailableProviders",[117,1040,1041],{"class":127},"(); ",[117,1043,1044],{"class":166},"\u002F\u002F [\"exa\", \"brave\", …] from env vars, no network\n",[117,1046,1048,1051,1054,1056],{"class":119,"line":1047},11,[117,1049,1050],{"class":184},"await",[117,1052,1053],{"class":188}," detectAvailableProvidersAsync",[117,1055,1041],{"class":127},[117,1057,1058],{"class":166},"\u002F\u002F the same, minus providers whose isAvailable() probe fails\n",[117,1060,1062,1065,1067],{"class":119,"line":1061},12,[117,1063,1064],{"class":188},"resolveDefaultProvider",[117,1066,1041],{"class":127},[117,1068,1069],{"class":166},"\u002F\u002F the first of them, or NoProviderConfiguredError\n",[117,1071,1073,1075,1078,1080],{"class":119,"line":1072},13,[117,1074,1050],{"class":184},[117,1076,1077],{"class":188}," resolveDefaultProviderAsync",[117,1079,1041],{"class":127},[117,1081,1082],{"class":166},"\u002F\u002F the first reachable one, or NoProviderAvailableError\n",[313,1084,1085,1088,1089,272,1092,1095,1096,1099,1100,1103,1104,1107],{},[114,1086,1087],{},"listProviders()"," returns every registered provider with ",[114,1090,1091],{},"configured",[114,1093,1094],{},"envVar"," and the complete ",[114,1097,1098],{},"capabilities"," matrix. The async variant adds ",[114,1101,1102],{},"reachable"," for providers with a probe. SearXNG is the only built-in with one, because a self-hosted instance on ",[114,1105,1106],{},"localhost:8080"," is configured by definition and down half the time.",[1109,1110,1111],"style",{},"html pre.shiki code .sP0CR, html code.shiki .sP0CR{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#5DE4C7}html pre.shiki code .sKlNE, html code.shiki .sKlNE{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#A6ACCD}html pre.shiki code .snHMy, html code.shiki .snHMy{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#ADD7FF}html pre.shiki code .stCPd, html code.shiki .stCPd{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#A6ACCD}html pre.shiki code .scVjq, html code.shiki .scVjq{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#A6ACCD}html pre.shiki code .sQ7BG, html code.shiki .sQ7BG{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#5DE4C7}html pre.shiki code .sjhu3, html code.shiki .sjhu3{--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#767C9DB0;--shiki-dark-font-style:italic}html pre.shiki code .s1TYA, html code.shiki .s1TYA{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#91B4D5}html pre.shiki code .saoiD, html code.shiki .saoiD{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#E4F0FB}html pre.shiki code .sZW6a, html code.shiki .sZW6a{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#5DE4C7C0}html pre.shiki code .sULi6, html code.shiki .sULi6{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#E4F0FBD0}html pre.shiki code .spVlQ, html code.shiki .spVlQ{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E4F0FB}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sCrqT, html code.shiki .sCrqT{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#A6ACCDC0}html pre.shiki code .scZRh, html code.shiki .scZRh{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#ADD7FF}html pre.shiki code .s0VbO, html code.shiki .s0VbO{--shiki-light:#E36209;--shiki-default:#E36209;--shiki-dark:#A6ACCD}html pre.shiki code .s8yaW, html code.shiki .s8yaW{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#A6ACCDC0}html pre.shiki code .siHFe, html code.shiki .siHFe{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#5DE4C7}",{"title":112,"searchDepth":156,"depth":156,"links":1113},[1114,1115,1116,1117,1118],{"id":104,"depth":156,"text":105},{"id":496,"depth":156,"text":497},{"id":680,"depth":156,"text":681},{"id":813,"depth":156,"text":814},{"id":960,"depth":156,"text":961},"Every configured provider at once with deduplicated results and evidence, automatic fallback for one query, and batches of queries.","md",null,{"icon":1123},"i-lucide-git-fork",{"title":16,"description":1119},"cjz8PkhDxexPqkjdZ3t1dbH7uomrbMmOSmechZ7sZnE",[1127,1129],{"title":12,"path":13,"stem":14,"description":1128,"children":-1},"One provider, one query, the options every adapter takes, the filters each one honours, and the diagnostics that come back.",{"title":20,"path":21,"stem":22,"description":1130,"children":-1},"URL in, normalized page out, with Jina Reader first, automatic fallback, an exact output bound and a continuation for the rest.",1788509441443]