2026 年 2 月 Nebius 以 2.75 亿美元收购 Tavily 后,在 LangChain 中使用 TavilySearchResults 的团队面临供应商的不确定性。用 Scavio 替换 Tavily 需要一个自定义工具类,该工具类将 Scavio API 包装在 LangChain 的 Tool 接口中。此次交换为您提供多平台搜索(Google、Reddit、YouTube、亚马逊),而不是 Tavily 的纯网络结果,且没有收购风险。
前置条件
- Python 3.10+
- langchain 和请求已安装
- 来自 scavio.dev 的 Scavio API 密钥
- 使用 Tavily 的现有 LangChain 代理
操作指南
步骤 1: 为LangChain创建Scadio搜索工具
构建一个自定义 LangChain 工具,调用 Scavio API 作为 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)步骤 2: 添加多平台搜索变体
创建 Tavilly 从未提供过的 Reddit 和 YouTube 工具。
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)步骤 3: 交换现有代理中的工具
将 TavilySearchResults 替换为 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'])步骤 4: 测试迁移
运行比较查询以验证结果质量。
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)')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'))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);预期输出
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...