[{"data":1,"prerenderedAt":1388},["ShallowReactive",2],{"navigation_docs":3,"-guide-search":104,"-guide-search-surround":1383},[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":12,"body":106,"description":1376,"extension":1377,"links":1378,"meta":1379,"navigation":227,"path":13,"seo":1381,"stem":14,"__hash__":1382},"docs\u002F1.guide\u002F2.search.md",{"type":107,"value":108,"toc":1368},"minimark",[109,114,188,200,302,306,480,498,501,742,748,752,758,878,897,907,911,914,1011,1101,1116,1120,1178,1212,1215,1358,1364],[110,111,113],"h2",{"id":112},"the-contract","The contract",[115,116,121],"pre",{"className":117,"code":118,"language":119,"meta":120,"style":120},"language-ts shiki shiki-themes web web web","interface SearchProvider {\n  search(query: string, options?: SearchRequestOptions): Promise\u003CSearchResult[]>;\n}\n","ts","",[122,123,124,141,182],"code",{"__ignoreMap":120},[125,126,129,133,137],"span",{"class":127,"line":128},"line",1,[125,130,132],{"class":131},"skH_V","interface",[125,134,136],{"class":135},"sK71F"," SearchProvider",[125,138,140],{"class":139},"s38Sx"," {\n",[125,142,144,147,150,153,156,159,162,165,168,170,173,176,179],{"class":127,"line":143},2,[125,145,146],{"class":135},"  search",[125,148,149],{"class":139},"(query",[125,151,152],{"class":131},":",[125,154,155],{"class":135}," string",[125,157,158],{"class":139},", options",[125,160,161],{"class":131},"?:",[125,163,164],{"class":135}," SearchRequestOptions",[125,166,167],{"class":139},")",[125,169,152],{"class":131},[125,171,172],{"class":135}," Promise",[125,174,175],{"class":139},"\u003C",[125,177,178],{"class":135},"SearchResult",[125,180,181],{"class":139},"[]>;\n",[125,183,185],{"class":127,"line":184},3,[125,186,187],{"class":139},"}\n",[189,190,191,192,195,196,199],"p",{},"Every search adapter has this one method. ",[122,193,194],{},"create(name)"," imports that adapter on its first call and gives you the provider, ",[122,197,198],{},"isSearchProvider(provider)"," is the type guard when you hold something you did not create yourself.",[115,201,203],{"className":117,"code":202,"language":119,"meta":120,"style":120},"import { create, isSearchProvider } from \"@agntn\u002Fweb\";\n\nconst provider = await create(\"brave\");\nif (isSearchProvider(provider)) {\n  const results = await provider.search(\"typescript runtimes\", { maxResults: 5 });\n}\n",[122,204,205,223,229,255,270,297],{"__ignoreMap":120},[125,206,207,210,213,216,220],{"class":127,"line":128},[125,208,209],{"class":131},"import",[125,211,212],{"class":139}," { create, isSearchProvider } ",[125,214,215],{"class":131},"from",[125,217,219],{"class":218},"shU9J"," \"@agntn\u002Fweb\"",[125,221,222],{"class":139},";\n",[125,224,225],{"class":127,"line":143},[125,226,228],{"emptyLinePlaceholder":227},true,"\n",[125,230,231,234,237,240,243,246,249,252],{"class":127,"line":184},[125,232,233],{"class":131},"const",[125,235,236],{"class":139}," provider ",[125,238,239],{"class":131},"=",[125,241,242],{"class":131}," await",[125,244,245],{"class":135}," create",[125,247,248],{"class":139},"(",[125,250,251],{"class":218},"\"brave\"",[125,253,254],{"class":139},");\n",[125,256,258,261,264,267],{"class":127,"line":257},4,[125,259,260],{"class":131},"if",[125,262,263],{"class":139}," (",[125,265,266],{"class":135},"isSearchProvider",[125,268,269],{"class":139},"(provider)) {\n",[125,271,273,276,279,281,283,286,289,291,294],{"class":127,"line":272},5,[125,274,275],{"class":131},"  const",[125,277,278],{"class":139}," results ",[125,280,239],{"class":131},[125,282,242],{"class":131},[125,284,285],{"class":139}," provider.",[125,287,288],{"class":135},"search",[125,290,248],{"class":139},[125,292,293],{"class":218},"\"typescript runtimes\"",[125,295,296],{"class":139},", { maxResults: 5 });\n",[125,298,300],{"class":127,"line":299},6,[125,301,187],{"class":139},[110,303,305],{"id":304},"options","Options",[115,307,309],{"className":117,"code":308,"language":119,"meta":120,"style":120},"interface SearchRequestOptions extends ExecutionOptions {\n  maxResults?: number; \u002F\u002F default 10\n  highlights?: boolean; \u002F\u002F default true\n  summary?: boolean; \u002F\u002F default false\n  fullText?: boolean; \u002F\u002F default false\n  includeDomains?: readonly string[];\n  excludeDomains?: readonly string[];\n  sources?: readonly string[];\n  categories?: readonly string[];\n  startPublishedDate?: string;\n  endPublishedDate?: string;\n  category?: string;\n}\n",[122,310,311,323,340,355,369,382,397,411,425,439,451,463,475],{"__ignoreMap":120},[125,312,313,315,317,320],{"class":127,"line":128},[125,314,132],{"class":131},[125,316,164],{"class":135},[125,318,319],{"class":131}," extends",[125,321,322],{"class":139}," ExecutionOptions {\n",[125,324,325,328,330,333,336],{"class":127,"line":143},[125,326,327],{"class":139},"  maxResults",[125,329,161],{"class":131},[125,331,332],{"class":135}," number",[125,334,335],{"class":139},"; ",[125,337,339],{"class":338},"scIB-","\u002F\u002F default 10\n",[125,341,342,345,347,350,352],{"class":127,"line":184},[125,343,344],{"class":139},"  highlights",[125,346,161],{"class":131},[125,348,349],{"class":135}," boolean",[125,351,335],{"class":139},[125,353,354],{"class":338},"\u002F\u002F default true\n",[125,356,357,360,362,364,366],{"class":127,"line":257},[125,358,359],{"class":139},"  summary",[125,361,161],{"class":131},[125,363,349],{"class":135},[125,365,335],{"class":139},[125,367,368],{"class":338},"\u002F\u002F default false\n",[125,370,371,374,376,378,380],{"class":127,"line":272},[125,372,373],{"class":139},"  fullText",[125,375,161],{"class":131},[125,377,349],{"class":135},[125,379,335],{"class":139},[125,381,368],{"class":338},[125,383,384,387,389,392,394],{"class":127,"line":299},[125,385,386],{"class":139},"  includeDomains",[125,388,161],{"class":131},[125,390,391],{"class":131}," readonly",[125,393,155],{"class":135},[125,395,396],{"class":139},"[];\n",[125,398,400,403,405,407,409],{"class":127,"line":399},7,[125,401,402],{"class":139},"  excludeDomains",[125,404,161],{"class":131},[125,406,391],{"class":131},[125,408,155],{"class":135},[125,410,396],{"class":139},[125,412,414,417,419,421,423],{"class":127,"line":413},8,[125,415,416],{"class":139},"  sources",[125,418,161],{"class":131},[125,420,391],{"class":131},[125,422,155],{"class":135},[125,424,396],{"class":139},[125,426,428,431,433,435,437],{"class":127,"line":427},9,[125,429,430],{"class":139},"  categories",[125,432,161],{"class":131},[125,434,391],{"class":131},[125,436,155],{"class":135},[125,438,396],{"class":139},[125,440,442,445,447,449],{"class":127,"line":441},10,[125,443,444],{"class":139},"  startPublishedDate",[125,446,161],{"class":131},[125,448,155],{"class":135},[125,450,222],{"class":139},[125,452,454,457,459,461],{"class":127,"line":453},11,[125,455,456],{"class":139},"  endPublishedDate",[125,458,161],{"class":131},[125,460,155],{"class":135},[125,462,222],{"class":139},[125,464,466,469,471,473],{"class":127,"line":465},12,[125,467,468],{"class":139},"  category",[125,470,161],{"class":131},[125,472,155],{"class":135},[125,474,222],{"class":139},[125,476,478],{"class":127,"line":477},13,[125,479,187],{"class":139},[189,481,482,485,486,489,490,493,494,497],{},[122,483,484],{},"maxResults"," goes to the provider as the requested count and is applied again to what comes back, so an engine that pages by ten still gives you five. ",[122,487,488],{},"highlights"," asks for passages relevant to the query where the engine has them (Exa, Firecrawl). ",[122,491,492],{},"summary"," asks Exa for a summary of each result or Tavily and OpenAI Codex for an answer to the query. ",[122,495,496],{},"fullText"," asks for the whole page text, which is a lot of tokens, so think before you turn it on.",[189,499,500],{},"The filters are per provider. A provider that cannot do one does not fail, it just tells you through the detailed helpers:",[502,503,504,526],"table",{},[505,506,507],"thead",{},[508,509,510,514,517,520,523],"tr",{},[511,512,513],"th",{},"Provider",[511,515,516],{},"Domain filters",[511,518,519],{},"Source values",[511,521,522],{},"Category values",[511,524,525],{},"Date bounds",[527,528,529,544,557,570,601,620,632,644,656,668,680,705,725],"tbody",{},[508,530,531,534,537,539,541],{},[532,533,52],"td",{},[532,535,536],{},"none",[532,538,536],{},[532,540,536],{},[532,542,543],{},"start, end",[508,545,546,548,551,553,555],{},[532,547,56],{},[532,549,550],{},"include, exclude",[532,552,536],{},[532,554,536],{},[532,556,536],{},[508,558,559,561,563,565,568],{},[532,560,60],{},[532,562,550],{},[532,564,536],{},[532,566,567],{},"forwarded as given",[532,569,543],{},[508,571,572,574,576,588,599],{},[532,573,64],{},[532,575,550],{},[532,577,578,581,582,581,585],{},[122,579,580],{},"web",", ",[122,583,584],{},"news",[122,586,587],{},"images",[532,589,590,581,593,581,596],{},[122,591,592],{},"research",[122,594,595],{},"pdf",[122,597,598],{},"developer",[532,600,536],{},[508,602,603,605,608,610,618],{},[532,604,68],{},[532,606,607],{},"include",[532,609,536],{},[532,611,612,581,614,581,616],{},[122,613,580],{},[122,615,587],{},[122,617,584],{},[532,619,536],{},[508,621,622,624,626,628,630],{},[532,623,100],{},[532,625,536],{},[532,627,536],{},[532,629,536],{},[532,631,536],{},[508,633,634,636,638,640,642],{},[532,635,72],{},[532,637,550],{},[532,639,536],{},[532,641,536],{},[532,643,543],{},[508,645,646,648,650,652,654],{},[532,647,96],{},[532,649,536],{},[532,651,536],{},[532,653,536],{},[532,655,536],{},[508,657,658,660,662,664,666],{},[532,659,76],{},[532,661,536],{},[532,663,536],{},[532,665,567],{},[532,667,536],{},[508,669,670,672,674,676,678],{},[532,671,80],{},[532,673,536],{},[532,675,536],{},[532,677,536],{},[532,679,543],{},[508,681,682,684,686,688,703],{},[532,683,84],{},[532,685,536],{},[532,687,536],{},[532,689,690,581,693,581,695,581,697,581,700],{},[122,691,692],{},"image",[122,694,587],{},[122,696,584],{},[122,698,699],{},"video",[122,701,702],{},"videos",[532,704,536],{},[508,706,707,709,711,713,723],{},[532,708,88],{},[532,710,550],{},[532,712,536],{},[532,714,715,581,718,581,720],{},[122,716,717],{},"general",[122,719,584],{},[122,721,722],{},"finance",[532,724,543],{},[508,726,727,729,731,733,740],{},[532,728,92],{},[532,730,550],{},[532,732,536],{},[532,734,735,581,737],{},[122,736,584],{},[122,738,739],{},"research_paper",[532,741,543],{},[189,743,744,747],{},[122,745,746],{},"getSearchFilterCapabilities(name)"," gives you the same table for one provider at runtime.",[110,749,751],{"id":750},"diagnostics","Diagnostics",[189,753,754,757],{},[122,755,756],{},"search()"," is a list API. When you want to know what the provider actually did with your options, ask for the detailed answer:",[115,759,761],{"className":117,"code":760,"language":119,"meta":120,"style":120},"import { searchProviderDetailed } from \"@agntn\u002Fweb\";\n\nconst answer = await searchProviderDetailed(\"brave\", \"typescript runtimes\", {\n  maxResults: 10,\n  includeDomains: [\"github.com\"],\n});\n\nanswer.provider; \u002F\u002F \"brave\"\nanswer.results; \u002F\u002F SearchResult[]\nanswer.ignoredFilters; \u002F\u002F [\"includeDomains\"], Brave has no domain filter\nanswer.undeclaredFilters; \u002F\u002F [] on built-ins, custom providers without capability metadata land here\nanswer.pagination; \u002F\u002F { status: \"next\", continuation: \"…\" }\nanswer.metadata; \u002F\u002F metadata for the whole response when the provider has it\n",[122,762,763,776,780,805,810,821,826,830,838,846,854,862,870],{"__ignoreMap":120},[125,764,765,767,770,772,774],{"class":127,"line":128},[125,766,209],{"class":131},[125,768,769],{"class":139}," { searchProviderDetailed } ",[125,771,215],{"class":131},[125,773,219],{"class":218},[125,775,222],{"class":139},[125,777,778],{"class":127,"line":143},[125,779,228],{"emptyLinePlaceholder":227},[125,781,782,784,787,789,791,794,796,798,800,802],{"class":127,"line":184},[125,783,233],{"class":131},[125,785,786],{"class":139}," answer ",[125,788,239],{"class":131},[125,790,242],{"class":131},[125,792,793],{"class":135}," searchProviderDetailed",[125,795,248],{"class":139},[125,797,251],{"class":218},[125,799,581],{"class":139},[125,801,293],{"class":218},[125,803,804],{"class":139},", {\n",[125,806,807],{"class":127,"line":257},[125,808,809],{"class":139},"  maxResults: 10,\n",[125,811,812,815,818],{"class":127,"line":272},[125,813,814],{"class":139},"  includeDomains: [",[125,816,817],{"class":218},"\"github.com\"",[125,819,820],{"class":139},"],\n",[125,822,823],{"class":127,"line":299},[125,824,825],{"class":139},"});\n",[125,827,828],{"class":127,"line":399},[125,829,228],{"emptyLinePlaceholder":227},[125,831,832,835],{"class":127,"line":413},[125,833,834],{"class":139},"answer.provider; ",[125,836,837],{"class":338},"\u002F\u002F \"brave\"\n",[125,839,840,843],{"class":127,"line":427},[125,841,842],{"class":139},"answer.results; ",[125,844,845],{"class":338},"\u002F\u002F SearchResult[]\n",[125,847,848,851],{"class":127,"line":441},[125,849,850],{"class":139},"answer.ignoredFilters; ",[125,852,853],{"class":338},"\u002F\u002F [\"includeDomains\"], Brave has no domain filter\n",[125,855,856,859],{"class":127,"line":453},[125,857,858],{"class":139},"answer.undeclaredFilters; ",[125,860,861],{"class":338},"\u002F\u002F [] on built-ins, custom providers without capability metadata land here\n",[125,863,864,867],{"class":127,"line":465},[125,865,866],{"class":139},"answer.pagination; ",[125,868,869],{"class":338},"\u002F\u002F { status: \"next\", continuation: \"…\" }\n",[125,871,872,875],{"class":127,"line":477},[125,873,874],{"class":139},"answer.metadata; ",[125,876,877],{"class":338},"\u002F\u002F metadata for the whole response when the provider has it\n",[189,879,880,881,884,885,888,889,892,893,896],{},"Silently dropping a filter is the worst thing a wrapper can do, you end up trusting results that were never filtered. So the ignored ones are always listed. Firecrawl puts its request id, warnings and credits used in ",[122,882,883],{},"metadata",", Tavily puts the generated answer in ",[122,886,887],{},"metadata.answer",". ",[122,890,891],{},"isDetailedSearchProvider(provider)"," tells you whether a provider exposes ",[122,894,895],{},"searchDetailed()"," directly.",[189,898,899,900,903,904,906],{},"The detailed helpers also take ",[122,901,902],{},"favicon: false",", which drops the favicon URL from every result and every fan-out evidence record before it reaches you. Brave's run about 280 bytes each and SerpAPI's about 400, so the agent surfaces pass it unless the model asks. ",[122,905,756],{}," on a provider has no such switch, it hands over what the engine mapped.",[110,908,910],{"id":909},"pagination","Pagination",[189,912,913],{},"Brave, Marginalia, Mojeek, SearXNG, SerpAPI, SerpBase and TinyFish have deeper pages. The detailed helpers normalize the state:",[115,915,917],{"className":117,"code":916,"language":119,"meta":120,"style":120},"type SearchPagination =\n  | { status: \"next\"; continuation: string } \u002F\u002F the provider said there is more\n  | { status: \"unknown\"; continuation: string } \u002F\u002F another page must be probed\n  | { status: \"end\" } \u002F\u002F no further page\n  | { status: \"unsupported\" }; \u002F\u002F the provider does not page\n",[122,918,919,930,956,978,994],{"__ignoreMap":120},[125,920,921,924,927],{"class":127,"line":128},[125,922,923],{"class":131},"type",[125,925,926],{"class":135}," SearchPagination",[125,928,929],{"class":131}," =\n",[125,931,932,935,938,940,943,946,948,950,953],{"class":127,"line":143},[125,933,934],{"class":131},"  |",[125,936,937],{"class":139}," { status",[125,939,152],{"class":131},[125,941,942],{"class":218}," \"next\"",[125,944,945],{"class":139},"; continuation",[125,947,152],{"class":131},[125,949,155],{"class":135},[125,951,952],{"class":139}," } ",[125,954,955],{"class":338},"\u002F\u002F the provider said there is more\n",[125,957,958,960,962,964,967,969,971,973,975],{"class":127,"line":184},[125,959,934],{"class":131},[125,961,937],{"class":139},[125,963,152],{"class":131},[125,965,966],{"class":218}," \"unknown\"",[125,968,945],{"class":139},[125,970,152],{"class":131},[125,972,155],{"class":135},[125,974,952],{"class":139},[125,976,977],{"class":338},"\u002F\u002F another page must be probed\n",[125,979,980,982,984,986,989,991],{"class":127,"line":257},[125,981,934],{"class":131},[125,983,937],{"class":139},[125,985,152],{"class":131},[125,987,988],{"class":218}," \"end\"",[125,990,952],{"class":139},[125,992,993],{"class":338},"\u002F\u002F no further page\n",[125,995,996,998,1000,1002,1005,1008],{"class":127,"line":272},[125,997,934],{"class":131},[125,999,937],{"class":139},[125,1001,152],{"class":131},[125,1003,1004],{"class":218}," \"unsupported\"",[125,1006,1007],{"class":139}," }; ",[125,1009,1010],{"class":338},"\u002F\u002F the provider does not page\n",[115,1012,1014],{"className":117,"code":1013,"language":119,"meta":120,"style":120},"const first = await searchProviderDetailed(\"brave\", \"typescript runtimes\", { maxResults: 10 });\n\nif (first.pagination.status === \"next\") {\n  const second = await searchProviderDetailed(\"brave\", \"typescript runtimes\", {\n    maxResults: 10,\n    continuation: first.pagination.continuation,\n  });\n}\n",[122,1015,1016,1040,1044,1059,1082,1087,1092,1097],{"__ignoreMap":120},[125,1017,1018,1020,1023,1025,1027,1029,1031,1033,1035,1037],{"class":127,"line":128},[125,1019,233],{"class":131},[125,1021,1022],{"class":139}," first ",[125,1024,239],{"class":131},[125,1026,242],{"class":131},[125,1028,793],{"class":135},[125,1030,248],{"class":139},[125,1032,251],{"class":218},[125,1034,581],{"class":139},[125,1036,293],{"class":218},[125,1038,1039],{"class":139},", { maxResults: 10 });\n",[125,1041,1042],{"class":127,"line":143},[125,1043,228],{"emptyLinePlaceholder":227},[125,1045,1046,1048,1051,1054,1056],{"class":127,"line":184},[125,1047,260],{"class":131},[125,1049,1050],{"class":139}," (first.pagination.status ",[125,1052,1053],{"class":131},"===",[125,1055,942],{"class":218},[125,1057,1058],{"class":139},") {\n",[125,1060,1061,1063,1066,1068,1070,1072,1074,1076,1078,1080],{"class":127,"line":257},[125,1062,275],{"class":131},[125,1064,1065],{"class":139}," second ",[125,1067,239],{"class":131},[125,1069,242],{"class":131},[125,1071,793],{"class":135},[125,1073,248],{"class":139},[125,1075,251],{"class":218},[125,1077,581],{"class":139},[125,1079,293],{"class":218},[125,1081,804],{"class":139},[125,1083,1084],{"class":127,"line":272},[125,1085,1086],{"class":139},"    maxResults: 10,\n",[125,1088,1089],{"class":127,"line":299},[125,1090,1091],{"class":139},"    continuation: first.pagination.continuation,\n",[125,1093,1094],{"class":127,"line":399},[125,1095,1096],{"class":139},"  });\n",[125,1098,1099],{"class":127,"line":413},[125,1100,187],{"class":139},[189,1102,1103,1104,1107,1108,1111,1112,1115],{},"The token is opaque and bound to the provider, the query and every option that changes the page. Change any of them and you get ",[122,1105,1106],{},"InvalidSearchContinuationError"," before another request leaves. But opaque does not mean signed. A token you did not produce yourself is untrusted input, treat it like one. Tokens are at most ",[122,1109,1110],{},"MAX_SEARCH_CONTINUATION_LENGTH"," (4 096) characters, the provider's own state inside at most ",[122,1113,1114],{},"MAX_PROVIDER_SEARCH_CONTINUATION_LENGTH"," (2 048).",[110,1117,1119],{"id":1118},"execution-controls","Execution controls",[115,1121,1123],{"className":117,"code":1122,"language":119,"meta":120,"style":120},"interface ExecutionOptions {\n  signal?: AbortSignal;\n  deadline?: number; \u002F\u002F absolute Unix timestamp in milliseconds\n  concurrency?: number; \u002F\u002F batch and fan-out only; default 3, maximum 10\n}\n",[122,1124,1125,1134,1146,1160,1174],{"__ignoreMap":120},[125,1126,1127,1129,1132],{"class":127,"line":128},[125,1128,132],{"class":131},[125,1130,1131],{"class":135}," ExecutionOptions",[125,1133,140],{"class":139},[125,1135,1136,1139,1141,1144],{"class":127,"line":143},[125,1137,1138],{"class":139},"  signal",[125,1140,161],{"class":131},[125,1142,1143],{"class":135}," AbortSignal",[125,1145,222],{"class":139},[125,1147,1148,1151,1153,1155,1157],{"class":127,"line":184},[125,1149,1150],{"class":139},"  deadline",[125,1152,161],{"class":131},[125,1154,332],{"class":135},[125,1156,335],{"class":139},[125,1158,1159],{"class":338},"\u002F\u002F absolute Unix timestamp in milliseconds\n",[125,1161,1162,1165,1167,1169,1171],{"class":127,"line":257},[125,1163,1164],{"class":139},"  concurrency",[125,1166,161],{"class":131},[125,1168,332],{"class":135},[125,1170,335],{"class":139},[125,1172,1173],{"class":338},"\u002F\u002F batch and fan-out only; default 3, maximum 10\n",[125,1175,1176],{"class":127,"line":272},[125,1177,187],{"class":139},[189,1179,1180,1181,1184,1185,1188,1189,1192,1193,1196,1197,1200,1201,1203,1204,1207,1208,1211],{},"Every network call takes them. ",[122,1182,1183],{},"signal"," cancels the request in flight. ",[122,1186,1187],{},"deadline"," is one budget for the whole operation, fallback and fan-out included, so waiting on a slow first provider does not reset the clock for the second. ",[122,1190,1191],{},"concurrency"," bounds how many requests the batch and fan-out helpers start at once. None of them change a continuation token. When the deadline cuts a fan-out, ",[122,1194,1195],{},"searchAllDetailed"," returns the providers that finished and lists the rest in ",[122,1198,1199],{},"errors",", a batch does the same per item, and a cancelled ",[122,1202,1183],{}," still rejects. ",[122,1205,1206],{},"deadlineAfterSeconds(30)"," turns a budget into that timestamp, the agent tools use it for ",[122,1209,1210],{},"timeoutSeconds",".",[110,1213,1214],{"id":1199},"Errors",[502,1216,1217,1227],{},[505,1218,1219],{},[508,1220,1221,1224],{},[511,1222,1223],{},"Error",[511,1225,1226],{},"When",[527,1228,1229,1239,1249,1261,1271,1280,1290,1308,1326],{},[508,1230,1231,1236],{},[532,1232,1233],{},[122,1234,1235],{},"EmptyQueryError",[532,1237,1238],{},"the query is blank",[508,1240,1241,1246],{},[532,1242,1243],{},[122,1244,1245],{},"UnknownProviderError",[532,1247,1248],{},"the name is not registered",[508,1250,1251,1256],{},[532,1252,1253],{},[122,1254,1255],{},"SearchNotSupportedError",[532,1257,1258,1259],{},"the provider has no ",[122,1260,756],{},[508,1262,1263,1268],{},[532,1264,1265],{},[122,1266,1267],{},"InvalidDateFilterError",[532,1269,1270],{},"a date bound is not an ISO date, or the end is before the start",[508,1272,1273,1277],{},[532,1274,1275],{},[122,1276,1106],{},[532,1278,1279],{},"the token does not belong to this provider, query and options",[508,1281,1282,1287],{},[532,1283,1284],{},[122,1285,1286],{},"AuthError",[532,1288,1289],{},"the provider rejected the key with 401, or the key is missing",[508,1291,1292,1297],{},[532,1293,1294],{},[122,1295,1296],{},"PaymentError",[532,1298,1299,1300,1303,1304,1307],{},"spent credits, however the provider spells them: Context.dev 401 with ",[122,1301,1302],{},"USAGE_EXCEEDED",", Tavily 432 or 433, SerpBase ",[122,1305,1306],{},"status: 1020",". Automatic fallback keeps going",[508,1309,1310,1315],{},[532,1311,1312],{},[122,1313,1314],{},"RateLimitError",[532,1316,1317,1318,1321,1322,1325],{},"the provider answered 429, ",[122,1319,1320],{},"retryAfter"," in seconds, ",[122,1323,1324],{},"provider"," says which",[508,1327,1328,1333],{},[532,1329,1330],{},[122,1331,1332],{},"HTTPError",[532,1334,1335,1336,1339,1340,1343,1344,1347,1348,1350,1351,1353,1354,1357],{},"any other non-2xx, with ",[122,1337,1338],{},"statusCode",", redacted ",[122,1341,1342],{},"url"," and ",[122,1345,1346],{},"body","; no response at all is ",[122,1349,1338],{}," 0, ",[122,1352,1346],{}," names the transport cause and ",[122,1355,1356],{},"cause"," keeps the original error",[189,1359,1360,1363],{},[122,1361,1362],{},"normalizeError(error, provider)"," is what the adapters use to map a raw HTTP failure onto this list. It is exported, custom providers should use it too.",[1365,1366,1367],"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 .sK71F, html code.shiki .sK71F{--shiki-light:var(--shiki-token-function);--shiki-default:var(--shiki-token-function);--shiki-dark:var(--shiki-token-function)}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 .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 .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)}",{"title":120,"searchDepth":143,"depth":143,"links":1369},[1370,1371,1372,1373,1374,1375],{"id":112,"depth":143,"text":113},{"id":304,"depth":143,"text":305},{"id":750,"depth":143,"text":751},{"id":909,"depth":143,"text":910},{"id":1118,"depth":143,"text":1119},{"id":1199,"depth":143,"text":1214},"One provider, one query, the options every adapter takes, the filters each one honours, and the diagnostics that come back.","md",null,{"icon":1380},"i-lucide-search",{"title":12,"description":1376},"FRzLa2IuBZR1EylDqQTgr8b6THx8_rjXAKVwWBSYRkQ",[1384,1386],{"title":10,"path":6,"stem":7,"description":1385,"children":-1},"Install the package, run one search, and get the same result shape from thirteen providers.",{"title":16,"path":17,"stem":18,"description":1387,"children":-1},"Every configured provider at once with deduplicated results and evidence, automatic fallback for one query, and batches of queries.",1791225878344]