[{"data":1,"prerenderedAt":910},["ShallowReactive",2],{"navigation_docs":3,"-guide-fanout":104,"-guide-fanout-surround":905},[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":103},"Providers","\u002Fproviders","2.providers\u002F0.index",[49,51,55,59,63,67,71,75,79,83,87,91,95,99],{"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",{"title":96,"path":97,"stem":98},"OpenAI Codex","\u002Fproviders\u002Fopenai-codex","2.providers\u002F12.openai-codex",{"title":100,"path":101,"stem":102},"Marginalia","\u002Fproviders\u002Fmarginalia","2.providers\u002F13.marginalia","i-lucide-library",{"id":105,"title":16,"body":106,"description":898,"extension":899,"links":900,"meta":901,"navigation":152,"path":17,"seo":903,"stem":18,"__hash__":904},"docs\u002F1.guide\u002F3.fanout.md",{"type":107,"value":108,"toc":891},"minimark",[109,114,254,273,343,358,361,398,402,499,526,530,533,604,622,633,636,640,722,752,756,862,887],[110,111,113],"h2",{"id":112},"ask-them-all","Ask them all",[115,116,121],"pre",{"className":117,"code":118,"language":119,"meta":120,"style":120},"language-ts shiki shiki-themes web web web","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","",[122,123,124,147,154,161,189,194,214,248],"code",{"__ignoreMap":120},[125,126,129,133,137,140,144],"span",{"class":127,"line":128},"line",1,[125,130,132],{"class":131},"skH_V","import",[125,134,136],{"class":135},"s38Sx"," { searchAll } ",[125,138,139],{"class":131},"from",[125,141,143],{"class":142},"shU9J"," \"@agntn\u002Fweb\"",[125,145,146],{"class":135},";\n",[125,148,150],{"class":127,"line":149},2,[125,151,153],{"emptyLinePlaceholder":152},true,"\n",[125,155,157],{"class":127,"line":156},3,[125,158,160],{"class":159},"scIB-","\u002F\u002F Detects providers from env vars, queries them in parallel\n",[125,162,164,167,170,173,176,180,183,186],{"class":127,"line":163},4,[125,165,166],{"class":131},"const",[125,168,169],{"class":135}," results ",[125,171,172],{"class":131},"=",[125,174,175],{"class":131}," await",[125,177,179],{"class":178},"sK71F"," searchAll",[125,181,182],{"class":135},"(",[125,184,185],{"class":142},"\"latest node.js release\"",[125,187,188],{"class":135},");\n",[125,190,192],{"class":127,"line":191},5,[125,193,153],{"emptyLinePlaceholder":152},[125,195,197,200,203,205,208,211],{"class":127,"line":196},6,[125,198,199],{"class":131},"for",[125,201,202],{"class":135}," (",[125,204,166],{"class":131},[125,206,207],{"class":135}," result ",[125,209,210],{"class":131},"of",[125,212,213],{"class":135}," results) {\n",[125,215,217,220,223,225,228,231,234,236,239,242,245],{"class":127,"line":216},7,[125,218,219],{"class":135},"  console.",[125,221,222],{"class":178},"log",[125,224,182],{"class":135},[125,226,227],{"class":142},"`[${",[125,229,230],{"class":142},"result.providers.",[125,232,233],{"class":178},"join",[125,235,182],{"class":142},[125,237,238],{"class":142},"\", \"",[125,240,241],{"class":142},")",[125,243,244],{"class":142},"}]`",[125,246,247],{"class":135},", result.title, result.url);\n",[125,249,251],{"class":127,"line":250},8,[125,252,253],{"class":135},"}\n",[255,256,257,260,261,264,265,268,269,272],"p",{},[122,258,259],{},"searchAll"," runs every configured search provider through ",[122,262,263],{},"Promise.allSettled",", so one engine failing does not empty the list. Results are deduplicated by normalized URL (fragment removed, trailing slashes trimmed, ",[122,266,267],{},"utm_*"," junk dropped, the rest sorted) and capped by ",[122,270,271],{},"maxResults",", ten by default.",[115,274,276],{"className":117,"code":275,"language":119,"meta":120,"style":120},"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",[122,277,278,292,309,324,339],{"__ignoreMap":120},[125,279,280,283,286,289],{"class":127,"line":128},[125,281,282],{"class":131},"interface",[125,284,285],{"class":178}," SearchAllResult",[125,287,288],{"class":131}," extends",[125,290,291],{"class":135}," SearchResult {\n",[125,293,294,297,300,303,306],{"class":127,"line":149},[125,295,296],{"class":135},"  provider",[125,298,299],{"class":131},":",[125,301,302],{"class":178}," string",[125,304,305],{"class":135},"; ",[125,307,308],{"class":159},"\u002F\u002F the representative record's provider\n",[125,310,311,314,316,318,321],{"class":127,"line":156},[125,312,313],{"class":135},"  providers",[125,315,299],{"class":131},[125,317,302],{"class":178},[125,319,320],{"class":135},"[]; ",[125,322,323],{"class":159},"\u002F\u002F every provider that returned this URL, in requested order\n",[125,325,326,329,331,334,336],{"class":127,"line":163},[125,327,328],{"class":135},"  evidence",[125,330,299],{"class":131},[125,332,333],{"class":178}," SearchAllEvidence",[125,335,320],{"class":135},[125,337,338],{"class":159},"\u002F\u002F each provider's complete record, scores untouched\n",[125,340,341],{"class":127,"line":191},[125,342,253],{"class":135},[255,344,345,346,349,350,353,354,357],{},"The first provider in requested order gives the representative ",[122,347,348],{},"title"," and ",[122,351,352],{},"snippet",". ",[122,355,356],{},"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.",[255,359,360],{},"Pick the providers yourself when env has more keys than you want to spend:",[115,362,364],{"className":117,"code":363,"language":119,"meta":120,"style":120},"const results = await searchAll(\"query\", { providers: [\"exa\", \"brave\"], maxResults: 5 });\n",[122,365,366],{"__ignoreMap":120},[125,367,368,370,372,374,376,378,380,383,386,389,392,395],{"class":127,"line":128},[125,369,166],{"class":131},[125,371,169],{"class":135},[125,373,172],{"class":131},[125,375,175],{"class":131},[125,377,179],{"class":178},[125,379,182],{"class":135},[125,381,382],{"class":142},"\"query\"",[125,384,385],{"class":135},", { providers: [",[125,387,388],{"class":142},"\"exa\"",[125,390,391],{"class":135},", ",[125,393,394],{"class":142},"\"brave\"",[125,396,397],{"class":135},"], maxResults: 5 });\n",[110,399,401],{"id":400},"the-detailed-answer","The detailed answer",[115,403,405],{"className":117,"code":404,"language":119,"meta":120,"style":120},"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 or ran past the deadline\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",[122,406,407,420,424,445,449,457,465,473,481,490],{"__ignoreMap":120},[125,408,409,411,414,416,418],{"class":127,"line":128},[125,410,132],{"class":131},[125,412,413],{"class":135}," { searchAllDetailed } ",[125,415,139],{"class":131},[125,417,143],{"class":142},[125,419,146],{"class":135},[125,421,422],{"class":127,"line":149},[125,423,153],{"emptyLinePlaceholder":152},[125,425,426,428,431,433,435,438,440,442],{"class":127,"line":156},[125,427,166],{"class":131},[125,429,430],{"class":135}," answer ",[125,432,172],{"class":131},[125,434,175],{"class":131},[125,436,437],{"class":178}," searchAllDetailed",[125,439,182],{"class":135},[125,441,382],{"class":142},[125,443,444],{"class":135},", { concurrency: 3 });\n",[125,446,447],{"class":127,"line":163},[125,448,153],{"emptyLinePlaceholder":152},[125,450,451,454],{"class":127,"line":191},[125,452,453],{"class":135},"answer.results; ",[125,455,456],{"class":159},"\u002F\u002F SearchAllResult[]\n",[125,458,459,462],{"class":127,"line":196},[125,460,461],{"class":135},"answer.successfulProviders; ",[125,463,464],{"class":159},"\u002F\u002F every provider that answered, even with nothing left after deduplication\n",[125,466,467,470],{"class":127,"line":216},[125,468,469],{"class":135},"answer.errors; ",[125,471,472],{"class":159},"\u002F\u002F [{ provider, error }] for the ones that failed or ran past the deadline\n",[125,474,475,478],{"class":127,"line":250},[125,476,477],{"class":135},"answer.filterReports; ",[125,479,480],{"class":159},"\u002F\u002F ignored and undeclared filters, per provider\n",[125,482,484,487],{"class":127,"line":483},9,[125,485,486],{"class":135},"answer.providerPagination; ",[125,488,489],{"class":159},"\u002F\u002F [{ provider, pagination }], one independent state per provider\n",[125,491,493,496],{"class":127,"line":492},10,[125,494,495],{"class":135},"answer.providerMetadata; ",[125,497,498],{"class":159},"\u002F\u002F [{ provider, metadata }] when a provider returned response metadata\n",[255,500,501,502,505,506,509,510,513,514,517,518,521,522,525],{},"Fan-out has no single cursor, and it cannot have one. Take a ",[122,503,504],{},"next"," or ",[122,507,508],{},"unknown"," token from ",[122,511,512],{},"providerPagination"," and continue it with ",[122,515,516],{},"searchProviderDetailed"," and that provider. ",[122,519,520],{},"searchAllDetailed"," rejects a ",[122,523,524],{},"continuation"," of its own.",[110,527,529],{"id":528},"one-query-automatic-fallback","One query, automatic fallback",[255,531,532],{},"When you want one answer and do not care which engine gives it:",[115,534,536],{"className":117,"code":535,"language":119,"meta":120,"style":120},"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",[122,537,538,551,555,576,580,588,596],{"__ignoreMap":120},[125,539,540,542,545,547,549],{"class":127,"line":128},[125,541,132],{"class":131},[125,543,544],{"class":135}," { searchWithFallback } ",[125,546,139],{"class":131},[125,548,143],{"class":142},[125,550,146],{"class":135},[125,552,553],{"class":127,"line":149},[125,554,153],{"emptyLinePlaceholder":152},[125,556,557,559,561,563,565,568,570,573],{"class":127,"line":156},[125,558,166],{"class":131},[125,560,430],{"class":135},[125,562,172],{"class":131},[125,564,175],{"class":131},[125,566,567],{"class":178}," searchWithFallback",[125,569,182],{"class":135},[125,571,572],{"class":142},"\"typescript runtimes\"",[125,574,575],{"class":135},", { maxResults: 10 });\n",[125,577,578],{"class":127,"line":163},[125,579,153],{"emptyLinePlaceholder":152},[125,581,582,585],{"class":127,"line":191},[125,583,584],{"class":135},"answer.provider; ",[125,586,587],{"class":159},"\u002F\u002F the provider that answered\n",[125,589,590,593],{"class":127,"line":196},[125,591,592],{"class":135},"answer.attempts; ",[125,594,595],{"class":159},"\u002F\u002F [\"exa\", \"brave\"], everything tried, in order\n",[125,597,598,601],{"class":127,"line":216},[125,599,600],{"class":135},"answer.failures; ",[125,602,603],{"class":159},"\u002F\u002F [{ provider: \"exa\", error: \"HTTP 402: …\" }]\n",[255,605,606,607,610,611,349,614,617,618,621],{},"The library starts with the first configured provider in detection order (Exa, Brave, Context.dev, Firecrawl, Jina, Tavily, TinyFish, SerpAPI, SerpBase, Mojeek, Marginalia, OpenAI Codex, 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 ",[122,608,609],{},"ProviderFallbackError"," with the full ",[122,612,613],{},"attempts",[122,615,616],{},"failures"," and the last error as ",[122,619,620],{},"cause",".",[255,623,624,625,628,629,632],{},"Spent credits don't come back by themselves, so the process remembers them. A provider that answered with a payment error goes to the back of the chain for 30 minutes and the next calls start with the others. When one of those answers, ",[122,626,627],{},"skipped"," names the spent providers it went past instead of repeating their failures on every call. When they all fail, the spent ones still get asked, so a topped up account works again right away. An explicit ",[122,630,631],{},"provider"," is always called.",[255,634,635],{},"A continuation from a fallback answer pins later calls to the provider inside the token. Two pages never come from two engines.",[110,637,639],{"id":638},"batches","Batches",[115,641,643],{"className":117,"code":642,"language":119,"meta":120,"style":120},"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",[122,644,645,658,662,695],{"__ignoreMap":120},[125,646,647,649,652,654,656],{"class":127,"line":128},[125,648,132],{"class":131},[125,650,651],{"class":135}," { readBatch, searchBatch } ",[125,653,139],{"class":131},[125,655,143],{"class":142},[125,657,146],{"class":135},[125,659,660],{"class":127,"line":149},[125,661,153],{"emptyLinePlaceholder":152},[125,663,664,666,669,671,673,676,679,682,684,687,690,692],{"class":127,"line":156},[125,665,166],{"class":131},[125,667,668],{"class":135}," searches ",[125,670,172],{"class":131},[125,672,175],{"class":131},[125,674,675],{"class":178}," searchBatch",[125,677,678],{"class":135},"([",[125,680,681],{"class":142},"\"TypeScript 7\"",[125,683,391],{"class":135},[125,685,686],{"class":142},"\"Node.js releases\"",[125,688,689],{"class":135},"], { provider: ",[125,691,388],{"class":142},[125,693,694],{"class":135}," });\n",[125,696,697,699,702,704,706,709,711,714,716,719],{"class":127,"line":163},[125,698,166],{"class":131},[125,700,701],{"class":135}," pages ",[125,703,172],{"class":131},[125,705,175],{"class":131},[125,707,708],{"class":178}," readBatch",[125,710,678],{"class":135},[125,712,713],{"class":142},"\"https:\u002F\u002Fexample.com\u002Fone\"",[125,715,391],{"class":135},[125,717,718],{"class":142},"\"https:\u002F\u002Fexample.com\u002Ftwo\"",[125,720,721],{"class":135},"]);\n",[255,723,724,725,728,729,732,733,736,737,740,741,744,745,748,749,751],{},"Up to ",[122,726,727],{},"MAX_BATCH_ITEMS"," (10) inputs, ",[122,730,731],{},"DEFAULT_CONCURRENCY"," (3) at a time, ",[122,734,735],{},"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 ",[122,738,739],{},"{ query, error, attempts, failures }"," when automatic selection ran out of providers. Without an explicit provider each query falls back on its own. With ",[122,742,743],{},"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. Each of those items also carries ",[122,746,747],{},"errors"," for the providers that failed or ran past the deadline. A single ",[122,750,524],{}," is rejected for a batch, it cannot belong to several queries.",[110,753,755],{"id":754},"configured-reachable-default","Configured, reachable, default",[115,757,759],{"className":117,"code":758,"language":119,"meta":120,"style":120},"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",[122,760,761,768,773,778,783,788,793,798,809,813,824,838,849],{"__ignoreMap":120},[125,762,763,765],{"class":127,"line":128},[125,764,132],{"class":131},[125,766,767],{"class":135}," {\n",[125,769,770],{"class":127,"line":149},[125,771,772],{"class":135},"  detectAvailableProviders,\n",[125,774,775],{"class":127,"line":156},[125,776,777],{"class":135},"  detectAvailableProvidersAsync,\n",[125,779,780],{"class":127,"line":163},[125,781,782],{"class":135},"  listProviders,\n",[125,784,785],{"class":127,"line":191},[125,786,787],{"class":135},"  listProvidersAsync,\n",[125,789,790],{"class":127,"line":196},[125,791,792],{"class":135},"  resolveDefaultProvider,\n",[125,794,795],{"class":127,"line":216},[125,796,797],{"class":135},"  resolveDefaultProviderAsync,\n",[125,799,800,803,805,807],{"class":127,"line":250},[125,801,802],{"class":135},"} ",[125,804,139],{"class":131},[125,806,143],{"class":142},[125,808,146],{"class":135},[125,810,811],{"class":127,"line":483},[125,812,153],{"emptyLinePlaceholder":152},[125,814,815,818,821],{"class":127,"line":492},[125,816,817],{"class":178},"detectAvailableProviders",[125,819,820],{"class":135},"(); ",[125,822,823],{"class":159},"\u002F\u002F [\"exa\", \"brave\", …] from env vars, no network\n",[125,825,827,830,833,835],{"class":127,"line":826},11,[125,828,829],{"class":131},"await",[125,831,832],{"class":178}," detectAvailableProvidersAsync",[125,834,820],{"class":135},[125,836,837],{"class":159},"\u002F\u002F the same, minus providers whose isAvailable() probe fails\n",[125,839,841,844,846],{"class":127,"line":840},12,[125,842,843],{"class":178},"resolveDefaultProvider",[125,845,820],{"class":135},[125,847,848],{"class":159},"\u002F\u002F the first of them, or NoProviderConfiguredError\n",[125,850,852,854,857,859],{"class":127,"line":851},13,[125,853,829],{"class":131},[125,855,856],{"class":178}," resolveDefaultProviderAsync",[125,858,820],{"class":135},[125,860,861],{"class":159},"\u002F\u002F the first reachable one, or NoProviderAvailableError\n",[255,863,864,867,868,391,871,874,875,878,879,882,883,886],{},[122,865,866],{},"listProviders()"," returns every registered provider with ",[122,869,870],{},"configured",[122,872,873],{},"envVar"," and the complete ",[122,876,877],{},"capabilities"," matrix. The async variant adds ",[122,880,881],{},"reachable"," for providers with a probe. SearXNG is the only built-in with one, because a self-hosted instance on ",[122,884,885],{},"localhost:8080"," is configured by definition and down half the time.",[888,889,890],"style",{},"html pre.shiki code .skH_V, html code.shiki .skH_V{--shiki-light:var(--shiki-token-keyword);--shiki-default:var(--shiki-token-keyword);--shiki-dark:var(--shiki-token-keyword)}html pre.shiki code .s38Sx, html code.shiki .s38Sx{--shiki-light:var(--ui-text-highlighted);--shiki-default:var(--ui-text-highlighted);--shiki-dark:var(--ui-text-highlighted)}html pre.shiki code .shU9J, html code.shiki .shU9J{--shiki-light:var(--shiki-token-string);--shiki-default:var(--shiki-token-string);--shiki-dark:var(--shiki-token-string)}html pre.shiki code .scIB-, html code.shiki .scIB-{--shiki-light:var(--shiki-token-comment);--shiki-default:var(--shiki-token-comment);--shiki-dark:var(--shiki-token-comment)}html pre.shiki code .sK71F, html code.shiki .sK71F{--shiki-light:var(--shiki-token-function);--shiki-default:var(--shiki-token-function);--shiki-dark:var(--shiki-token-function)}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);}",{"title":120,"searchDepth":149,"depth":149,"links":892},[893,894,895,896,897],{"id":112,"depth":149,"text":113},{"id":400,"depth":149,"text":401},{"id":528,"depth":149,"text":529},{"id":638,"depth":149,"text":639},{"id":754,"depth":149,"text":755},"Every configured provider at once with deduplicated results and evidence, automatic fallback for one query, and batches of queries.","md",null,{"icon":902},"i-lucide-git-fork",{"title":16,"description":898},"ims2J9Hbxb4sBlZIGWL_a6URGWdL1n1YoolOFevJmu4",[906,908],{"title":12,"path":13,"stem":14,"description":907,"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":909,"children":-1},"URL in, normalized page out, with Jina Reader first, automatic fallback, an exact output bound and a continuation for the rest.",1790790786716]