| name | exa-migration-deep-dive |
| description | Migrate from other search APIs (Google, Bing, Tavily, Serper) to Exa neural search.
Use when switching to Exa from another search provider, migrating search pipelines,
or evaluating Exa as a replacement for traditional search APIs.
Trigger with phrases like "migrate to exa", "switch to exa", "replace google search with exa",
"exa vs tavily", "exa migration", "move to exa".
|
| allowed-tools | Read, Write, Edit, Bash(npm:*), Bash(node:*) |
| version | 1.11.0 |
| license | MIT |
| author | Jeremy Longshore <jeremy@intentsolutions.io> |
| tags | ["saas","exa","migration"] |
| compatibility | Designed for Claude Code, also compatible with Codex and OpenClaw |
Exa Migration Deep Dive
Current State
!npm list exa-js 2>/dev/null | grep exa-js || echo 'exa-js not installed'
!npm list 2>/dev/null | grep -E '(google|bing|tavily|serper|serpapi)' || echo 'No competing search SDK found'
Overview
Migrate from traditional search APIs (Google Custom Search, Bing Web Search, Tavily, Serper) to Exa's neural search API. Key differences: Exa uses semantic/neural search instead of keyword matching, returns content (text/highlights/summary) in a single API call, and supports similarity search from a seed URL.
API Comparison
| Feature | Google/Bing | Tavily | Exa |
|---|
| Search model | Keyword | AI-enhanced | Neural embeddings |
| Content in results | Snippets only | Full text | Text + highlights + summary |
| Similarity search | No | No | findSimilar() by URL |
| AI answer | No | Yes | answer() + streamAnswer() |
| Categories | No | No | company, news, research paper, tweet, people |
| Date filtering | Limited | Yes | startPublishedDate / endPublishedDate |
| Domain filtering | Yes | Yes | includeDomains / excludeDomains (up to 1200) |
Instructions
Step 1: Install Exa SDK
set -euo pipefail
npm install exa-js
Step 2: Create Adapter Layer
import Exa from "exa-js";
interface {
: ;
: ;
: ;
?: ;
?: ;
}
{
: [];
: ;
}
{
: ;
() {
. = (apiKey);
}
(: , numResults = ): <> {
response = ..(query, {
: ,
numResults,
: { : },
: { : , query },
});
{
query,
: response..( ({
: r. || ,
: r.,
: r.?.() || r.?.(, ) || ,
: r.,
: r. || ,
})),
};
}
(: , numResults = ): <> {
response = ..(url, {
numResults,
: { : },
: ,
});
{
: url,
: response..( ({
: r. || ,
: r.,
: r.?.(, ) || ,
: r.,
})),
};
}
}