[{"data":1,"prerenderedAt":1287},["ShallowReactive",2],{"navigation_docs":3,"-guide-custom":96,"-guide-custom-surround":1282},[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":36,"body":98,"description":1275,"extension":1276,"links":1277,"meta":1278,"navigation":288,"path":37,"seo":1280,"stem":38,"__hash__":1281},"docs\u002F1.guide\u002F8.custom.md",{"type":99,"value":100,"toc":1265},"minimark",[101,106,524,539,543,970,983,987,1006,1034,1038,1063,1161,1165,1199,1203,1226,1230,1247,1251,1261],[102,103,105],"h2",{"id":104},"the-contract","The contract",[107,108,113],"pre",{"className":109,"code":110,"language":111,"meta":112,"style":112},"language-ts shiki shiki-themes github-light github-light poimandres","abstract class Provider {\n  static readonly providerName: string;\n  static readonly defaultBaseURL: string;\n  static readonly apiKeyEnvVar?: string | null;\n  static readonly capabilities?: readonly (\"search\" | \"searchImage\" | \"read\")[];\n  static readonly capabilityDetails?: ProviderCapabilityDetails;\n  static readonly searchFilterCapabilities?: SearchFilterCapabilities;\n\n  protected readonly client: Client;\n  protected readonly baseURL: string;\n  get name(): string;\n}\n\ninterface SearchProvider {\n  search(query: string, options?: SearchRequestOptions): Promise\u003CSearchResult[]>;\n}\ninterface ImageSearchProvider {\n  searchByImage(url: string, options?: ImageSearchRequestOptions): Promise\u003CImageSearchResult[]>;\n}\ninterface ReadProvider {\n  read(url: string, options?: Readonly\u003CReadOptions>): Promise\u003CReadResult>;\n}\n","ts","",[114,115,116,137,160,176,199,248,266,283,290,308,324,342,348,353,364,409,414,424,461,466,476,519],"code",{"__ignoreMap":112},[117,118,121,125,129,133],"span",{"class":119,"line":120},"line",1,[117,122,124],{"class":123},"sP0CR","abstract",[117,126,128],{"class":127},"s1TYA"," class",[117,130,132],{"class":131},"scZRh"," Provider",[117,134,136],{"class":135},"sKlNE"," {\n",[117,138,140,143,146,150,153,157],{"class":119,"line":139},2,[117,141,142],{"class":123},"  static",[117,144,145],{"class":123}," readonly",[117,147,149],{"class":148},"s0VbO"," providerName",[117,151,152],{"class":127},":",[117,154,156],{"class":155},"s8yaW"," string",[117,158,159],{"class":135},";\n",[117,161,163,165,167,170,172,174],{"class":119,"line":162},3,[117,164,142],{"class":123},[117,166,145],{"class":123},[117,168,169],{"class":148}," defaultBaseURL",[117,171,152],{"class":127},[117,173,156],{"class":155},[117,175,159],{"class":135},[117,177,179,181,183,186,189,191,194,197],{"class":119,"line":178},4,[117,180,142],{"class":123},[117,182,145],{"class":123},[117,184,185],{"class":148}," apiKeyEnvVar",[117,187,188],{"class":127},"?:",[117,190,156],{"class":155},[117,192,193],{"class":127}," |",[117,195,196],{"class":155}," null",[117,198,159],{"class":135},[117,200,202,204,206,209,211,213,216,220,224,226,228,231,234,236,238,240,243,245],{"class":119,"line":201},5,[117,203,142],{"class":123},[117,205,145],{"class":123},[117,207,208],{"class":148}," capabilities",[117,210,188],{"class":127},[117,212,145],{"class":123},[117,214,215],{"class":135}," (",[117,217,219],{"class":218},"scVjq","\"",[117,221,223],{"class":222},"sQ7BG","search",[117,225,219],{"class":218},[117,227,193],{"class":127},[117,229,230],{"class":218}," \"",[117,232,233],{"class":222},"searchImage",[117,235,219],{"class":218},[117,237,193],{"class":127},[117,239,230],{"class":218},[117,241,242],{"class":222},"read",[117,244,219],{"class":218},[117,246,247],{"class":135},")[];\n",[117,249,251,253,255,258,260,264],{"class":119,"line":250},6,[117,252,142],{"class":123},[117,254,145],{"class":123},[117,256,257],{"class":148}," capabilityDetails",[117,259,188],{"class":127},[117,261,263],{"class":262},"sCrqT"," ProviderCapabilityDetails",[117,265,159],{"class":135},[117,267,269,271,273,276,278,281],{"class":119,"line":268},7,[117,270,142],{"class":123},[117,272,145],{"class":123},[117,274,275],{"class":148}," searchFilterCapabilities",[117,277,188],{"class":127},[117,279,280],{"class":262}," SearchFilterCapabilities",[117,282,159],{"class":135},[117,284,286],{"class":119,"line":285},8,[117,287,289],{"emptyLinePlaceholder":288},true,"\n",[117,291,293,296,298,301,303,306],{"class":119,"line":292},9,[117,294,295],{"class":123},"  protected",[117,297,145],{"class":123},[117,299,300],{"class":148}," client",[117,302,152],{"class":127},[117,304,305],{"class":262}," Client",[117,307,159],{"class":135},[117,309,311,313,315,318,320,322],{"class":119,"line":310},10,[117,312,295],{"class":123},[117,314,145],{"class":123},[117,316,317],{"class":148}," baseURL",[117,319,152],{"class":127},[117,321,156],{"class":155},[117,323,159],{"class":135},[117,325,327,330,333,336,338,340],{"class":119,"line":326},11,[117,328,329],{"class":127},"  get",[117,331,332],{"class":131}," name",[117,334,335],{"class":135},"()",[117,337,152],{"class":127},[117,339,156],{"class":155},[117,341,159],{"class":135},[117,343,345],{"class":119,"line":344},12,[117,346,347],{"class":135},"}\n",[117,349,351],{"class":119,"line":350},13,[117,352,289],{"emptyLinePlaceholder":288},[117,354,356,359,362],{"class":119,"line":355},14,[117,357,358],{"class":127},"interface",[117,360,361],{"class":262}," SearchProvider",[117,363,136],{"class":135},[117,365,367,370,373,377,379,381,384,387,389,392,395,397,400,403,406],{"class":119,"line":366},15,[117,368,369],{"class":131},"  search",[117,371,372],{"class":135},"(",[117,374,376],{"class":375},"s1jWp","query",[117,378,152],{"class":127},[117,380,156],{"class":155},[117,382,383],{"class":135},", ",[117,385,386],{"class":375},"options",[117,388,188],{"class":127},[117,390,391],{"class":262}," SearchRequestOptions",[117,393,394],{"class":135},")",[117,396,152],{"class":127},[117,398,399],{"class":262}," Promise",[117,401,402],{"class":135},"\u003C",[117,404,405],{"class":262},"SearchResult",[117,407,408],{"class":135},"[]>;\n",[117,410,412],{"class":119,"line":411},16,[117,413,347],{"class":135},[117,415,417,419,422],{"class":119,"line":416},17,[117,418,358],{"class":127},[117,420,421],{"class":262}," ImageSearchProvider",[117,423,136],{"class":135},[117,425,427,430,432,435,437,439,441,443,445,448,450,452,454,456,459],{"class":119,"line":426},18,[117,428,429],{"class":131},"  searchByImage",[117,431,372],{"class":135},[117,433,434],{"class":375},"url",[117,436,152],{"class":127},[117,438,156],{"class":155},[117,440,383],{"class":135},[117,442,386],{"class":375},[117,444,188],{"class":127},[117,446,447],{"class":262}," ImageSearchRequestOptions",[117,449,394],{"class":135},[117,451,152],{"class":127},[117,453,399],{"class":262},[117,455,402],{"class":135},[117,457,458],{"class":262},"ImageSearchResult",[117,460,408],{"class":135},[117,462,464],{"class":119,"line":463},19,[117,465,347],{"class":135},[117,467,469,471,474],{"class":119,"line":468},20,[117,470,358],{"class":127},[117,472,473],{"class":262}," ReadProvider",[117,475,136],{"class":135},[117,477,479,482,484,486,488,490,492,494,496,499,501,504,507,509,511,513,516],{"class":119,"line":478},21,[117,480,481],{"class":131},"  read",[117,483,372],{"class":135},[117,485,434],{"class":375},[117,487,152],{"class":127},[117,489,156],{"class":155},[117,491,383],{"class":135},[117,493,386],{"class":375},[117,495,188],{"class":127},[117,497,498],{"class":262}," Readonly",[117,500,402],{"class":135},[117,502,503],{"class":262},"ReadOptions",[117,505,506],{"class":135},">)",[117,508,152],{"class":127},[117,510,399],{"class":262},[117,512,402],{"class":135},[117,514,515],{"class":262},"ReadResult",[117,517,518],{"class":135},">;\n",[117,520,522],{"class":119,"line":521},22,[117,523,347],{"class":135},[525,526,527,528,531,532,534,535,538],"p",{},"A provider is a class that extends ",[114,529,530],{},"Provider"," and implements one or more of the three interfaces. Capabilities are read off the prototype: a class with a ",[114,533,223],{}," method is a search provider, done. Methods declared as class fields are invisible to that check, so a class that uses them declares a static ",[114,536,537],{},"capabilities"," array instead.",[102,540,542],{"id":541},"a-minimal-search-provider","A minimal search provider",[107,544,546],{"className":109,"code":545,"language":111,"meta":112,"style":112},"import {\n  Provider,\n  register,\n  searchProviders,\n  type ProviderCapabilityDetails,\n  type ProviderConfig,\n  type SearchResult,\n} from \"@agntn\u002Fweb\";\n\nclass InternalSearch extends Provider {\n  static readonly providerName = \"internal-search\";\n  static readonly defaultBaseURL = \"https:\u002F\u002Fsearch.example.com\";\n  static readonly apiKeyEnvVar = null;\n  static readonly capabilityDetails = {\n    search: {\n      contentOptions: [],\n      resultLimit: { default: 10, maximum: 50 },\n      resultFields: [],\n    },\n  } as const satisfies ProviderCapabilityDetails;\n\n  constructor(config: Readonly\u003CProviderConfig>) {\n    super(config, InternalSearch);\n  }\n\n  async search(query: string): Promise\u003CSearchResult[]> {\n    return [{ url: \"https:\u002F\u002Fexample.com\", title: query, snippet: \"Internal result\" }];\n  }\n}\n\nregister(InternalSearch);\nsearchProviders(); \u002F\u002F [..., \"internal-search\"]\n",[114,547,548,555,564,571,578,588,597,606,623,627,642,662,681,696,708,717,727,760,769,774,793,797,819,839,845,850,880,929,934,939,944,957],{"__ignoreMap":112},[117,549,550,553],{"class":119,"line":120},[117,551,552],{"class":123},"import",[117,554,136],{"class":135},[117,556,557,561],{"class":119,"line":139},[117,558,560],{"class":559},"snHMy","  Provider",[117,562,563],{"class":135},",\n",[117,565,566,569],{"class":119,"line":162},[117,567,568],{"class":559},"  register",[117,570,563],{"class":135},[117,572,573,576],{"class":119,"line":178},[117,574,575],{"class":559},"  searchProviders",[117,577,563],{"class":135},[117,579,580,584,586],{"class":119,"line":201},[117,581,583],{"class":582},"stCPd","  type",[117,585,263],{"class":559},[117,587,563],{"class":135},[117,589,590,592,595],{"class":119,"line":250},[117,591,583],{"class":582},[117,593,594],{"class":559}," ProviderConfig",[117,596,563],{"class":135},[117,598,599,601,604],{"class":119,"line":268},[117,600,583],{"class":582},[117,602,603],{"class":559}," SearchResult",[117,605,563],{"class":135},[117,607,608,611,614,616,619,621],{"class":119,"line":285},[117,609,610],{"class":135},"}",[117,612,613],{"class":582}," from",[117,615,230],{"class":218},[117,617,618],{"class":222},"@agntn\u002Fweb",[117,620,219],{"class":218},[117,622,159],{"class":135},[117,624,625],{"class":119,"line":292},[117,626,289],{"emptyLinePlaceholder":288},[117,628,629,632,635,638,640],{"class":119,"line":310},[117,630,631],{"class":127},"class",[117,633,634],{"class":131}," InternalSearch",[117,636,637],{"class":123}," extends",[117,639,132],{"class":131},[117,641,136],{"class":135},[117,643,644,646,648,650,653,655,658,660],{"class":119,"line":326},[117,645,142],{"class":123},[117,647,145],{"class":123},[117,649,149],{"class":148},[117,651,652],{"class":127}," =",[117,654,230],{"class":218},[117,656,657],{"class":222},"internal-search",[117,659,219],{"class":218},[117,661,159],{"class":135},[117,663,664,666,668,670,672,674,677,679],{"class":119,"line":344},[117,665,142],{"class":123},[117,667,145],{"class":123},[117,669,169],{"class":148},[117,671,652],{"class":127},[117,673,230],{"class":218},[117,675,676],{"class":222},"https:\u002F\u002Fsearch.example.com",[117,678,219],{"class":218},[117,680,159],{"class":135},[117,682,683,685,687,689,691,694],{"class":119,"line":350},[117,684,142],{"class":123},[117,686,145],{"class":123},[117,688,185],{"class":148},[117,690,652],{"class":127},[117,692,196],{"class":693},"sNe8j",[117,695,159],{"class":135},[117,697,698,700,702,704,706],{"class":119,"line":355},[117,699,142],{"class":123},[117,701,145],{"class":123},[117,703,257],{"class":148},[117,705,652],{"class":127},[117,707,136],{"class":135},[117,709,710,713,715],{"class":119,"line":366},[117,711,712],{"class":559},"    search",[117,714,152],{"class":135},[117,716,136],{"class":135},[117,718,719,722,724],{"class":119,"line":411},[117,720,721],{"class":559},"      contentOptions",[117,723,152],{"class":135},[117,725,726],{"class":135}," [],\n",[117,728,729,732,734,737,740,742,746,749,752,754,757],{"class":119,"line":416},[117,730,731],{"class":559},"      resultLimit",[117,733,152],{"class":135},[117,735,736],{"class":135}," {",[117,738,739],{"class":559}," default",[117,741,152],{"class":135},[117,743,745],{"class":744},"siHFe"," 10",[117,747,748],{"class":135},",",[117,750,751],{"class":559}," maximum",[117,753,152],{"class":135},[117,755,756],{"class":744}," 50",[117,758,759],{"class":135}," },\n",[117,761,762,765,767],{"class":119,"line":426},[117,763,764],{"class":559},"      resultFields",[117,766,152],{"class":135},[117,768,726],{"class":135},[117,770,771],{"class":119,"line":463},[117,772,773],{"class":135},"    },\n",[117,775,776,779,783,786,789,791],{"class":119,"line":468},[117,777,778],{"class":135},"  } ",[117,780,782],{"class":781},"sp-LQ","as",[117,784,785],{"class":262}," const",[117,787,788],{"class":582}," satisfies",[117,790,263],{"class":262},[117,792,159],{"class":135},[117,794,795],{"class":119,"line":478},[117,796,289],{"emptyLinePlaceholder":288},[117,798,799,802,804,807,809,811,813,816],{"class":119,"line":521},[117,800,801],{"class":127},"  constructor",[117,803,372],{"class":135},[117,805,806],{"class":375},"config",[117,808,152],{"class":127},[117,810,498],{"class":262},[117,812,402],{"class":135},[117,814,815],{"class":262},"ProviderConfig",[117,817,818],{"class":135},">) {\n",[117,820,822,826,828,831,833,836],{"class":119,"line":821},23,[117,823,825],{"class":824},"s-lox","    super",[117,827,372],{"class":135},[117,829,806],{"class":830},"spVlQ",[117,832,383],{"class":135},[117,834,835],{"class":830},"InternalSearch",[117,837,838],{"class":135},");\n",[117,840,842],{"class":119,"line":841},24,[117,843,844],{"class":135},"  }\n",[117,846,848],{"class":119,"line":847},25,[117,849,289],{"emptyLinePlaceholder":288},[117,851,853,856,859,861,863,865,867,869,871,873,875,877],{"class":119,"line":852},26,[117,854,855],{"class":123},"  async",[117,857,858],{"class":131}," search",[117,860,372],{"class":135},[117,862,376],{"class":375},[117,864,152],{"class":127},[117,866,156],{"class":155},[117,868,394],{"class":135},[117,870,152],{"class":127},[117,872,399],{"class":262},[117,874,402],{"class":135},[117,876,405],{"class":262},[117,878,879],{"class":135},"[]> {\n",[117,881,883,887,890,893,895,897,900,902,904,907,909,912,914,917,919,921,924,926],{"class":119,"line":882},27,[117,884,886],{"class":885},"sZW6a","    return",[117,888,889],{"class":135}," [{",[117,891,892],{"class":559}," url",[117,894,152],{"class":135},[117,896,230],{"class":218},[117,898,899],{"class":222},"https:\u002F\u002Fexample.com",[117,901,219],{"class":218},[117,903,748],{"class":135},[117,905,906],{"class":559}," title",[117,908,152],{"class":135},[117,910,911],{"class":830}," query",[117,913,748],{"class":135},[117,915,916],{"class":559}," snippet",[117,918,152],{"class":135},[117,920,230],{"class":218},[117,922,923],{"class":222},"Internal result",[117,925,219],{"class":218},[117,927,928],{"class":135}," }];\n",[117,930,932],{"class":119,"line":931},28,[117,933,844],{"class":135},[117,935,937],{"class":119,"line":936},29,[117,938,347],{"class":135},[117,940,942],{"class":119,"line":941},30,[117,943,289],{"emptyLinePlaceholder":288},[117,945,947,951,953,955],{"class":119,"line":946},31,[117,948,950],{"class":949},"sULi6","register",[117,952,372],{"class":135},[117,954,835],{"class":830},[117,956,838],{"class":135},[117,958,960,963,966],{"class":119,"line":959},32,[117,961,962],{"class":949},"searchProviders",[117,964,965],{"class":135},"(); ",[117,967,969],{"class":968},"sjhu3","\u002F\u002F [..., \"internal-search\"]\n",[525,971,972,973,383,976,383,979,982],{},"From here ",[114,974,975],{},"create(\"internal-search\")",[114,977,978],{},"searchAll",[114,980,981],{},"searchWithFallback",", the CLI, the AI SDK tools, the MCP server and the Pi and OMP extensions all know about it. One catch: tool descriptions still advertise the built-in names, because they are frozen when a session starts. Execution accepts any registered name, the description just does not brag about yours until the next session.",[102,984,986],{"id":985},"names-and-keys","Names and keys",[525,988,989,990,993,994,997,998,1001,1002,1005],{},"Provider names are lowercase ASCII letters, digits and single hyphens inside. ",[114,991,992],{},"apiKeyEnvVar: null"," means registering is enough to count as configured. Leave it out and automatic selection expects the derived variable, ",[114,995,996],{},"INTERNAL_SEARCH_API_KEY"," for the class above. An explicit ",[114,999,1000],{},"create()"," can always pass ",[114,1003,1004],{},"apiKey",".",[525,1007,1008,1011,1012,383,1015,1018,1019,1022,1023,1026,1027,1030,1031,1005],{},[114,1009,1010],{},"this.client"," is the shared HTTP client, ",[114,1013,1014],{},"getJSON",[114,1016,1017],{},"postJSON"," and friends, with the redaction that keeps keys out of error messages. ",[114,1020,1021],{},"this.baseURL"," is the constructor's ",[114,1024,1025],{},"baseURL"," or the class default, checked to be ",[114,1028,1029],{},"http"," or ",[114,1032,1033],{},"https",[102,1035,1037],{"id":1036},"declare-what-you-can-do","Declare what you can do",[525,1039,1040,1043,1044,383,1047,1050,1051,1054,1055,1058,1059,1062],{},[114,1041,1042],{},"capabilityDetails"," is what ",[114,1045,1046],{},"listProviders()",[114,1048,1049],{},"web providers"," and ",[114,1052,1053],{},"web_providers"," report: content options, result limits, the result fields you fill, read formats and options. ",[114,1056,1057],{},"searchFilterCapabilities"," lists the filters you honour and the categories you accept. Skip it and requested filters come back as ",[114,1060,1061],{},"undeclaredFilters"," instead of being guessed. Guessing would be worse.",[107,1064,1066],{"className":109,"code":1065,"language":111,"meta":112,"style":112},"static readonly searchFilterCapabilities = {\n  filters: [\"includeDomains\", \"startPublishedDate\", \"endPublishedDate\"],\n  categories: [\"news\", \"docs\"],\n} as const satisfies SearchFilterCapabilities;\n",[114,1067,1068,1081,1119,1146],{"__ignoreMap":112},[117,1069,1070,1073,1075,1077,1079],{"class":119,"line":120},[117,1071,1072],{"class":830},"static",[117,1074,145],{"class":830},[117,1076,275],{"class":830},[117,1078,652],{"class":127},[117,1080,136],{"class":135},[117,1082,1083,1086,1088,1091,1093,1096,1098,1100,1102,1105,1107,1109,1111,1114,1116],{"class":119,"line":139},[117,1084,1085],{"class":559},"  filters",[117,1087,152],{"class":135},[117,1089,1090],{"class":135}," [",[117,1092,219],{"class":218},[117,1094,1095],{"class":222},"includeDomains",[117,1097,219],{"class":218},[117,1099,748],{"class":135},[117,1101,230],{"class":218},[117,1103,1104],{"class":222},"startPublishedDate",[117,1106,219],{"class":218},[117,1108,748],{"class":135},[117,1110,230],{"class":218},[117,1112,1113],{"class":222},"endPublishedDate",[117,1115,219],{"class":218},[117,1117,1118],{"class":135},"],\n",[117,1120,1121,1124,1126,1128,1130,1133,1135,1137,1139,1142,1144],{"class":119,"line":162},[117,1122,1123],{"class":559},"  categories",[117,1125,152],{"class":135},[117,1127,1090],{"class":135},[117,1129,219],{"class":218},[117,1131,1132],{"class":222},"news",[117,1134,219],{"class":218},[117,1136,748],{"class":135},[117,1138,230],{"class":218},[117,1140,1141],{"class":222},"docs",[117,1143,219],{"class":218},[117,1145,1118],{"class":135},[117,1147,1148,1151,1153,1155,1157,1159],{"class":119,"line":178},[117,1149,1150],{"class":135},"} ",[117,1152,782],{"class":781},[117,1154,785],{"class":262},[117,1156,788],{"class":582},[117,1158,280],{"class":262},[117,1160,159],{"class":135},[102,1162,1164],{"id":1163},"pagination","Pagination",[525,1166,1167,1168,1171,1172,1175,1176,1179,1180,1183,1184,1030,1187,1190,1191,1194,1195,1198],{},"A search provider can also implement ",[114,1169,1170],{},"searchPage(query, options, continuation?)"," and return a ",[114,1173,1174],{},"ProviderSearchPage"," with its own ",[114,1177,1178],{},"continuation"," and a ",[114,1181,1182],{},"continuationStatus"," of ",[114,1185,1186],{},"next",[114,1188,1189],{},"unknown",". That state belongs to the provider, at most 2 048 characters, and only the same adapter ever reads it. The core helpers wrap it in a public token bound to the provider, query and options. No returned continuation means last page, and ",[114,1192,1193],{},"capabilities.search.pagination"," turns ",[114,1196,1197],{},"true"," as soon as the method exists.",[102,1200,1202],{"id":1201},"errors","Errors",[525,1204,1205,1206,1209,1210,1213,1214,1217,1218,1221,1222,1225],{},"Map raw failures with ",[114,1207,1208],{},"normalizeError(error, this.name)",": a 401 becomes ",[114,1211,1212],{},"AuthError",", a 429 ",[114,1215,1216],{},"RateLimitError"," with the ",[114,1219,1220],{},"Retry-After"," value, anything else stays ",[114,1223,1224],{},"HTTPError",". Throw the typed errors yourself for the validation you do before the request. Automatic fallback reads the type to decide whether the next provider is worth trying, so a wrong type means either a wasted quota or a chain that stops too early.",[102,1227,1229],{"id":1228},"reachability","Reachability",[525,1231,1232,1233,1236,1237,383,1240,1050,1243,1246],{},"Implement ",[114,1234,1235],{},"isAvailable(signal?)"," when your endpoint can be down without being misconfigured, the way a self-hosted SearXNG can. ",[114,1238,1239],{},"listProvidersAsync",[114,1241,1242],{},"detectAvailableProvidersAsync",[114,1244,1245],{},"resolveDefaultProviderAsync"," call it and skip a provider whose probe fails.",[102,1248,1250],{"id":1249},"where-the-built-ins-live","Where the built-ins live",[525,1252,1253,1256,1257,1260],{},[114,1254,1255],{},"src\u002Fproviders\u002F\u003Cname>.ts",", one file per provider, each ending in ",[114,1258,1259],{},"register()",". Brave is the smallest search adapter with pagination, Jina is the template for a reader, SerpAPI is the one with reverse image search.",[1262,1263,1264],"style",{},"html pre.shiki code .sP0CR, html code.shiki .sP0CR{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#5DE4C7}html pre.shiki code .s1TYA, html code.shiki .s1TYA{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#91B4D5}html pre.shiki code .scZRh, html code.shiki .scZRh{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#ADD7FF}html pre.shiki code .sKlNE, html code.shiki .sKlNE{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#A6ACCD}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 .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 .sCrqT, html code.shiki .sCrqT{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#A6ACCDC0}html pre.shiki code .s1jWp, html code.shiki .s1jWp{--shiki-light:#E36209;--shiki-default:#E36209;--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 .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 .sNe8j, html code.shiki .sNe8j{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#D0679D}html pre.shiki code .siHFe, html code.shiki .siHFe{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#5DE4C7}html pre.shiki code .sp-LQ, html code.shiki .sp-LQ{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#A6ACCDC0}html pre.shiki code .s-lox, html code.shiki .s-lox{--shiki-light:#005CC5;--shiki-light-font-style:inherit;--shiki-default:#005CC5;--shiki-default-font-style:inherit;--shiki-dark:#5DE4C7;--shiki-dark-font-style:italic}html pre.shiki code .spVlQ, html code.shiki .spVlQ{--shiki-light:#24292E;--shiki-default:#24292E;--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 .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}",{"title":112,"searchDepth":139,"depth":139,"links":1266},[1267,1268,1269,1270,1271,1272,1273,1274],{"id":104,"depth":139,"text":105},{"id":541,"depth":139,"text":542},{"id":985,"depth":139,"text":986},{"id":1036,"depth":139,"text":1037},{"id":1163,"depth":139,"text":1164},{"id":1201,"depth":139,"text":1202},{"id":1228,"depth":139,"text":1229},{"id":1249,"depth":139,"text":1250},"Extend the base class, implement the capabilities you have, register it, and every helper, tool and CLI picks it up.","md",null,{"icon":1279},"i-lucide-plus",{"title":36,"description":1275},"W5kVXO8X7kr6sLrhrnz0AcFpyqpbRtrWwdStOcUyJDo",[1283,1285],{"title":32,"path":33,"stem":34,"description":1284,"children":-1},"The same four tools for the Vercel AI SDK, the MCP server, Pi and OMP, and what an agent should and should not do with the answer.",{"title":40,"path":41,"stem":42,"description":1286,"children":-1},"The explorer page behind web.agntn.dev that runs the library live, and what it does to be a good citizen.",1788509441443]