[{"data":1,"prerenderedAt":1609},["ShallowReactive",2],{"navigation_docs":3,"-guide":96,"-guide-surround":1606},[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":10,"body":98,"description":1600,"extension":1601,"links":1602,"meta":1603,"navigation":276,"path":6,"seo":1604,"stem":7,"__hash__":1605},"docs\u002F1.guide\u002F1.index.md",{"type":99,"value":100,"toc":1589},"minimark",[101,109,116,121,134,165,169,194,208,225,229,432,453,528,532,733,741,745,939,945,949,1102,1117,1121,1310,1324,1328,1526,1552,1556,1585],[102,103,104,108],"warning",{},[105,106,107],"strong",{},"Pre-1.0."," The public API, the provider list and the CLI flags can still change. Pin exact versions if you build on it now.",[110,111,112,115],"caution",{},[105,113,114],{},"Search results and page content are data, never instructions."," Titles, snippets, highlights and Markdown come from sites anyone can publish. Show them, index them, summarize them. Do not let an agent read them as a message to itself, seriously.",[117,118,120],"h2",{"id":119},"why-this-exists","Why this exists",[122,123,124,125,129,130,133],"p",{},"Every search API has its own idea of a request. Exa wants a POST with ",[126,127,128],"code",{},"x-api-key",", Brave a GET with ",[126,131,132],{},"X-Subscription-Token",", Jina a Bearer token, Tavily puts the key in the request body. They all give back roughly the same thing, a list of URLs with titles and snippets, just wrapped eleven different ways. Pull one client per engine into an agent and you have eleven response shapes and eleven ways to misread a date.",[122,135,136,137,140,141,144,145,148,149,152,153,156,157,160,161,164],{},"So ",[126,138,139],{},"@agntn\u002Fweb"," puts eleven providers behind one class shape and three capabilities: ",[105,142,143],{},"search"," (query → results), ",[105,146,147],{},"search image"," (public image URL → matching pages) and ",[105,150,151],{},"read"," (URL → normalized page content). Same calls, same ",[126,154,155],{},"SearchResult",", ",[126,158,159],{},"ImageSearchResult"," and ",[126,162,163],{},"ReadResult"," everywhere. The adapter decides how to ask, you decide what to ask for.",[117,166,168],{"id":167},"install","Install",[170,171,176],"pre",{"className":172,"code":173,"language":174,"meta":175,"style":175},"language-bash shiki shiki-themes github-light github-light poimandres","pnpm add @agntn\u002Fweb\n","bash","",[126,177,178],{"__ignoreMap":175},[179,180,183,187,191],"span",{"class":181,"line":182},"line",1,[179,184,186],{"class":185},"sseY5","pnpm",[179,188,190],{"class":189},"sX7Zv"," add",[179,192,193],{"class":189}," @agntn\u002Fweb\n",[122,195,196,197,200,201,160,204,207],{},"The AI SDK tools on the ",[126,198,199],{},"\u002Fai"," subpath need ",[126,202,203],{},"ai",[126,205,206],{},"zod"," next to them:",[170,209,211],{"className":172,"code":210,"language":174,"meta":175,"style":175},"pnpm add ai zod\n",[126,212,213],{"__ignoreMap":175},[179,214,215,217,219,222],{"class":181,"line":182},[179,216,186],{"class":185},[179,218,190],{"class":189},[179,220,221],{"class":189}," ai",[179,223,224],{"class":189}," zod\n",[117,226,228],{"id":227},"first-search","First search",[170,230,235],{"className":231,"code":232,"filename":233,"language":234,"meta":175,"style":175},"language-ts shiki shiki-themes github-light github-light poimandres","import { create } from \"@agntn\u002Fweb\";\n\n\u002F\u002F Reads EXA_API_KEY from process.env\nconst exa = create(\"exa\");\n\nconst results = await exa.search(\"typescript runtime benchmarks\", { maxResults: 5 });\n\nfor (const result of results) {\n  console.log(result.title, result.url);\n}\n","search.ts","ts",[126,236,237,271,278,285,315,320,367,372,394,426],{"__ignoreMap":175},[179,238,239,243,247,251,254,258,262,265,268],{"class":181,"line":182},[179,240,242],{"class":241},"sP0CR","import",[179,244,246],{"class":245},"sKlNE"," {",[179,248,250],{"class":249},"snHMy"," create",[179,252,253],{"class":245}," }",[179,255,257],{"class":256},"stCPd"," from",[179,259,261],{"class":260},"scVjq"," \"",[179,263,139],{"class":264},"sQ7BG",[179,266,267],{"class":260},"\"",[179,269,270],{"class":245},";\n",[179,272,274],{"class":181,"line":273},2,[179,275,277],{"emptyLinePlaceholder":276},true,"\n",[179,279,281],{"class":181,"line":280},3,[179,282,284],{"class":283},"sjhu3","\u002F\u002F Reads EXA_API_KEY from process.env\n",[179,286,288,292,296,299,302,305,307,310,312],{"class":181,"line":287},4,[179,289,291],{"class":290},"s1TYA","const",[179,293,295],{"class":294},"saoiD"," exa",[179,297,298],{"class":290}," =",[179,300,250],{"class":301},"sULi6",[179,303,304],{"class":245},"(",[179,306,267],{"class":260},[179,308,309],{"class":264},"exa",[179,311,267],{"class":260},[179,313,314],{"class":245},");\n",[179,316,318],{"class":181,"line":317},5,[179,319,277],{"emptyLinePlaceholder":276},[179,321,323,325,328,330,334,337,340,342,344,346,349,351,354,357,360,364],{"class":181,"line":322},6,[179,324,291],{"class":290},[179,326,327],{"class":294}," results",[179,329,298],{"class":290},[179,331,333],{"class":332},"sZW6a"," await",[179,335,295],{"class":336},"spVlQ",[179,338,339],{"class":245},".",[179,341,143],{"class":301},[179,343,304],{"class":245},[179,345,267],{"class":260},[179,347,348],{"class":264},"typescript runtime benchmarks",[179,350,267],{"class":260},[179,352,353],{"class":245},", {",[179,355,356],{"class":249}," maxResults",[179,358,359],{"class":245},":",[179,361,363],{"class":362},"siHFe"," 5",[179,365,366],{"class":245}," });\n",[179,368,370],{"class":181,"line":369},7,[179,371,277],{"emptyLinePlaceholder":276},[179,373,375,378,381,383,386,389,391],{"class":181,"line":374},8,[179,376,377],{"class":256},"for",[179,379,380],{"class":245}," (",[179,382,291],{"class":290},[179,384,385],{"class":294}," result",[179,387,388],{"class":290}," of",[179,390,327],{"class":336},[179,392,393],{"class":245},") {\n",[179,395,397,400,402,405,407,410,412,415,417,419,421,424],{"class":181,"line":396},9,[179,398,399],{"class":336},"  console",[179,401,339],{"class":245},[179,403,404],{"class":301},"log",[179,406,304],{"class":245},[179,408,409],{"class":336},"result",[179,411,339],{"class":245},[179,413,414],{"class":336},"title",[179,416,156],{"class":245},[179,418,409],{"class":336},[179,420,339],{"class":245},[179,422,423],{"class":336},"url",[179,425,314],{"class":245},[179,427,429],{"class":181,"line":428},10,[179,430,431],{"class":245},"}\n",[122,433,434,435,437,438,156,441,444,445,448,449,452],{},"Importing ",[126,436,139],{}," registers the eleven built-in providers as a side effect. After that ",[126,439,440],{},"create(\"brave\")",[126,442,443],{},"create(\"tavily\")"," or ",[126,446,447],{},"create(\"searxng\")"," resolves the class, no switch statement anywhere. The key comes from the provider's env var unless you pass ",[126,450,451],{},"apiKey"," yourself:",[170,454,456],{"className":231,"code":455,"language":234,"meta":175,"style":175},"const exa = create(\"exa\", { apiKey: \"your-key-here\" });\nconst searx = create(\"searxng\", { baseURL: \"https:\u002F\u002Fsearx.example.com\" });\n",[126,457,458,492],{"__ignoreMap":175},[179,459,460,462,464,466,468,470,472,474,476,478,481,483,485,488,490],{"class":181,"line":182},[179,461,291],{"class":290},[179,463,295],{"class":294},[179,465,298],{"class":290},[179,467,250],{"class":301},[179,469,304],{"class":245},[179,471,267],{"class":260},[179,473,309],{"class":264},[179,475,267],{"class":260},[179,477,353],{"class":245},[179,479,480],{"class":249}," apiKey",[179,482,359],{"class":245},[179,484,261],{"class":260},[179,486,487],{"class":264},"your-key-here",[179,489,267],{"class":260},[179,491,366],{"class":245},[179,493,494,496,499,501,503,505,507,510,512,514,517,519,521,524,526],{"class":181,"line":273},[179,495,291],{"class":290},[179,497,498],{"class":294}," searx",[179,500,298],{"class":290},[179,502,250],{"class":301},[179,504,304],{"class":245},[179,506,267],{"class":260},[179,508,509],{"class":264},"searxng",[179,511,267],{"class":260},[179,513,353],{"class":245},[179,515,516],{"class":249}," baseURL",[179,518,359],{"class":245},[179,520,261],{"class":260},[179,522,523],{"class":264},"https:\u002F\u002Fsearx.example.com",[179,525,267],{"class":260},[179,527,366],{"class":245},[117,529,531],{"id":530},"same-call-any-provider","Same call, any provider",[170,533,535],{"className":231,"code":534,"language":234,"meta":175,"style":175},"await create(\"brave\").search(\"query\"); \u002F\u002F BRAVE_API_KEY\nawait create(\"context\").search(\"query\"); \u002F\u002F CONTEXT_DEV_API_KEY\nawait create(\"jina\").search(\"query\"); \u002F\u002F JINA_API_KEY\nawait create(\"mojeek\").search(\"query\"); \u002F\u002F MOJEEK_API_KEY\nawait create(\"tavily\").search(\"query\"); \u002F\u002F TAVILY_API_KEY\nawait create(\"tinyfish\").search(\"query\"); \u002F\u002F TINYFISH_API_KEY\n",[126,536,537,573,605,637,669,701],{"__ignoreMap":175},[179,538,539,542,544,546,548,551,553,556,558,560,562,565,567,570],{"class":181,"line":182},[179,540,541],{"class":332},"await",[179,543,250],{"class":301},[179,545,304],{"class":245},[179,547,267],{"class":260},[179,549,550],{"class":264},"brave",[179,552,267],{"class":260},[179,554,555],{"class":245},").",[179,557,143],{"class":301},[179,559,304],{"class":245},[179,561,267],{"class":260},[179,563,564],{"class":264},"query",[179,566,267],{"class":260},[179,568,569],{"class":245},"); ",[179,571,572],{"class":283},"\u002F\u002F BRAVE_API_KEY\n",[179,574,575,577,579,581,583,586,588,590,592,594,596,598,600,602],{"class":181,"line":273},[179,576,541],{"class":332},[179,578,250],{"class":301},[179,580,304],{"class":245},[179,582,267],{"class":260},[179,584,585],{"class":264},"context",[179,587,267],{"class":260},[179,589,555],{"class":245},[179,591,143],{"class":301},[179,593,304],{"class":245},[179,595,267],{"class":260},[179,597,564],{"class":264},[179,599,267],{"class":260},[179,601,569],{"class":245},[179,603,604],{"class":283},"\u002F\u002F CONTEXT_DEV_API_KEY\n",[179,606,607,609,611,613,615,618,620,622,624,626,628,630,632,634],{"class":181,"line":280},[179,608,541],{"class":332},[179,610,250],{"class":301},[179,612,304],{"class":245},[179,614,267],{"class":260},[179,616,617],{"class":264},"jina",[179,619,267],{"class":260},[179,621,555],{"class":245},[179,623,143],{"class":301},[179,625,304],{"class":245},[179,627,267],{"class":260},[179,629,564],{"class":264},[179,631,267],{"class":260},[179,633,569],{"class":245},[179,635,636],{"class":283},"\u002F\u002F JINA_API_KEY\n",[179,638,639,641,643,645,647,650,652,654,656,658,660,662,664,666],{"class":181,"line":287},[179,640,541],{"class":332},[179,642,250],{"class":301},[179,644,304],{"class":245},[179,646,267],{"class":260},[179,648,649],{"class":264},"mojeek",[179,651,267],{"class":260},[179,653,555],{"class":245},[179,655,143],{"class":301},[179,657,304],{"class":245},[179,659,267],{"class":260},[179,661,564],{"class":264},[179,663,267],{"class":260},[179,665,569],{"class":245},[179,667,668],{"class":283},"\u002F\u002F MOJEEK_API_KEY\n",[179,670,671,673,675,677,679,682,684,686,688,690,692,694,696,698],{"class":181,"line":317},[179,672,541],{"class":332},[179,674,250],{"class":301},[179,676,304],{"class":245},[179,678,267],{"class":260},[179,680,681],{"class":264},"tavily",[179,683,267],{"class":260},[179,685,555],{"class":245},[179,687,143],{"class":301},[179,689,304],{"class":245},[179,691,267],{"class":260},[179,693,564],{"class":264},[179,695,267],{"class":260},[179,697,569],{"class":245},[179,699,700],{"class":283},"\u002F\u002F TAVILY_API_KEY\n",[179,702,703,705,707,709,711,714,716,718,720,722,724,726,728,730],{"class":181,"line":322},[179,704,541],{"class":332},[179,706,250],{"class":301},[179,708,304],{"class":245},[179,710,267],{"class":260},[179,712,713],{"class":264},"tinyfish",[179,715,267],{"class":260},[179,717,555],{"class":245},[179,719,143],{"class":301},[179,721,304],{"class":245},[179,723,267],{"class":260},[179,725,564],{"class":264},[179,727,267],{"class":260},[179,729,569],{"class":245},[179,731,732],{"class":283},"\u002F\u002F TINYFISH_API_KEY\n",[122,734,735,736,740],{},"The ",[737,738,40],"a",{"href":739},"\u002Fexplorer"," runs exactly these calls against the docs worker, so you can see what comes back before you write a line.",[117,742,744],{"id":743},"what-ships","What ships",[746,747,748,770],"table",{},[749,750,751],"thead",{},[752,753,754,758,761,764,767],"tr",{},[755,756,757],"th",{},"Provider",[755,759,760],{},"Env var",[755,762,763],{},"Search",[755,765,766],{},"Image",[755,768,769],{},"Read",[771,772,773,790,805,820,835,851,866,879,894,909,924],"tbody",{},[752,774,775,778,783,786,788],{},[776,777,52],"td",{},[776,779,780],{},[126,781,782],{},"BRAVE_API_KEY",[776,784,785],{},"yes",[776,787],{},[776,789],{},[752,791,792,794,799,801,803],{},[776,793,56],{},[776,795,796],{},[126,797,798],{},"CONTEXT_DEV_API_KEY",[776,800,785],{},[776,802],{},[776,804,785],{},[752,806,807,809,814,816,818],{},[776,808,60],{},[776,810,811],{},[126,812,813],{},"EXA_API_KEY",[776,815,785],{},[776,817],{},[776,819],{},[752,821,822,824,829,831,833],{},[776,823,64],{},[776,825,826],{},[126,827,828],{},"FIRECRAWL_API_KEY",[776,830,785],{},[776,832],{},[776,834,785],{},[752,836,837,839,844,846,848],{},[776,838,68],{},[776,840,841],{},[126,842,843],{},"JINA_API_KEY",[776,845,785],{},[776,847],{},[776,849,850],{},"yes, key optional",[752,852,853,855,860,862,864],{},[776,854,72],{},[776,856,857],{},[126,858,859],{},"MOJEEK_API_KEY",[776,861,785],{},[776,863],{},[776,865],{},[752,867,868,870,873,875,877],{},[776,869,76],{},[776,871,872],{},"none, self-hosted",[776,874,785],{},[776,876],{},[776,878],{},[752,880,881,883,888,890,892],{},[776,882,80],{},[776,884,885],{},[126,886,887],{},"SERPAPI_API_KEY",[776,889,785],{},[776,891,785],{},[776,893],{},[752,895,896,898,903,905,907],{},[776,897,84],{},[776,899,900],{},[126,901,902],{},"SERPBASE_API_KEY",[776,904,785],{},[776,906],{},[776,908],{},[752,910,911,913,918,920,922],{},[776,912,88],{},[776,914,915],{},[126,916,917],{},"TAVILY_API_KEY",[776,919,785],{},[776,921],{},[776,923],{},[752,925,926,928,933,935,937],{},[776,927,92],{},[776,929,930],{},[126,931,932],{},"TINYFISH_API_KEY",[776,934,785],{},[776,936],{},[776,938,785],{},[122,940,941,942,944],{},"Each one has a page under ",[737,943,45],{"href":46}," with the endpoints, the filters it honours, the fields it fills and the traps. The traps are the useful part.",[117,946,948],{"id":947},"the-three-capabilities","The three capabilities",[170,950,952],{"className":231,"code":951,"language":234,"meta":175,"style":175},"import { readUrl, searchAll, searchByImage } from \"@agntn\u002Fweb\";\n\nconst results = await searchAll(\"latest node.js release\"); \u002F\u002F every configured provider, deduplicated\nconst matches = await searchByImage(\"https:\u002F\u002Fexample.com\u002Fimage.jpg\", { provider: \"serpapi\" });\nconst page = await readUrl(\"https:\u002F\u002Fexample.com\u002Farticle\", { format: \"markdown\", maxChars: 20_000 });\n",[126,953,954,986,990,1016,1054],{"__ignoreMap":175},[179,955,956,958,960,963,966,969,971,974,976,978,980,982,984],{"class":181,"line":182},[179,957,242],{"class":241},[179,959,246],{"class":245},[179,961,962],{"class":249}," readUrl",[179,964,965],{"class":245},",",[179,967,968],{"class":249}," searchAll",[179,970,965],{"class":245},[179,972,973],{"class":249}," searchByImage",[179,975,253],{"class":245},[179,977,257],{"class":256},[179,979,261],{"class":260},[179,981,139],{"class":264},[179,983,267],{"class":260},[179,985,270],{"class":245},[179,987,988],{"class":181,"line":273},[179,989,277],{"emptyLinePlaceholder":276},[179,991,992,994,996,998,1000,1002,1004,1006,1009,1011,1013],{"class":181,"line":280},[179,993,291],{"class":290},[179,995,327],{"class":294},[179,997,298],{"class":290},[179,999,333],{"class":332},[179,1001,968],{"class":301},[179,1003,304],{"class":245},[179,1005,267],{"class":260},[179,1007,1008],{"class":264},"latest node.js release",[179,1010,267],{"class":260},[179,1012,569],{"class":245},[179,1014,1015],{"class":283},"\u002F\u002F every configured provider, deduplicated\n",[179,1017,1018,1020,1023,1025,1027,1029,1031,1033,1036,1038,1040,1043,1045,1047,1050,1052],{"class":181,"line":287},[179,1019,291],{"class":290},[179,1021,1022],{"class":294}," matches",[179,1024,298],{"class":290},[179,1026,333],{"class":332},[179,1028,973],{"class":301},[179,1030,304],{"class":245},[179,1032,267],{"class":260},[179,1034,1035],{"class":264},"https:\u002F\u002Fexample.com\u002Fimage.jpg",[179,1037,267],{"class":260},[179,1039,353],{"class":245},[179,1041,1042],{"class":249}," provider",[179,1044,359],{"class":245},[179,1046,261],{"class":260},[179,1048,1049],{"class":264},"serpapi",[179,1051,267],{"class":260},[179,1053,366],{"class":245},[179,1055,1056,1058,1061,1063,1065,1067,1069,1071,1074,1076,1078,1081,1083,1085,1088,1090,1092,1095,1097,1100],{"class":181,"line":317},[179,1057,291],{"class":290},[179,1059,1060],{"class":294}," page",[179,1062,298],{"class":290},[179,1064,333],{"class":332},[179,1066,962],{"class":301},[179,1068,304],{"class":245},[179,1070,267],{"class":260},[179,1072,1073],{"class":264},"https:\u002F\u002Fexample.com\u002Farticle",[179,1075,267],{"class":260},[179,1077,353],{"class":245},[179,1079,1080],{"class":249}," format",[179,1082,359],{"class":245},[179,1084,261],{"class":260},[179,1086,1087],{"class":264},"markdown",[179,1089,267],{"class":260},[179,1091,965],{"class":245},[179,1093,1094],{"class":249}," maxChars",[179,1096,359],{"class":245},[179,1098,1099],{"class":362}," 20_000",[179,1101,366],{"class":245},[122,1103,1104,1106,1107,1109,1110,1112,1113,1116],{},[737,1105,12],{"href":13}," covers the call to one provider and its options. ",[737,1108,16],{"href":17}," is the parallel query, fallback and pagination. ",[737,1111,20],{"href":21}," is URL to content. ",[737,1114,1115],{"href":25},"Reverse image search"," is the image lookup.",[117,1118,1120],{"id":1119},"one-result-shape","One result shape",[170,1122,1124],{"className":231,"code":1123,"language":234,"meta":175,"style":175},"interface SearchResult {\n  url: string;\n  title: string;\n  snippet: string;\n  score?: number;\n  publishedDate?: string;\n  author?: string;\n  image?: string;\n  favicon?: string;\n  text?: string; \u002F\u002F full page text when requested or provided\n  highlights?: string[]; \u002F\u002F passages relevant to the query\n  summary?: string; \u002F\u002F generated summary when requested\n  metadata?: Record\u003Cstring, unknown>; \u002F\u002F whatever else the provider knew\n}\n",[126,1125,1126,1138,1152,1163,1174,1187,1198,1209,1220,1231,1246,1262,1277,1305],{"__ignoreMap":175},[179,1127,1128,1131,1135],{"class":181,"line":182},[179,1129,1130],{"class":290},"interface",[179,1132,1134],{"class":1133},"sCrqT"," SearchResult",[179,1136,1137],{"class":245}," {\n",[179,1139,1140,1144,1146,1150],{"class":181,"line":273},[179,1141,1143],{"class":1142},"s0VbO","  url",[179,1145,359],{"class":290},[179,1147,1149],{"class":1148},"s8yaW"," string",[179,1151,270],{"class":245},[179,1153,1154,1157,1159,1161],{"class":181,"line":280},[179,1155,1156],{"class":1142},"  title",[179,1158,359],{"class":290},[179,1160,1149],{"class":1148},[179,1162,270],{"class":245},[179,1164,1165,1168,1170,1172],{"class":181,"line":287},[179,1166,1167],{"class":1142},"  snippet",[179,1169,359],{"class":290},[179,1171,1149],{"class":1148},[179,1173,270],{"class":245},[179,1175,1176,1179,1182,1185],{"class":181,"line":317},[179,1177,1178],{"class":1142},"  score",[179,1180,1181],{"class":290},"?:",[179,1183,1184],{"class":1148}," number",[179,1186,270],{"class":245},[179,1188,1189,1192,1194,1196],{"class":181,"line":322},[179,1190,1191],{"class":1142},"  publishedDate",[179,1193,1181],{"class":290},[179,1195,1149],{"class":1148},[179,1197,270],{"class":245},[179,1199,1200,1203,1205,1207],{"class":181,"line":369},[179,1201,1202],{"class":1142},"  author",[179,1204,1181],{"class":290},[179,1206,1149],{"class":1148},[179,1208,270],{"class":245},[179,1210,1211,1214,1216,1218],{"class":181,"line":374},[179,1212,1213],{"class":1142},"  image",[179,1215,1181],{"class":290},[179,1217,1149],{"class":1148},[179,1219,270],{"class":245},[179,1221,1222,1225,1227,1229],{"class":181,"line":396},[179,1223,1224],{"class":1142},"  favicon",[179,1226,1181],{"class":290},[179,1228,1149],{"class":1148},[179,1230,270],{"class":245},[179,1232,1233,1236,1238,1240,1243],{"class":181,"line":428},[179,1234,1235],{"class":1142},"  text",[179,1237,1181],{"class":290},[179,1239,1149],{"class":1148},[179,1241,1242],{"class":245},"; ",[179,1244,1245],{"class":283},"\u002F\u002F full page text when requested or provided\n",[179,1247,1249,1252,1254,1256,1259],{"class":181,"line":1248},11,[179,1250,1251],{"class":1142},"  highlights",[179,1253,1181],{"class":290},[179,1255,1149],{"class":1148},[179,1257,1258],{"class":245},"[]; ",[179,1260,1261],{"class":283},"\u002F\u002F passages relevant to the query\n",[179,1263,1265,1268,1270,1272,1274],{"class":181,"line":1264},12,[179,1266,1267],{"class":1142},"  summary",[179,1269,1181],{"class":290},[179,1271,1149],{"class":1148},[179,1273,1242],{"class":245},[179,1275,1276],{"class":283},"\u002F\u002F generated summary when requested\n",[179,1278,1280,1283,1285,1288,1291,1294,1296,1299,1302],{"class":181,"line":1279},13,[179,1281,1282],{"class":1142},"  metadata",[179,1284,1181],{"class":290},[179,1286,1287],{"class":1133}," Record",[179,1289,1290],{"class":245},"\u003C",[179,1292,1293],{"class":1148},"string",[179,1295,156],{"class":245},[179,1297,1298],{"class":1148},"unknown",[179,1300,1301],{"class":245},">; ",[179,1303,1304],{"class":283},"\u002F\u002F whatever else the provider knew\n",[179,1306,1308],{"class":181,"line":1307},14,[179,1309,431],{"class":245},[122,1311,1312,156,1314,160,1316,1319,1320,1323],{},[126,1313,423],{},[126,1315,414],{},[126,1317,1318],{},"snippet"," are always there. The optional fields depend on what the engine exposes, each provider page says which ones it fills. ",[126,1321,1322],{},"metadata"," is the escape hatch for the rest, and yes, it is a bag.",[117,1325,1327],{"id":1326},"errors","Errors",[170,1329,1331],{"className":231,"code":1330,"language":234,"meta":175,"style":175},"import { AuthError, HTTPError, RateLimitError, UnknownProviderError } from \"@agntn\u002Fweb\";\n\ntry {\n  await provider.search(\"query\");\n} catch (error) {\n  if (error instanceof AuthError) {\n    \u002F\u002F missing or invalid API key, error.provider says which\n  }\n  if (error instanceof RateLimitError) {\n    console.log(`Retry after ${error.retryAfter}s`);\n  }\n  if (error instanceof UnknownProviderError) {\n    \u002F\u002F provider name not registered\n  }\n}\n",[126,1332,1333,1369,1373,1381,1402,1417,1433,1438,1443,1457,1494,1498,1512,1517,1521],{"__ignoreMap":175},[179,1334,1335,1337,1339,1342,1344,1347,1349,1352,1354,1357,1359,1361,1363,1365,1367],{"class":181,"line":182},[179,1336,242],{"class":241},[179,1338,246],{"class":245},[179,1340,1341],{"class":249}," AuthError",[179,1343,965],{"class":245},[179,1345,1346],{"class":249}," HTTPError",[179,1348,965],{"class":245},[179,1350,1351],{"class":249}," RateLimitError",[179,1353,965],{"class":245},[179,1355,1356],{"class":249}," UnknownProviderError",[179,1358,253],{"class":245},[179,1360,257],{"class":256},[179,1362,261],{"class":260},[179,1364,139],{"class":264},[179,1366,267],{"class":260},[179,1368,270],{"class":245},[179,1370,1371],{"class":181,"line":273},[179,1372,277],{"emptyLinePlaceholder":276},[179,1374,1375,1379],{"class":181,"line":280},[179,1376,1378],{"class":1377},"szlwh","try",[179,1380,1137],{"class":245},[179,1382,1383,1386,1388,1390,1392,1394,1396,1398,1400],{"class":181,"line":287},[179,1384,1385],{"class":332},"  await",[179,1387,1042],{"class":336},[179,1389,339],{"class":245},[179,1391,143],{"class":301},[179,1393,304],{"class":245},[179,1395,267],{"class":260},[179,1397,564],{"class":264},[179,1399,267],{"class":260},[179,1401,314],{"class":245},[179,1403,1404,1407,1410,1412,1415],{"class":181,"line":317},[179,1405,1406],{"class":245},"} ",[179,1408,1409],{"class":1377},"catch",[179,1411,380],{"class":245},[179,1413,1414],{"class":336},"error",[179,1416,393],{"class":245},[179,1418,1419,1422,1424,1426,1429,1431],{"class":181,"line":322},[179,1420,1421],{"class":256},"  if",[179,1423,380],{"class":245},[179,1425,1414],{"class":336},[179,1427,1428],{"class":290}," instanceof",[179,1430,1341],{"class":1133},[179,1432,393],{"class":245},[179,1434,1435],{"class":181,"line":369},[179,1436,1437],{"class":283},"    \u002F\u002F missing or invalid API key, error.provider says which\n",[179,1439,1440],{"class":181,"line":374},[179,1441,1442],{"class":245},"  }\n",[179,1444,1445,1447,1449,1451,1453,1455],{"class":181,"line":396},[179,1446,1421],{"class":256},[179,1448,380],{"class":245},[179,1450,1414],{"class":336},[179,1452,1428],{"class":290},[179,1454,1351],{"class":1133},[179,1456,393],{"class":245},[179,1458,1459,1462,1464,1466,1468,1471,1474,1477,1479,1481,1484,1487,1490,1492],{"class":181,"line":428},[179,1460,1461],{"class":336},"    console",[179,1463,339],{"class":245},[179,1465,404],{"class":301},[179,1467,304],{"class":245},[179,1469,1470],{"class":260},"`",[179,1472,1473],{"class":264},"Retry after ",[179,1475,1476],{"class":260},"${",[179,1478,1414],{"class":336},[179,1480,339],{"class":260},[179,1482,1483],{"class":336},"retryAfter",[179,1485,1486],{"class":260},"}",[179,1488,1489],{"class":264},"s",[179,1491,1470],{"class":260},[179,1493,314],{"class":245},[179,1495,1496],{"class":181,"line":1248},[179,1497,1442],{"class":245},[179,1499,1500,1502,1504,1506,1508,1510],{"class":181,"line":1264},[179,1501,1421],{"class":256},[179,1503,380],{"class":245},[179,1505,1414],{"class":336},[179,1507,1428],{"class":290},[179,1509,1356],{"class":1133},[179,1511,393],{"class":245},[179,1513,1514],{"class":181,"line":1279},[179,1515,1516],{"class":283},"    \u002F\u002F provider name not registered\n",[179,1518,1519],{"class":181,"line":1307},[179,1520,1442],{"class":245},[179,1522,1524],{"class":181,"line":1523},15,[179,1525,431],{"class":245},[122,1527,1528,1529,1532,1533,1536,1537,1539,1540,1543,1544,1547,1548,1551],{},"A 401 from any provider becomes ",[126,1530,1531],{},"AuthError",", a 429 becomes ",[126,1534,1535],{},"RateLimitError"," with ",[126,1538,1483],{},", everything else is ",[126,1541,1542],{},"HTTPError"," with the status, a redacted URL and the response body. All of them extend ",[126,1545,1546],{},"WebError",", one ",[126,1549,1550],{},"instanceof"," catches the lot.",[117,1553,1555],{"id":1554},"next","Next",[1557,1558,1559,1565,1570,1575,1580],"ul",{},[1560,1561,1562,1564],"li",{},[737,1563,12],{"href":13},": options, filters, content controls and pagination.",[1560,1566,1567,1569],{},[737,1568,16],{"href":17},": every provider at once, and automatic fallback.",[1560,1571,1572,1574],{},[737,1573,20],{"href":21},": pages into Markdown with an exact output bound.",[1560,1576,1577,1579],{},[737,1578,28],{"href":29},": the same calls from a shell.",[1560,1581,1582,1584],{},[737,1583,32],{"href":33},": AI SDK tools, the MCP server, Pi and OMP.",[1586,1587,1588],"style",{},"html pre.shiki code .sseY5, html code.shiki .sseY5{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#91B4D5}html pre.shiki code .sX7Zv, html code.shiki .sX7Zv{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#ADD7FF}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 .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 .sULi6, html code.shiki .sULi6{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#E4F0FBD0}html pre.shiki code .sZW6a, html code.shiki .sZW6a{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#5DE4C7C0}html pre.shiki code .spVlQ, html code.shiki .spVlQ{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E4F0FB}html pre.shiki code .siHFe, html code.shiki .siHFe{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#5DE4C7}html pre.shiki code .sCrqT, html code.shiki .sCrqT{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#A6ACCDC0}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 .szlwh, html code.shiki .szlwh{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#D0679D}",{"title":175,"searchDepth":273,"depth":273,"links":1590},[1591,1592,1593,1594,1595,1596,1597,1598,1599],{"id":119,"depth":273,"text":120},{"id":167,"depth":273,"text":168},{"id":227,"depth":273,"text":228},{"id":530,"depth":273,"text":531},{"id":743,"depth":273,"text":744},{"id":947,"depth":273,"text":948},{"id":1119,"depth":273,"text":1120},{"id":1326,"depth":273,"text":1327},{"id":1554,"depth":273,"text":1555},"Install the package, run one search, and get the same result shape from eleven providers.","md",null,{"icon":43},{"title":10,"description":1600},"Gj3pkC0l8IDFqD9vTdDWdwCc2fw3z6R7dVTEX_qTXNk",[1602,1607],{"title":12,"path":13,"stem":14,"description":1608,"children":-1},"One provider, one query, the options every adapter takes, the filters each one honours, and the diagnostics that come back.",1788509441443]