Sign inConnect your agent
infochanged

AI Search - Use AI Search with the Agents SDK, AI SDK, and LangChain

Announced
Tags
AI-Search
Severity
info, set by reef/rss-rule-v1
Source
https://developers.cloudflare.com/changelog/post/2026-07-30-ai-search-agent-sdks/

<p>You can now use <a href="https://developers.cloudflare.com/ai-search/">AI Search</a> directly from popular agent frameworks, adding grounded retrieval to an existing app instead of calling the REST API by hand. The new <a href="https://developers.cloudflare.com/ai-search/agent-sdks/">Agents</a> section has guides for the <a href="https://developers.cloudflare.com/ai-search/agent-sdks/ai-sdk/">Vercel AI SDK</a>, <a href="https://developers.cloudflare.com/ai-search/agent-sdks/langchain/">LangChain</a>, and the <a href="https://developers.cloudflare.com/ai-search/agent-sdks/agents-sdk/">Cloudflare Agents SDK</a>. The AI SDK integration is a new package, and the LangChain integration is a new retriever in the existing <code>langchain-cloudflare</code> package.</p> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="vercel-ai-sdk">Vercel AI SDK</h4><a class="anchor-link" href="#vercel-ai-sdk"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <a href="https://www.npmjs.com/package/ai-search-provider" target="_blank" rel="noopener"><code>ai-search-provider</code><span class="external-link"> ↗︎</span></a> package connects AI Search to the AI SDK, and targets AI SDK v6 (<code>ai@^6</code>). Pass <code>instance.chat()</code> to <code>generateText</code> or <code>streamText</code> to generate a response grounded in your indexed content, with the retrieved chunks returned as <code>sources</code>. You can also expose <code>instance.search()</code> as a tool for agent loops.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { createAISearchNamespace } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "ai-search-provider"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { generateText } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "ai"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> aiSearch</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> createAISearchNamespace</span><span class="nb-shiki-140thh">({ binding: env.</span><span class="nb-shiki-dzsirb">AI_SEARCH</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-140thh"> { </span><span class="nb-shiki-dzsirb">text</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">sources</span><span class="nb-shiki-140thh"> } </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> generateText</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> model: aiSearch.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"knowledge-base"</span><span class="nb-shiki-140thh">).</span><span class="nb-shiki-1t8gfj">chat</span><span class="nb-shiki-140thh">(),</span></span> <span class="line"><span class="nb-shiki-140thh"> messages: [{ role: </span><span class="nb-shiki-mdbnqw">"user"</span><span class="nb-shiki-140thh">, content: </span><span class="nb-shiki-mdbnqw">"How does caching work?"</span><span class="nb-shiki-140thh"> }],</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { createAISearchNamespace } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "ai-search-provider"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { generateText } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "ai"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> aiSearch</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> createAISearchNamespace</span><span class="nb-shiki-140thh">({ binding: env.</span><span class="nb-shiki-dzsirb">AI_SEARCH</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-140thh"> { </span><span class="nb-shiki-dzsirb">text</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-dzsirb">sources</span><span class="nb-shiki-140thh"> } </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> generateText</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> model: aiSearch.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"knowledge-base"</span><span class="nb-shiki-140thh">).</span><span class="nb-shiki-1t8gfj">chat</span><span class="nb-shiki-140thh">(),</span></span> <span class="line"><span class="nb-shiki-140thh"> messages: [{ role: </span><span class="nb-shiki-mdbnqw">"user"</span><span class="nb-shiki-140thh">, content: </span><span class="nb-shiki-mdbnqw">"How does caching work?"</span><span class="nb-shiki-140thh"> }],</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="langchain">LangChain</h4><a class="anchor-link" href="#langchain"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <code>langchain-cloudflare</code> package (<a href="https://pypi.org/project/langchain-cloudflare/" target="_blank" rel="noopener">PyPI<span class="external-link"> ↗︎</span></a>, <a href="https://github.com/cloudflare/langchain-cloudflare" target="_blank" rel="noopener">GitHub<span class="external-link"> ↗︎</span></a>) provides <code>CloudflareAISearchRetriever</code>, a standard LangChain retriever backed by AI Search. Use it on its own, wrap it with <code>create_retriever_tool</code> to give an agent a search tool, or drop it into a RAG chain. It works with REST credentials or a Worker binding inside a Python Worker.</p> <figure class="nb-code-figure" data-nb-lang="python"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="python" data-nb-lang="python"><code><span class="line"><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-140thh"> langchain_cloudflare </span><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> CloudflareAISearchRetriever</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">retriever </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-140thh"> CloudflareAISearchRetriever(</span></span> <span class="line"><span class="nb-shiki-1jdh33"> account_id</span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-dzsirb">ACCOUNT_ID</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-1jdh33"> api_token</span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-dzsirb">API_TOKEN</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-1jdh33"> instance_name</span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-mdbnqw">"knowledge-base"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-1jdh33"> retrieval_type</span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-mdbnqw">"hybrid"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh">)</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh">docs </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-140thh"> retriever.invoke(</span><span class="nb-shiki-mdbnqw">"How do I configure Workers AI?"</span><span class="nb-shiki-140thh">)</span></span></code></pre></figure> <div tabindex="-1" class="heading-wrapper level-h4"><h4 id="cloudflare-agents-sdk">Cloudflare Agents SDK</h4><a class="anchor-link" href="#cloudflare-agents-sdk"><span aria-hidden="true" class="anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span></a></div> <p>The <a href="https://developers.cloudflare.com/agents/">Cloudflare Agents SDK</a> could already reach AI Search through the Workers binding. The new <a href="https://developers.cloudflare.com/ai-search/agent-sdks/agents-sdk/">guide</a> walks through building a stateful chat agent that provisions its own instance, indexes content, and searches it from a tool.</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { tool } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "ai"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { z } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "zod"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> instance</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">AI_SEARCH</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"knowledge-base"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Expose AI Search to the agent's model as a tool it can call.</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> searchKnowledgeBase</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> tool</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> description: </span><span class="nb-shiki-mdbnqw">"Search the knowledge base for relevant content."</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> inputSchema: z.</span><span class="nb-shiki-1t8gfj">object</span><span class="nb-shiki-140thh">({ query: z.</span><span class="nb-shiki-1t8gfj">string</span><span class="nb-shiki-140thh">() }),</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> execute</span><span class="nb-shiki-140thh">: ({ </span><span class="nb-shiki-1jdh33">query</span><span class="nb-shiki-140thh"> }) </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> instance.</span><span class="nb-shiki-1t8gfj">search</span><span class="nb-shiki-140thh">({ query }),</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { tool } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "ai"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { z } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "zod"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> instance</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">AI_SEARCH</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"knowledge-base"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd">// Expose AI Search to the agent's model as a tool it can call.</span></span> <span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> searchKnowledgeBase</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1t8gfj"> tool</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> description: </span><span class="nb-shiki-mdbnqw">"Search the knowledge base for relevant content."</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> inputSchema: z.</span><span class="nb-shiki-1t8gfj">object</span><span class="nb-shiki-140thh">({ query: z.</span><span class="nb-shiki-1t8gfj">string</span><span class="nb-shiki-140thh">() }),</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> execute</span><span class="nb-shiki-140thh">: ({ </span><span class="nb-shiki-1jdh33">query</span><span class="nb-shiki-140thh"> }) </span><span class="nb-shiki-1itgoe">=&gt;</span><span class="nb-shiki-140thh"> instance.</span><span class="nb-shiki-1t8gfj">search</span><span class="nb-shiki-140thh">({ query }),</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span></code></pre></figure></div></div></div></div> <p>For the full walkthroughs, including creating an instance and indexing content, refer to the <a href="https://developers.cloudflare.com/ai-search/agent-sdks/">Agents</a> guides.</p>

The text above is the source's. reef added the severity, the dates it could read from the text, and the endpoints and scopes named in code.