The Problem
Every agent framework (LangChain, CrewAI, AutoGen, LangGraph) needs search tools defined differently. Developers write the same search logic four times with different wrapper signatures, and each wrapper has its own bugs.
The Scavio Solution
Write one core search function that calls Scavio, then wrap it with thin adapters for each framework. The core function handles auth, error handling, and result normalization. Framework adapters are 3-5 lines each.
Before
Four different search tool implementations across four agent frameworks. Bug in result parsing exists in two of them but not the other two.
After
One core search function with four thin wrappers. Fix a bug once, all frameworks get the fix.
Who It Is For
Developers building AI agents across multiple frameworks who want a single, reliable search tool that works everywhere.
Key Benefits
- One search function serves all agent frameworks
- Thin adapters for LangChain, CrewAI, AutoGen, LangGraph
- Centralized error handling and retry logic
- Consistent result format across all agents
- Add new frameworks with 3-5 lines of adapter code
Python Example
import requests, os
from typing import Optional
API_KEY = os.environ["SCAVIO_API_KEY"]
def core_search(query: str, platform: str = "google", limit: int = 10) -> dict:
"""Core search function. All framework adapters call this."""
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"},
timeout=15,
)
if resp.status_code != 200:
return {"error": f"HTTP {resp.status_code}", "results": []}
data = resp.json()
return {
"results": [
{"title": r.get("title", ""), "url": r.get("link", ""), "snippet": r.get("snippet", "")}
for r in data.get("organic_results", [])[:limit]
]
}
# LangChain adapter
def langchain_search(query: str) -> str:
results = core_search(query)
return "\n".join(f"{r['title']}: {r['snippet']}" for r in results["results"])
# CrewAI adapter
def crewai_search(query: str) -> str:
return langchain_search(query) # Same string format works
# AutoGen adapter
def autogen_search(query: str) -> dict:
return core_search(query) # AutoGen prefers dict
print(langchain_search("python web frameworks 2026"))JavaScript Example
const H = {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'};
async function coreSearch(query, platform='google', limit=10) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {method:'POST', headers:H, body:JSON.stringify({query, platform, country_code:'us'})});
const d = await r.json();
return {results:(d.organic_results||[]).slice(0,limit).map(r=>({title:r.title, url:r.link, snippet:r.snippet}))};
}
// Framework adapters
const langchainSearch = async (q) => (await coreSearch(q)).results.map(r=>r.title+': '+r.snippet).join('\n');
const result = await langchainSearch('python web frameworks 2026');
console.log(result);Platforms Used
Web search with knowledge graph, PAA, and AI overviews
YouTube
Video search with transcripts and metadata
Community, posts & threaded comments from any subreddit
Amazon
Product search with prices, ratings, and reviews