ScavioScavio
产品定价文档
登录开始使用
  1. 首页
  2. 教程
  3. 如何构建代理搜索可靠性层
教程

如何构建代理搜索可靠性层

通过断路器、回退、缓存和运行状况监控为代理搜索添加可靠性层。防止代理因搜索中断而失败。

获取免费API密钥API文档

为 AI 代理构建搜索可靠性层,其中包括断路器逻辑、结果缓存、运行状况监控和自动回退行为。当搜索 API 缓慢、速率受限或暂时不可用时,依赖于单个搜索调用而没有错误处理的代理将完全失败。可靠性层将搜索调用与保护逻辑包装在一起,该逻辑在中断期间提供缓存结果,在重复失败后打开断路器,并提供用于监控的运行状况指标。这可以确保代理即使在搜索 API 中断期间也能继续运行。

前置条件

  • 已安装 Python 3.8+
  • 请求已安装库
  • 来自 scavio.dev 的 Scavio API 密钥
  • 使用搜索工具的人工智能代理

操作指南

步骤 1: 构建断路器

实现一个断路器,以防止搜索 API 关闭时发生级联故障。

Python
import os, requests, time, json, hashlib
from datetime import datetime, timedelta

API_KEY = os.environ['SCAVIO_API_KEY']

class CircuitBreaker:
    def __init__(self, failure_threshold: int = 3, reset_timeout: int = 60):
        self.failure_threshold = failure_threshold
        self.reset_timeout = reset_timeout
        self.failures = 0
        self.last_failure = None
        self.state = 'closed'  # closed = normal, open = blocking, half-open = testing

    def can_execute(self) -> bool:
        if self.state == 'closed':
            return True
        if self.state == 'open':
            if self.last_failure and (datetime.now() - self.last_failure).seconds > self.reset_timeout:
                self.state = 'half-open'
                return True
            return False
        return True  # half-open

    def record_success(self):
        self.failures = 0
        self.state = 'closed'

    def record_failure(self):
        self.failures += 1
        self.last_failure = datetime.now()
        if self.failures >= self.failure_threshold:
            self.state = 'open'
            print(f'Circuit OPEN: {self.failures} failures')

breaker = CircuitBreaker()
print(f'Circuit state: {breaker.state}')

步骤 2: 添加结果缓存

缓存搜索结果以在中断期间提供服务并减少冗余 API 调用。

Python
class SearchCache:
    def __init__(self, ttl_seconds: int = 3600):
        self.cache = {}
        self.ttl = ttl_seconds

    def _key(self, query: str, platform: str) -> str:
        return hashlib.md5(f'{platform}:{query}'.encode()).hexdigest()

    def get(self, query: str, platform: str = 'google') -> dict:
        key = self._key(query, platform)
        entry = self.cache.get(key)
        if not entry:
            return None
        age = (datetime.now() - entry['timestamp']).seconds
        if age > self.ttl:
            return None  # Expired
        return entry['data']

    def get_stale(self, query: str, platform: str = 'google') -> dict:
        """Return cached data even if expired (for fallback during outages)."""
        key = self._key(query, platform)
        entry = self.cache.get(key)
        return entry['data'] if entry else None

    def set(self, query: str, platform: str, data: dict):
        key = self._key(query, platform)
        self.cache[key] = {'data': data, 'timestamp': datetime.now()}

    def stats(self) -> dict:
        return {'entries': len(self.cache)}

cache = SearchCache(ttl_seconds=3600)
print(f'Cache initialized: {cache.stats()}')

步骤 3: 构建可靠性包装器

将断路器、缓存和重试逻辑组合到单个可靠的搜索功能中。

Python
class ReliableSearch:
    def __init__(self, api_key: str):
        self.api_key = api_key
        self.breaker = CircuitBreaker(failure_threshold=3, reset_timeout=60)
        self.cache = SearchCache(ttl_seconds=3600)
        self.stats = {'hits': 0, 'misses': 0, 'errors': 0, 'circuit_opens': 0}

    def search(self, query: str, platform: str = 'google') -> dict:
        # Check cache first
        cached = self.cache.get(query, platform)
        if cached:
            self.stats['hits'] += 1
            return cached
        # Check circuit breaker
        if not self.breaker.can_execute():
            stale = self.cache.get_stale(query, platform)
            if stale:
                return {**stale, '_source': 'stale_cache'}
            return {'organic_results': [], '_source': 'circuit_open'}
        # Make the API call
        self.stats['misses'] += 1
        try:
            resp = requests.post('https://api.scavio.dev/api/v1/search',
                headers={'x-api-key': self.api_key},
                json={'platform': platform, 'query': query}, timeout=10)
            if resp.status_code == 429:
                self.breaker.record_failure()
                time.sleep(2)
                return self._fallback(query, platform)
            resp.raise_for_status()
            data = resp.json()
            self.cache.set(query, platform, data)
            self.breaker.record_success()
            data['_source'] = 'live'
            return data
        except Exception as e:
            self.stats['errors'] += 1
            self.breaker.record_failure()
            return self._fallback(query, platform)

    def _fallback(self, query: str, platform: str) -> dict:
        stale = self.cache.get_stale(query, platform)
        if stale:
            return {**stale, '_source': 'fallback_cache'}
        return {'organic_results': [], '_source': 'no_data'}

search = ReliableSearch(API_KEY)
result = search.search('test query')
print(f"Source: {result.get('_source')}, Results: {len(result.get('organic_results', []))}")

步骤 4: 添加健康监测

监控可靠性层的运行状况并公开警报指标。

Python
class HealthMonitor:
    def __init__(self, reliable_search: ReliableSearch):
        self.search = reliable_search
        self.checks = []

    def check(self) -> dict:
        result = {
            'timestamp': datetime.now().isoformat(),
            'circuit_state': self.search.breaker.state,
            'cache_entries': self.search.cache.stats()['entries'],
            'stats': self.search.stats.copy(),
            'healthy': self.search.breaker.state != 'open',
        }
        # Test a live search
        test = self.search.search('health check test')
        result['live_test'] = test.get('_source', 'unknown')
        result['live_results'] = len(test.get('organic_results', []))
        self.checks.append(result)
        return result

    def summary(self) -> str:
        latest = self.check()
        lines = [
            f"Health: {'OK' if latest['healthy'] else 'DEGRADED'}",
            f"Circuit: {latest['circuit_state']}",
            f"Cache: {latest['cache_entries']} entries",
            f"Errors: {latest['stats']['errors']}",
            f"Live test: {latest['live_test']} ({latest['live_results']} results)",
        ]
        return '\n'.join(lines)

monitor = HealthMonitor(search)
print(monitor.summary())

步骤 5: 与代理集成

用可靠性层替换代理中的直接搜索调用。

Python
# Replace direct API calls with ReliableSearch in your agent:

def agent_tool_search(query: str, platform: str = 'google') -> list:
    """Drop-in replacement for agent search tools."""
    result = search.search(query, platform)
    source = result.get('_source', 'unknown')
    results = result.get('organic_results', [])
    # Log the source for debugging
    if source != 'live':
        print(f'Search served from: {source}')
    return [{
        'title': r.get('title', ''),
        'url': r.get('link', ''),
        'snippet': r.get('snippet', ''),
    } for r in results[:5]]

# Test the integration
results = agent_tool_search('AI agent frameworks 2026')
print(f'Results: {len(results)}')
for r in results:
    print(f"  {r['title'][:50]}")

# Show final health
print(f'\n{monitor.summary()}')

Python 示例

Python
import requests, os, time
H = {'x-api-key': os.environ['SCAVIO_API_KEY']}
cache = {}

def reliable_search(query, retries=2):
    if query in cache:
        return cache[query]
    for i in range(retries + 1):
        try:
            r = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
                json={'platform': 'google', 'query': query}, timeout=10)
            data = r.json().get('organic_results', [])
            cache[query] = data
            return data
        except: time.sleep(2 ** i)
    return cache.get(query, [])

print(len(reliable_search('test')))

JavaScript 示例

JavaScript
const H = {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'};
const cache = new Map();
async function reliableSearch(query, retries = 2) {
  if (cache.has(query)) return cache.get(query);
  for (let i = 0; i <= retries; i++) {
    try {
      const r = await fetch('https://api.scavio.dev/api/v1/search', {
        method: 'POST', headers: H,
        body: JSON.stringify({platform: 'google', query})
      });
      const data = (await r.json()).organic_results || [];
      cache.set(query, data);
      return data;
    } catch(e) { await new Promise(r => setTimeout(r, 1000 * 2**i)); }
  }
  return cache.get(query) || [];
}
reliableSearch('test').then(r => console.log(r.length));

预期输出

JSON
A production-grade search reliability layer with circuit breaker, result caching, health monitoring, and automatic fallback that prevents agent failures during search disruptions.

相关教程

  • 如何修复代理无法获取错误
  • 如何修复 Hermes v0.12 搜索 API 回退

常见问题

大多数开发者在15到30分钟内完成本教程。您需要一个Scavio API密钥(免费套餐即可)和可用的Python或JavaScript环境。

已安装 Python 3.8+. 请求已安装库. 来自 scavio.dev 的 Scavio API 密钥. 使用搜索工具的人工智能代理. Scavio API密钥注册即送50个免费积分。

可以。免费套餐注册即送50个积分,完全足够完成本教程并构建一个可运行的原型解决方案。

Scavio提供原生LangChain包(langchain-scavio)、MCP服务器以及适用于任何HTTP客户端的REST API。本教程使用 the raw REST API, 但您可以根据需要适配您选择的框架。

相关资源

Best Of

Google I/O 2026 AI模式变化后最佳搜索API

Read more
Glossary

搜索 API 供应商格局(2026)

Read more
Best Of

2026 年最佳 SERP API 提供商按价格排名

Read more
Glossary

免费搜索API层级对比

Read more
Comparison

Search APIs (Scavio, Tavily, SerpAPI) vs Headless Browser (Playwright, Puppeteer, Browserbase)

Read more
Comparison

Google Places API vs SERP Local Pack API

Read more

开始构建

通过断路器、回退、缓存和运行状况监控为代理搜索添加可靠性层。防止代理因搜索中断而失败。

获取免费API密钥阅读文档
ScavioScavio

面向AI智能体的实时搜索API。搜索所有平台,不仅仅是Google。

产品

  • 功能
  • 定价
  • 控制台
  • 联盟计划

开发者

  • 文档
  • API参考
  • 快速开始
  • MCP集成
  • Python SDK

替代方案

  • Tavily替代方案
  • SerpAPI替代方案
  • Firecrawl替代方案
  • Exa替代方案

工具

  • JSON格式化
  • cURL转代码
  • Token计数器
  • 全部工具

© 2026 Scavio. 保留所有权利。

Featured on TAAFT
服务条款隐私政策