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