Replace Brave Search in an existing AI agent by updating the tool definition to call Scavio's POST endpoint instead of Brave's GET endpoint, then adjusting the response parser for Scavio's JSON structure. Most agent frameworks (LangChain, CrewAI, custom) use a tool wrapper pattern where the search provider is a single function. Changing that function is the only modification needed. Scavio adds Amazon, YouTube, Reddit, and Walmart search on top of Google, giving the agent more data sources through one API key. This tutorial covers the replacement for the three most common agent patterns.
Prerequisites
- An existing agent using Brave Search as a tool
- Python 3.8+ installed
- requests library installed
- A Scavio API key from scavio.dev
Walkthrough
Step 1: Identify the Brave Search call site
Find where your agent calls Brave Search. It is typically a function that takes a query string and returns results.
# Common patterns to look for in your codebase:
# Pattern 1: Direct HTTP call
# requests.get('https://api.search.brave.com/res/v1/web/search', ...)
#
# Pattern 2: LangChain BraveSearchWrapper
# from langchain_community.tools import BraveSearch
#
# Pattern 3: Custom tool function
# def web_search(query): ...
# Replacement for all patterns:
import requests, os
def scavio_search(query: str, platform: str = 'google') -> list:
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': os.environ['SCAVIO_API_KEY']},
json={'platform': platform, 'query': query}, timeout=10)
resp.raise_for_status()
return resp.json().get('organic_results', [])Step 2: Create the Brave-compatible wrapper
Build a wrapper that matches Brave's output format so downstream code does not need changes.
def brave_compatible_wrapper(query: str) -> str:
"""Returns results in the same string format Brave Search tools use."""
results = scavio_search(query)
output_parts = []
for r in results[:5]:
output_parts.append(f"Title: {r.get('title', '')}")
output_parts.append(f"URL: {r.get('link', '')}")
output_parts.append(f"Description: {r.get('snippet', '')}")
output_parts.append('')
return '\n'.join(output_parts)
# Test the wrapper:
print(brave_compatible_wrapper('best crm for startups 2026'))Step 3: Replace in your agent framework
Swap the tool definition in your agent. Here are examples for custom agents and LangChain-style agents.
# Custom agent - just replace the function:
# BEFORE:
# tools = [{'name': 'web_search', 'function': brave_search}]
# AFTER:
tools = [{'name': 'web_search', 'function': brave_compatible_wrapper}]
# LangChain-style replacement:
from typing import Optional
class ScavioSearchTool:
name = 'web_search'
description = 'Search the web for current information'
def run(self, query: str) -> str:
return brave_compatible_wrapper(query)
async def arun(self, query: str) -> str:
return self.run(query)
# Replace: tools = [BraveSearch(api_key=...)]
# With:
tool = ScavioSearchTool()
print(tool.run('python web frameworks 2026'))Step 4: Verify the replacement
Run your agent with a test query and compare the output quality to ensure the replacement works correctly.
def verify_replacement():
test_queries = [
'latest python release 2026',
'best project management tools',
'react server components tutorial',
]
for q in test_queries:
results = scavio_search(q)
assert len(results) > 0, f'No results for: {q}'
assert results[0].get('title'), f'Missing title for: {q}'
assert results[0].get('link', '').startswith('http'), f'Invalid URL for: {q}'
print(f'{q}: {len(results)} results, first: {results[0]["title"][:50]}')
print('All checks passed')
verify_replacement()Python Example
import requests, os
H = {'x-api-key': os.environ['SCAVIO_API_KEY']}
def scavio_search(query):
data = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'platform': 'google', 'query': query}).json()
return data.get('organic_results', [])
# Drop-in replacement for brave_search(query):
def web_search_tool(query):
results = scavio_search(query)
return '\n'.join(f"{r['title']}: {r.get('snippet', '')}" for r in results[:5])
print(web_search_tool('best crm 2026'))JavaScript Example
const H = {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'};
async function scavioSearch(query) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST', headers: H, body: JSON.stringify({platform: 'google', query})
});
return (await r.json()).organic_results || [];
}
// Drop-in replacement for braveSearch(query):
async function webSearchTool(query) {
const results = await scavioSearch(query);
return results.slice(0, 5).map(r => `${r.title}: ${r.snippet || ''}`).join('\n');
}
webSearchTool('best crm 2026').then(console.log);Expected Output
An agent with Brave Search replaced by Scavio, using a compatibility wrapper that preserves the existing tool interface and output format.