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