Après que Nebius a acquis Tavily pour 275 millions de dollars en février 2026, les équipes utilisant TavilySearchResults dans LangChain font face à une incertitude vis-à-vis du fournisseur. Remplacer Tavily par Scavio nécessite une seule classe d'outil personnalisée qui encapsule l'API Scavio dans l'interface Tool de LangChain. L'échange vous offre une recherche multiplateforme (Google, Reddit, YouTube, Amazon) au lieu des résultats web uniquement de Tavily, sans risque d'acquisition.
Prérequis
- Python 3.10+
- langchain et requests installés
- Une clé API Scavio depuis scavio.dev
- Un agent LangChain existant utilisant Tavily
Parcours
Étape 1: Créer l'outil de recherche Scavio pour LangChain
Construisez un outil LangChain personnalisé qui appelle l'API Scavio comme remplacement direct de TavilySearchResults.
import os, requests
from langchain.tools import Tool
API_KEY = os.environ['SCAVIO_API_KEY']
def scavio_search(query: str) -> str:
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY, 'Content-Type': 'application/json'},
json={'query': query, 'country_code': 'us'})
results = resp.json().get('organic_results', [])[:5]
if not results: return 'No results found.'
return '\n\n'.join(f"{r['title']}\n{r.get('snippet', '')}\nURL: {r['link']}" for r in results)
scavio_tool = Tool(name='web_search',
description='Search the web for current information.',
func=scavio_search)Étape 2: Ajoutez des variantes de recherche multiplateforme
Créez des outils Reddit et YouTube que Tavily n'a jamais proposés.
def scavio_reddit(query: str) -> str:
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY, 'Content-Type': 'application/json'},
json={'query': query, 'platform': 'reddit', 'country_code': 'us'})
results = resp.json().get('organic_results', [])[:5]
if not results: return 'No Reddit discussions found.'
return '\n\n'.join(f"{r['title']}\n{r.get('snippet', '')}\nURL: {r['link']}" for r in results)
def scavio_youtube(query: str) -> str:
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY, 'Content-Type': 'application/json'},
json={'query': query, 'platform': 'youtube', 'country_code': 'us'})
results = resp.json().get('organic_results', [])[:5]
if not results: return 'No YouTube videos found.'
return '\n\n'.join(f"{r['title']}\n{r.get('snippet', '')}\nURL: {r['link']}" for r in results)
reddit_tool = Tool(name='reddit_search', description='Search Reddit for discussions.', func=scavio_reddit)
youtube_tool = Tool(name='youtube_search', description='Search YouTube for videos.', func=scavio_youtube)Étape 3: Échangez les outils dans votre agent existant
Remplacez TavilySearchResults par les outils Scavio.
from langchain_openai import ChatOpenAI
from langchain.agents import AgentExecutor, create_tool_calling_agent
from langchain_core.prompts import ChatPromptTemplate
# BEFORE: tools = [TavilySearchResults(max_results=5)]
# AFTER:
tools = [scavio_tool, reddit_tool, youtube_tool]
llm = ChatOpenAI(model='gpt-4o', temperature=0)
prompt = ChatPromptTemplate.from_messages([
('system', 'Use web_search for general queries, reddit_search for opinions, youtube_search for videos.'),
('human', '{input}'),
('placeholder', '{agent_scratchpad}'),
])
agent = create_tool_calling_agent(llm, tools, prompt)
executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
result = executor.invoke({'input': 'What are developers saying about Tavily alternatives?'})
print(result['output'])Étape 4: Testez la migration
Exécutez des requêtes de comparaison pour vérifier la qualité des résultats.
queries = ['best SERP API 2026', 'TikTok API for brands', 'how to build SEO dashboard']
for q in queries:
print(f'\nQuery: {q}')
g = scavio_search(q)
r = scavio_reddit(q)
print(f' Google: {len(g.split(chr(10)+chr(10)))} results')
print(f' Reddit: {len(r.split(chr(10)+chr(10)))} results')
print(f' Cost: $0.01 (2 credits)')Exemple Python
import os, requests
from langchain.tools import Tool
API_KEY = os.environ['SCAVIO_API_KEY']
def search(query, platform='google'):
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY, 'Content-Type': 'application/json'},
json={'query': query, 'platform': platform, 'country_code': 'us'})
results = resp.json().get('organic_results', [])[:5]
return '\n\n'.join(f"{r['title']}\n{r.get('snippet', '')}" for r in results) or 'No results.'
tools = [
Tool(name='web_search', description='Search the web.', func=lambda q: search(q)),
Tool(name='reddit_search', description='Search Reddit.', func=lambda q: search(q, 'reddit')),
]
print(search('tavily alternatives 2026'))Exemple JavaScript
const API_KEY = process.env.SCAVIO_API_KEY;
const H = { 'x-api-key': API_KEY, 'Content-Type': 'application/json' };
async function search(query, platform = 'google') {
const data = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST', headers: H,
body: JSON.stringify({ query, platform, country_code: 'us' })
}).then(r => r.json());
return (data.organic_results || []).slice(0, 5)
.map(r => `${r.title}\n${r.snippet || ''}`).join('\n\n') || 'No results.';
}
async function main() {
console.log(await search('tavily alternatives 2026'));
console.log(await search('tavily alternatives', 'reddit'));
}
main().catch(console.error);Sortie attendue
Query: What are developers saying about Tavily alternatives?
> Calling: reddit_search("Tavily alternatives developer opinions 2026")
Tavily acquired by Nebius - what are you switching to?
Several devs switching to Scavio and Exa...
> Final answer: Developers on Reddit discuss several Tavily alternatives...