[{"data":1,"prerenderedAt":1084},["ShallowReactive",2],{"navigation_docs":3,"-guide-agents":104,"-guide-agents-surround":1079},[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":32,"body":106,"description":1072,"extension":1073,"links":1074,"meta":1075,"navigation":313,"path":33,"seo":1077,"stem":34,"__hash__":1078},"docs\u002F1.guide\u002F7.agents.md",{"type":107,"value":108,"toc":1064},"minimark",[109,114,204,225,243,257,261,391,408,643,690,694,736,757,767,771,778,794,812,816,823,831,835,838,1060],[110,111,113],"h2",{"id":112},"four-tools-every-host","Four tools, every host",[115,116,117,133],"table",{},[118,119,120],"thead",{},[121,122,123,127,130],"tr",{},[124,125,126],"th",{},"Tool",[124,128,129],{},"Does",[124,131,132],{},"Returns",[134,135,136,155,170,185],"tbody",{},[121,137,138,145,152],{},[139,140,141],"td",{},[142,143,144],"code",{},"web_search",[139,146,147,148,151],{},"one query or a batch, one provider, automatic selection, or ",[142,149,150],{},"all"," for fan-out",[139,153,154],{},"results with the provider diagnostics",[121,156,157,162,165],{},[139,158,159],{},[142,160,161],{},"web_search_image",[139,163,164],{},"matching pages and images for one public image URL",[139,166,167],{},[142,168,169],{},"ImageSearchResult[]",[121,171,172,177,180],{},[139,173,174],{},[142,175,176],{},"web_read",[139,178,179],{},"one URL or a batch into normalized content, with reader provenance",[139,181,182],{},[142,183,184],{},"{ result, requestedProvider, provider, attempts, failures }",[121,186,187,192,195],{},[139,188,189],{},[142,190,191],{},"web_providers",[139,193,194],{},"the running build, configuration, reachability and the complete capability matrix",[139,196,197,200,201],{},[142,198,199],{},"listProviders()"," plus ",[142,202,203],{},"packageCapabilities",[205,206,207,208,211,212,214,215,217,218,221,222,224],"p",{},"Same four on every surface. The descriptions name the built-in providers, but execution checks the name against the live registry, so a custom provider registered before the session works in a tool call too. The host's abort signal cancels the provider request, no zombie fetches after the model gives up. ",[142,209,210],{},"timeoutSeconds"," on ",[142,213,144],{}," and ",[142,216,176],{}," is the budget the model sets itself: a fan-out or batch returns what finished by then and lists the providers it cut off under ",[142,219,220],{},"errors",", so one slow provider no longer holds an ",[142,223,150],{}," search past the host's own limit.",[205,226,227,228,231,232,235,236,231,239,242],{},"A blank optional string counts as an omitted one. Models fill every property of a flat schema, so ",[142,229,230],{},"continuation: \"\""," or ",[142,233,234],{},"startPublishedDate: \"\""," arrives where a person would leave the field out, and an error there costs a round trip for nothing. Real values are still checked, a malformed token or date fails as before, and an empty ",[142,237,238],{},"query",[142,240,241],{},"url"," is still empty.",[205,244,245,246,248,249,252,253,256],{},"Some hosts send a batch as one string, so ",[142,247,238],{}," arrives as ",[142,250,251],{},"'[\"first\",\"second\"]'",". A string that parses as a JSON array of strings runs as that batch on every surface, otherwise ten queries would turn into one long search. Anything else, like ",[142,254,255],{},"[draft] notes",", stays a plain query, and a list longer than 10 fails the same way an array would.",[110,258,260],{"id":259},"ai-sdk","AI SDK",[262,263,268],"pre",{"className":264,"code":265,"language":266,"meta":267,"style":267},"language-ts shiki shiki-themes web web web","import { generateText } from \"ai\";\nimport { readTool, searchImageTool, searchTool } from \"@agntn\u002Fweb\u002Fai\";\n\nconst { text } = await generateText({\n  model: yourModel,\n  tools: {\n    web_search: searchTool,\n    web_search_image: searchImageTool,\n    web_read: readTool,\n  },\n  prompt: \"Find the latest TypeScript release notes\",\n});\n","ts","",[142,269,270,293,308,315,337,343,349,355,361,367,373,385],{"__ignoreMap":267},[271,272,275,279,283,286,290],"span",{"class":273,"line":274},"line",1,[271,276,278],{"class":277},"skH_V","import",[271,280,282],{"class":281},"s38Sx"," { generateText } ",[271,284,285],{"class":277},"from",[271,287,289],{"class":288},"shU9J"," \"ai\"",[271,291,292],{"class":281},";\n",[271,294,296,298,301,303,306],{"class":273,"line":295},2,[271,297,278],{"class":277},[271,299,300],{"class":281}," { readTool, searchImageTool, searchTool } ",[271,302,285],{"class":277},[271,304,305],{"class":288}," \"@agntn\u002Fweb\u002Fai\"",[271,307,292],{"class":281},[271,309,311],{"class":273,"line":310},3,[271,312,314],{"emptyLinePlaceholder":313},true,"\n",[271,316,318,321,324,327,330,334],{"class":273,"line":317},4,[271,319,320],{"class":277},"const",[271,322,323],{"class":281}," { text } ",[271,325,326],{"class":277},"=",[271,328,329],{"class":277}," await",[271,331,333],{"class":332},"sK71F"," generateText",[271,335,336],{"class":281},"({\n",[271,338,340],{"class":273,"line":339},5,[271,341,342],{"class":281},"  model: yourModel,\n",[271,344,346],{"class":273,"line":345},6,[271,347,348],{"class":281},"  tools: {\n",[271,350,352],{"class":273,"line":351},7,[271,353,354],{"class":281},"    web_search: searchTool,\n",[271,356,358],{"class":273,"line":357},8,[271,359,360],{"class":281},"    web_search_image: searchImageTool,\n",[271,362,364],{"class":273,"line":363},9,[271,365,366],{"class":281},"    web_read: readTool,\n",[271,368,370],{"class":273,"line":369},10,[271,371,372],{"class":281},"  },\n",[271,374,376,379,382],{"class":273,"line":375},11,[271,377,378],{"class":281},"  prompt: ",[271,380,381],{"class":288},"\"Find the latest TypeScript release notes\"",[271,383,384],{"class":281},",\n",[271,386,388],{"class":273,"line":387},12,[271,389,390],{"class":281},"});\n",[205,392,393,214,396,399,400,403,404,407],{},[142,394,395],{},"ai",[142,397,398],{},"zod"," are optional peers. The main entry never imports them, only the ",[142,401,402],{},"\u002Fai"," subpath does. ",[142,405,406],{},"providersTool"," is the fourth export.",[262,409,411],{"className":264,"code":410,"language":266,"meta":267,"style":267},"type SearchToolInput = {\n  query: string | string[]; \u002F\u002F up to 10 in a batch\n  provider?: string; \u002F\u002F a built-in, a custom name, or \"all\"\n  maxResults?: number; \u002F\u002F 1 to 20, default 10\n  continuation?: string;\n  highlights?: boolean;\n  summary?: boolean;\n  fullText?: boolean;\n  favicon?: boolean; \u002F\u002F favicon URLs on results, off by default\n  includeDomains?: string[];\n  excludeDomains?: string[];\n  sources?: string[];\n  categories?: string[];\n  category?: string;\n  startPublishedDate?: string;\n  endPublishedDate?: string;\n  timeoutSeconds?: number; \u002F\u002F whole seconds, at most 3600\n};\n",[142,412,413,427,450,466,481,492,504,515,526,540,552,563,574,586,598,610,622,637],{"__ignoreMap":267},[271,414,415,418,421,424],{"class":273,"line":274},[271,416,417],{"class":277},"type",[271,419,420],{"class":332}," SearchToolInput",[271,422,423],{"class":277}," =",[271,425,426],{"class":281}," {\n",[271,428,429,432,435,438,441,443,446],{"class":273,"line":295},[271,430,431],{"class":281},"  query",[271,433,434],{"class":277},":",[271,436,437],{"class":332}," string",[271,439,440],{"class":277}," |",[271,442,437],{"class":332},[271,444,445],{"class":281},"[]; ",[271,447,449],{"class":448},"scIB-","\u002F\u002F up to 10 in a batch\n",[271,451,452,455,458,460,463],{"class":273,"line":310},[271,453,454],{"class":281},"  provider",[271,456,457],{"class":277},"?:",[271,459,437],{"class":332},[271,461,462],{"class":281},"; ",[271,464,465],{"class":448},"\u002F\u002F a built-in, a custom name, or \"all\"\n",[271,467,468,471,473,476,478],{"class":273,"line":317},[271,469,470],{"class":281},"  maxResults",[271,472,457],{"class":277},[271,474,475],{"class":332}," number",[271,477,462],{"class":281},[271,479,480],{"class":448},"\u002F\u002F 1 to 20, default 10\n",[271,482,483,486,488,490],{"class":273,"line":339},[271,484,485],{"class":281},"  continuation",[271,487,457],{"class":277},[271,489,437],{"class":332},[271,491,292],{"class":281},[271,493,494,497,499,502],{"class":273,"line":345},[271,495,496],{"class":281},"  highlights",[271,498,457],{"class":277},[271,500,501],{"class":332}," boolean",[271,503,292],{"class":281},[271,505,506,509,511,513],{"class":273,"line":351},[271,507,508],{"class":281},"  summary",[271,510,457],{"class":277},[271,512,501],{"class":332},[271,514,292],{"class":281},[271,516,517,520,522,524],{"class":273,"line":357},[271,518,519],{"class":281},"  fullText",[271,521,457],{"class":277},[271,523,501],{"class":332},[271,525,292],{"class":281},[271,527,528,531,533,535,537],{"class":273,"line":363},[271,529,530],{"class":281},"  favicon",[271,532,457],{"class":277},[271,534,501],{"class":332},[271,536,462],{"class":281},[271,538,539],{"class":448},"\u002F\u002F favicon URLs on results, off by default\n",[271,541,542,545,547,549],{"class":273,"line":369},[271,543,544],{"class":281},"  includeDomains",[271,546,457],{"class":277},[271,548,437],{"class":332},[271,550,551],{"class":281},"[];\n",[271,553,554,557,559,561],{"class":273,"line":375},[271,555,556],{"class":281},"  excludeDomains",[271,558,457],{"class":277},[271,560,437],{"class":332},[271,562,551],{"class":281},[271,564,565,568,570,572],{"class":273,"line":387},[271,566,567],{"class":281},"  sources",[271,569,457],{"class":277},[271,571,437],{"class":332},[271,573,551],{"class":281},[271,575,577,580,582,584],{"class":273,"line":576},13,[271,578,579],{"class":281},"  categories",[271,581,457],{"class":277},[271,583,437],{"class":332},[271,585,551],{"class":281},[271,587,589,592,594,596],{"class":273,"line":588},14,[271,590,591],{"class":281},"  category",[271,593,457],{"class":277},[271,595,437],{"class":332},[271,597,292],{"class":281},[271,599,601,604,606,608],{"class":273,"line":600},15,[271,602,603],{"class":281},"  startPublishedDate",[271,605,457],{"class":277},[271,607,437],{"class":332},[271,609,292],{"class":281},[271,611,613,616,618,620],{"class":273,"line":612},16,[271,614,615],{"class":281},"  endPublishedDate",[271,617,457],{"class":277},[271,619,437],{"class":332},[271,621,292],{"class":281},[271,623,625,628,630,632,634],{"class":273,"line":624},17,[271,626,627],{"class":281},"  timeoutSeconds",[271,629,457],{"class":277},[271,631,475],{"class":332},[271,633,462],{"class":281},[271,635,636],{"class":448},"\u002F\u002F whole seconds, at most 3600\n",[271,638,640],{"class":273,"line":639},18,[271,641,642],{"class":281},"};\n",[205,644,645,646,649,650,214,653,656,657,660,661,664,665,214,668,671,672,675,676,678,679,214,682,685,686,689],{},"A scalar search returns ",[142,647,648],{},"{ provider, results, ignoredFilters, undeclaredFilters, pagination, metadata? }",", automatic ones add ",[142,651,652],{},"attempts",[142,654,655],{},"failures",", plus ",[142,658,659],{},"skipped"," when a provider with spent credits was passed over, and ",[142,662,663],{},"provider: \"all\""," returns the fan-out envelope with ",[142,666,667],{},"providers",[142,669,670],{},"evidence"," on each result. ",[142,673,674],{},"readTool"," takes ",[142,677,241],{}," or an array of URLs plus the read options, defaults to 20 000 characters and accepts at most 200 000. Without that default a model would happily ask for a whole site and stuff it into its context. The page's ",[142,680,681],{},"links",[142,683,684],{},"images"," are off unless the model asks for them, a long page carries thousands and they'd outweigh the content several times over. The ",[142,687,688],{},"favicon"," URLs on search results are off the same way: they were a third of a ten result Brave answer and a model has nothing to do with an icon address.",[110,691,693],{"id":692},"mcp","MCP",[262,695,699],{"className":696,"code":697,"language":698,"meta":267,"style":267},"language-bash shiki shiki-themes web web web","web mcp\nclaude mcp add web --scope user -- web mcp\n","bash",[142,700,701,709],{"__ignoreMap":267},[271,702,703,706],{"class":273,"line":274},[271,704,705],{"class":332},"web",[271,707,708],{"class":288}," mcp\n",[271,710,711,714,717,720,723,726,729,732,734],{"class":273,"line":295},[271,712,713],{"class":332},"claude",[271,715,716],{"class":288}," mcp",[271,718,719],{"class":288}," add",[271,721,722],{"class":288}," web",[271,724,725],{"class":288}," --scope",[271,727,728],{"class":288}," user",[271,730,731],{"class":288}," --",[271,733,722],{"class":288},[271,735,708],{"class":288},[205,737,738,739,742,743,746,747,750,751,753,754,756],{},"The server uses the SDK's ",[142,740,741],{},"Server"," class with TypeBox schemas. Every tool advertises an output schema and returns its result under ",[142,744,745],{},"structuredContent.result",", compact JSON stays in ",[142,748,749],{},"content"," for clients that only render text. With ",[142,752,663],{}," each result already is its first provider's record, so here and in the Pi and OMP tools ",[142,755,670],{}," holds only what the other providers said, and a page just one engine found has none. Sending that record twice cost about a quarter of every fan-out answer. Tool symbols and titles match the native extensions, and nothing decorative gets written into the JSON-RPC stream. The client owns its TUI, not the server.",[205,758,759,762,763,766],{},[142,760,761],{},"createMcpServer()"," from the ",[142,764,765],{},"@agntn\u002Fweb\u002Fmcp"," subpath returns the same server when your host brings its own transport.",[110,768,770],{"id":769},"pi-and-omp","Pi and OMP",[205,772,773,774,777],{},"The Pi extension requires ",[142,775,776],{},"@earendil-works\u002Fpi-coding-agent"," 0.86.1 or later. OMP keeps its 18.x API, tested with 18.2.6. Updating the package alone won't update either host.",[262,779,781],{"className":696,"code":780,"language":698,"meta":267,"style":267},"pi install git:github.com\u002Fagntn\u002Fweb\n",[142,782,783],{"__ignoreMap":267},[271,784,785,788,791],{"class":273,"line":274},[271,786,787],{"class":332},"pi",[271,789,790],{"class":288}," install",[271,792,793],{"class":288}," git:github.com\u002Fagntn\u002Fweb\n",[205,795,796,797,803,804,807,808,811],{},"The package ships the four tools as a ",[798,799,787],"a",{"href":800,"rel":801},"https:\u002F\u002Fpi.dev",[802],"nofollow"," extension and an OMP extension. Pi also gets two slash commands: ",[142,805,806],{},"\u002Fweb [query]"," shows results as a selector and pastes the chosen URL into the editor, ",[142,809,810],{},"\u002Fweb-providers"," shows configuration, reachability and capabilities. Both extensions read the same env vars as the library. Their TUI rows show progress, provider choice, result counts and fallback attempts, with bounded previews. A whole page rendered into the terminal is useless, so it never happens.",[110,813,815],{"id":814},"what-the-answer-is","What the answer is",[205,817,818,819,822],{},"The tools return the normalized objects, not prose. A model summarizing them should say what the provider said. The ",[798,820,40],{"href":821},"\u002Fexplorer"," shows the same objects for any query, which is a quick way to check a summary against the source when a model gets creative.",[824,825,826,827,830],"caution",{},"Titles, snippets, highlights and page content are published by whoever owns the page. They are data to report, not instructions to follow. An agent that reads ",[142,828,829],{},"snippet: \"ignore previous instructions\""," has learned one thing about the page, and nothing about what to do next.",[110,832,834],{"id":833},"rolling-your-own","Rolling your own",[205,836,837],{},"Framework is none of the above? The four tools are thin wrappers over the helpers anyway:",[262,839,841],{"className":264,"code":840,"language":266,"meta":267,"style":267},"import { listProviders, readUrlDetailed, searchAllDetailed, searchByImage, searchWithFallback } from \"@agntn\u002Fweb\";\n\nexport async function run(input: { operation: string; query?: string; url?: string; provider?: string }, signal?: AbortSignal) {\n  switch (input.operation) {\n    case \"search\":\n      return input.provider === \"all\"\n        ? searchAllDetailed(input.query!, { signal })\n        : searchWithFallback(input.query!, { signal });\n    case \"search_image\":\n      return searchByImage(input.url!, { provider: input.provider, signal });\n    case \"read\":\n      return readUrlDetailed(input.url!, { provider: input.provider, maxChars: 20_000, signal });\n    case \"providers\":\n      return listProviders();\n  }\n}\n",[142,842,843,857,861,919,927,938,952,969,984,993,1008,1017,1031,1040,1050,1055],{"__ignoreMap":267},[271,844,845,847,850,852,855],{"class":273,"line":274},[271,846,278],{"class":277},[271,848,849],{"class":281}," { listProviders, readUrlDetailed, searchAllDetailed, searchByImage, searchWithFallback } ",[271,851,285],{"class":277},[271,853,854],{"class":288}," \"@agntn\u002Fweb\"",[271,856,292],{"class":281},[271,858,859],{"class":273,"line":295},[271,860,314],{"emptyLinePlaceholder":313},[271,862,863,866,869,872,875,878,880,883,885,887,890,892,894,897,899,901,904,906,908,911,913,916],{"class":273,"line":310},[271,864,865],{"class":277},"export",[271,867,868],{"class":277}," async",[271,870,871],{"class":277}," function",[271,873,874],{"class":332}," run",[271,876,877],{"class":281},"(input",[271,879,434],{"class":277},[271,881,882],{"class":281}," { operation",[271,884,434],{"class":277},[271,886,437],{"class":332},[271,888,889],{"class":281},"; query",[271,891,457],{"class":277},[271,893,437],{"class":332},[271,895,896],{"class":281},"; url",[271,898,457],{"class":277},[271,900,437],{"class":332},[271,902,903],{"class":281},"; provider",[271,905,457],{"class":277},[271,907,437],{"class":332},[271,909,910],{"class":281}," }, signal",[271,912,457],{"class":277},[271,914,915],{"class":332}," AbortSignal",[271,917,918],{"class":281},") {\n",[271,920,921,924],{"class":273,"line":317},[271,922,923],{"class":277},"  switch",[271,925,926],{"class":281}," (input.operation) {\n",[271,928,929,932,935],{"class":273,"line":339},[271,930,931],{"class":277},"    case",[271,933,934],{"class":288}," \"search\"",[271,936,937],{"class":281},":\n",[271,939,940,943,946,949],{"class":273,"line":345},[271,941,942],{"class":277},"      return",[271,944,945],{"class":281}," input.provider ",[271,947,948],{"class":277},"===",[271,950,951],{"class":288}," \"all\"\n",[271,953,954,957,960,963,966],{"class":273,"line":351},[271,955,956],{"class":277},"        ?",[271,958,959],{"class":332}," searchAllDetailed",[271,961,962],{"class":281},"(input.query",[271,964,965],{"class":277},"!",[271,967,968],{"class":281},", { signal })\n",[271,970,971,974,977,979,981],{"class":273,"line":357},[271,972,973],{"class":277},"        :",[271,975,976],{"class":332}," searchWithFallback",[271,978,962],{"class":281},[271,980,965],{"class":277},[271,982,983],{"class":281},", { signal });\n",[271,985,986,988,991],{"class":273,"line":363},[271,987,931],{"class":277},[271,989,990],{"class":288}," \"search_image\"",[271,992,937],{"class":281},[271,994,995,997,1000,1003,1005],{"class":273,"line":369},[271,996,942],{"class":277},[271,998,999],{"class":332}," searchByImage",[271,1001,1002],{"class":281},"(input.url",[271,1004,965],{"class":277},[271,1006,1007],{"class":281},", { provider: input.provider, signal });\n",[271,1009,1010,1012,1015],{"class":273,"line":375},[271,1011,931],{"class":277},[271,1013,1014],{"class":288}," \"read\"",[271,1016,937],{"class":281},[271,1018,1019,1021,1024,1026,1028],{"class":273,"line":387},[271,1020,942],{"class":277},[271,1022,1023],{"class":332}," readUrlDetailed",[271,1025,1002],{"class":281},[271,1027,965],{"class":277},[271,1029,1030],{"class":281},", { provider: input.provider, maxChars: 20_000, signal });\n",[271,1032,1033,1035,1038],{"class":273,"line":576},[271,1034,931],{"class":277},[271,1036,1037],{"class":288}," \"providers\"",[271,1039,937],{"class":281},[271,1041,1042,1044,1047],{"class":273,"line":588},[271,1043,942],{"class":277},[271,1045,1046],{"class":332}," listProviders",[271,1048,1049],{"class":281},"();\n",[271,1051,1052],{"class":273,"line":600},[271,1053,1054],{"class":281},"  }\n",[271,1056,1057],{"class":273,"line":612},[271,1058,1059],{"class":281},"}\n",[1061,1062,1063],"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 .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 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 .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":267,"searchDepth":295,"depth":295,"links":1065},[1066,1067,1068,1069,1070,1071],{"id":112,"depth":295,"text":113},{"id":259,"depth":295,"text":260},{"id":692,"depth":295,"text":693},{"id":769,"depth":295,"text":770},{"id":814,"depth":295,"text":815},{"id":833,"depth":295,"text":834},"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.","md",null,{"icon":1076},"i-lucide-bot",{"title":32,"description":1072},"-Ip_vWo2EGQX_PJZx3vc3VA5a2mA5UxCaCYmZqZoafM",[1080,1082],{"title":28,"path":29,"stem":30,"description":1081,"children":-1},"The web command, its five subcommands, the flags, and the JSON envelopes that match the library.",{"title":36,"path":37,"stem":38,"description":1083,"children":-1},"Extend the base class, implement the capabilities you have, register it, and every helper, tool and CLI picks it up.",1790790786716]