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