Web Search
Web Search
Web search capabilities with Connector-based authentication. Supports multiple providers: Serper, Brave, Tavily, and RapidAPI.
Quick Start
import { Connector, SearchProvider, Services } from 'oneringai';
// Create search connector
Connector.create({
name: 'serper-main',
serviceType: Services.Serper,
auth: { type: 'api_key', apiKey: process.env.SERPER_API_KEY! },
baseURL: 'https://google.serper.dev',
});
// Create search provider
const search = SearchProvider.create({ connector: 'serper-main' });
// Perform search
const results = await search.search('latest AI developments 2026', {
numResults: 10,
country: 'us',
language: 'en',
});
if (results.success) {
console.log(`Found ${results.count} results:`);
results.results.forEach((result, i) => {
console.log(`${i + 1}. ${result.title}`);
console.log(` ${result.url}`);
console.log(` ${result.snippet}\n`);
});
}
Search Providers
Serper (Google Search)
Fast Google search results via Serper.dev API:
Connector.create({
name: 'serper-main',
serviceType: Services.Serper,
auth: { type: 'api_key', apiKey: process.env.SERPER_API_KEY! },
baseURL: 'https://google.serper.dev',
});
const search = SearchProvider.create({ connector: 'serper-main' });
const results = await search.search('query', {
numResults: 10,
country: 'us',
language: 'en',
});
Features:
- Fast (1-2 second response time)
- Provider plans and quotas are independent; check your account terms
- Google search quality
- Up to 100 results per query
Brave Search
Independent search index (privacy-focused):
Connector.create({
name: 'brave-main',
serviceType: Services.BraveSearch,
auth: { type: 'api_key', apiKey: process.env.BRAVE_API_KEY! },
baseURL: 'https://api.search.brave.com/res/v1',
});
const search = SearchProvider.create({ connector: 'brave-main' });
const results = await search.search('query', {
numResults: 10,
});
Features:
- Privacy-focused (no Google)
- Independent search index
- Provider plans and quotas are independent; check your account terms
- Up to 20 results per query
Tavily
AI-optimized search with summaries:
Connector.create({
name: 'tavily-main',
serviceType: Services.Tavily,
auth: { type: 'api_key', apiKey: process.env.TAVILY_API_KEY! },
baseURL: 'https://api.tavily.com',
});
const search = SearchProvider.create({ connector: 'tavily-main' });
const results = await search.search('query', {
numResults: 10,
vendorOptions: {
search_depth: 'advanced', // 'basic' or 'advanced'
include_answer: true,
include_raw_content: false,
},
});
Features:
- AI-optimized for LLMs
- Includes summaries
- Provider plans and quotas are independent; check your account terms
- Up to 20 results per query
RapidAPI
Real-time web search via RapidAPI:
Connector.create({
name: 'rapidapi-search',
serviceType: Services.RapidapiSearch,
auth: { type: 'api_key', apiKey: process.env.RAPIDAPI_KEY! },
baseURL: 'https://real-time-web-search.p.rapidapi.com',
});
const search = SearchProvider.create({ connector: 'rapidapi-search' });
const results = await search.search('query', {
numResults: 50,
country: 'us',
language: 'en',
vendorOptions: {
start: 0, // Pagination offset
fetch_ai_overviews: false,
deduplicate: false,
nfpr: 0, // No auto-correct
tbs: 'qdr:d', // Time-based search (d=day, w=week, m=month, y=year)
location: 'New York', // Search origin
},
});
Features:
- Real-time web results
- Up to 100 results per query
- Advanced filtering options
- Various pricing plans
Using with Agent (ConnectorTools)
Search tools are registered via ConnectorTools. Create a connector, then get the tools:
import { Agent, Connector, ConnectorTools, tools } from 'oneringai';
// Create a search connector
Connector.create({
name: 'serper',
serviceType: 'serper',
auth: { type: 'api_key', apiKey: process.env.SERPER_API_KEY! },
baseURL: 'https://google.serper.dev',
});
// Get search tools from the connector
const searchTools = ConnectorTools.for('serper');
const agent = Agent.create({
connector: 'openai',
model: 'gpt-4.1',
tools: [tools.webFetch, ...searchTools],
});
const response = await agent.run(
'Search for the latest AI news from 2026 and summarize the top 3 results'
);
Tool Parameters:
query(required) - Search query stringnumResults- Number of results (default: 10, max: 100)country- Country/region code (e.g., 'us', 'gb')language- Language code (e.g., 'en', 'fr')
Note: Tools are prefixed with the connector name (e.g., serper_web_search).
Multiple Keys (Failover)
Support for backup keys:
// Main connector
Connector.create({
name: 'serper-main',
serviceType: Services.Serper,
auth: { type: 'api_key', apiKey: process.env.SERPER_API_KEY_MAIN! },
baseURL: 'https://google.serper.dev',
});
// Backup connector
Connector.create({
name: 'serper-backup',
serviceType: Services.Serper,
auth: { type: 'api_key', apiKey: process.env.SERPER_API_KEY_BACKUP! },
baseURL: 'https://google.serper.dev',
});
// Use with failover
try {
const search = SearchProvider.create({ connector: 'serper-main' });
const results = await search.search('query');
} catch (error) {
console.log('Main failed, trying backup...');
const backup = SearchProvider.create({ connector: 'serper-backup' });
const results = await backup.search('query');
}
Enterprise Resilience
All Connector features automatically apply:
Connector.create({
name: 'serper-main',
serviceType: Services.Serper,
auth: { type: 'api_key', apiKey: process.env.SERPER_API_KEY! },
baseURL: 'https://google.serper.dev',
// Resilience features
timeout: 30000, // 30 second timeout
retry: {
maxRetries: 3,
baseDelayMs: 1000,
maxDelayMs: 30000,
retryableStatuses: [429, 500, 502, 503, 504],
},
circuitBreaker: {
enabled: true,
failureThreshold: 5,
resetTimeoutMs: 60000,
},
});
const search = SearchProvider.create({ connector: 'serper-main' });
// Automatically includes retry, circuit breaker, and timeout!
const results = await search.search('query');
Metrics and Monitoring
const connector = Connector.get('serper-main');
// Get metrics
const metrics = connector.getMetrics();
console.log(`Requests: ${metrics.requestCount}`);
console.log(`Success rate: ${((metrics.successCount / metrics.requestCount) * 100).toFixed(1)}%`);
console.log(`Avg latency: ${metrics.avgLatencyMs.toFixed(0)}ms`);
// Circuit breaker state
const cbState = metrics.circuitBreakerState;
console.log(`Circuit breaker: ${cbState}`); // 'closed' | 'open' | 'half-open'
Best Practices
- Use Connectors - Preferred over environment variables
- Setup Backup Keys - For production resilience
- Monitor Metrics - Track usage and performance
- Cache Results - Reduce API costs by caching
- Handle Errors - Always check
results.success - Respect Rate Limits - Each provider has different limits
Error Handling
const results = await search.search('query');
if (!results.success) {
console.error('Search failed:', results.error);
// Check error type
if (results.error?.includes('API key')) {
console.error('Authentication failed - check API key');
} else if (results.error?.includes('429')) {
console.error('Rate limit exceeded - try backup connector');
} else if (results.error?.includes('timeout')) {
console.error('Request timed out - increase timeout setting');
}
} else {
console.log(`Success: ${results.count} results`);
}