ScavioScavio
产品定价文档
登录开始使用
  1. 首页
  2. 教程
  3. 如何为本地法学硕士构建搜索后备堆栈
教程

如何为本地法学硕士构建搜索后备堆栈

为本地法学硕士建立多提供商搜索后备。首先尝试 Scavio,然后再使用 Brave,然后再尝试 Tavily。永远不会因为一次中断而失去搜索基础。

获取免费API密钥API文档

本地法学硕士依赖单一搜索提供商会导致单点故障。当该提供商出现故障或达到速率限制时,您的代理将完全失去网络基础。本教程构建一个搜索回退堆栈,首先尝试 Scavio($0.005/查询),回退到 Brave Search($0.005/查询),然后再尝试 Tavily($0.008/credit)(如果两者都不可用)。该堆栈将响应标准化为通用格式,以便您的 LLM 看到一致的数据,无论哪个提供者响应。

前置条件

  • 已安装 Python 3.9+
  • 请求已安装库
  • Scavio、Brave Search 和 Tavily 的 API 密钥
  • 本地 LLM 设置(Ollama、llama.cpp 或 vLLM)

操作指南

步骤 1: 定义提供者接口

创建每个搜索提供商都实现的通用接口。所有提供者返回相同的标准化结果格式。

Python
import os, requests, time
from typing import Optional

SCAVIO_KEY = os.environ.get('SCAVIO_API_KEY', '')
BRAVE_KEY = os.environ.get('BRAVE_API_KEY', '')
TAVILY_KEY = os.environ.get('TAVILY_API_KEY', '')

def normalize_result(title: str, url: str, snippet: str, source: str) -> dict:
    return {'title': title, 'url': url, 'snippet': snippet, 'source': source}

步骤 2: 实施每个搜索提供商

为每个返回标准化结果的提供者编写一个搜索函数。每个函数都会处理自己的错误并在失败时返回 None 。

Python
def search_scavio(query: str, num: int = 5) -> Optional[list]:
    try:
        resp = requests.post('https://api.scavio.dev/api/v1/search',
            headers={'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json'},
            json={'query': query, 'country_code': 'us', 'num_results': num}, timeout=10)
        resp.raise_for_status()
        return [normalize_result(r['title'], r['link'], r.get('snippet', ''), 'scavio')
                for r in resp.json().get('organic_results', [])]
    except Exception as e:
        print(f'Scavio failed: {e}')
        return None

def search_brave(query: str, num: int = 5) -> Optional[list]:
    try:
        resp = requests.get('https://api.search.brave.com/res/v1/web/search',
            headers={'X-Subscription-Token': BRAVE_KEY, 'Accept': 'application/json'},
            params={'q': query, 'count': num}, timeout=10)
        resp.raise_for_status()
        return [normalize_result(r['title'], r['url'], r.get('description', ''), 'brave')
                for r in resp.json().get('web', {}).get('results', [])]
    except Exception as e:
        print(f'Brave failed: {e}')
        return None

def search_tavily(query: str, num: int = 5) -> Optional[list]:
    try:
        resp = requests.post('https://api.tavily.com/search',
            json={'api_key': TAVILY_KEY, 'query': query, 'max_results': num}, timeout=10)
        resp.raise_for_status()
        return [normalize_result(r['title'], r['url'], r.get('content', ''), 'tavily')
                for r in resp.json().get('results', [])]
    except Exception as e:
        print(f'Tavily failed: {e}')
        return None

步骤 3: 构建后备堆栈

连锁供应商按优先顺序排列。第一个返回结果的提供商获胜。记录哪个提供商服务了请求。

Python
PROVIDERS = [
    ('scavio', search_scavio, 0.005),
    ('brave', search_brave, 0.005),
    ('tavily', search_tavily, 0.008),
]

def search_with_fallback(query: str, num: int = 5) -> dict:
    for name, fn, cost in PROVIDERS:
        results = fn(query, num)
        if results is not None:
            return {'results': results, 'provider': name, 'cost': cost, 'query': query}
    return {'results': [], 'provider': 'none', 'cost': 0, 'query': query}

# Test the fallback
result = search_with_fallback('best python web frameworks 2026')
print(f'Provider: {result["provider"]} (${result["cost"]}/query)')
for r in result['results'][:3]:
    print(f'  {r["title"]}')
    print(f'  {r["url"]}')

步骤 4: 与您当地的法学硕士整合

使用后备搜索作为本地法学硕士的工具。法学硕士永远不需要知道哪个提供商做出了回应。

Python
def format_for_llm(search_result: dict) -> str:
    lines = [f'Web search results for: {search_result["query"]}\n']
    for i, r in enumerate(search_result['results'], 1):
        lines.append(f'[{i}] {r["title"]}')
        lines.append(f'    URL: {r["url"]}')
        lines.append(f'    {r["snippet"]}')
        lines.append('')
    return '\n'.join(lines)

result = search_with_fallback('latest AI frameworks 2026')
formatted = format_for_llm(result)
print(formatted)
print(f'\n--- Served by: {result["provider"]} at ${result["cost"]}/query ---')

Python 示例

Python
import os, requests
from typing import Optional

SCAVIO_KEY = os.environ.get('SCAVIO_API_KEY', '')
BRAVE_KEY = os.environ.get('BRAVE_API_KEY', '')

def search_scavio(query, num=5):
    try:
        resp = requests.post('https://api.scavio.dev/api/v1/search',
            headers={'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json'},
            json={'query': query, 'country_code': 'us', 'num_results': num}, timeout=10)
        resp.raise_for_status()
        return [{'title': r['title'], 'url': r['link'], 'snippet': r.get('snippet', '')}
                for r in resp.json().get('organic_results', [])]
    except: return None

def search_brave(query, num=5):
    try:
        resp = requests.get('https://api.search.brave.com/res/v1/web/search',
            headers={'X-Subscription-Token': BRAVE_KEY},
            params={'q': query, 'count': num}, timeout=10)
        resp.raise_for_status()
        return [{'title': r['title'], 'url': r['url'], 'snippet': r.get('description', '')}
                for r in resp.json().get('web', {}).get('results', [])]
    except: return None

def search(query):
    for name, fn in [('scavio', search_scavio), ('brave', search_brave)]:
        results = fn(query)
        if results:
            print(f'Served by {name}')
            return results
    return []

for r in search('python web frameworks 2026')[:3]:
    print(f'  {r["title"]}')

JavaScript 示例

JavaScript
const SCAVIO_KEY = process.env.SCAVIO_API_KEY;
const BRAVE_KEY = process.env.BRAVE_API_KEY;

async function searchScavio(query) {
  try {
    const resp = await fetch('https://api.scavio.dev/api/v1/search', {
      method: 'POST',
      headers: { 'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json' },
      body: JSON.stringify({ query, country_code: 'us', num_results: 5 })
    });
    const data = await resp.json();
    return (data.organic_results || []).map(r => ({ title: r.title, url: r.link, snippet: r.snippet || '' }));
  } catch { return null; }
}

async function searchBrave(query) {
  try {
    const resp = await fetch(`https://api.search.brave.com/res/v1/web/search?q=${encodeURIComponent(query)}&count=5`, {
      headers: { 'X-Subscription-Token': BRAVE_KEY, Accept: 'application/json' }
    });
    const data = await resp.json();
    return (data.web?.results || []).map(r => ({ title: r.title, url: r.url, snippet: r.description || '' }));
  } catch { return null; }
}

async function search(query) {
  for (const [name, fn] of [['scavio', searchScavio], ['brave', searchBrave]]) {
    const results = await fn(query);
    if (results) { console.log(`Served by ${name}`); return results; }
  }
  return [];
}

search('AI frameworks 2026').then(r => r.slice(0, 3).forEach(x => console.log(x.title)));

预期输出

JSON
Provider: scavio ($0.005/query)
  FastAPI 1.0: The Modern Python Web Framework
  https://fastapi.tiangolo.com/release-notes/
  Django 6.0 Features and Migration Guide
  https://docs.djangoproject.com/en/6.0/

--- Served by: scavio at $0.005/query ---

相关教程

  • Google CSE 关闭后如何向 Ollama 添加搜索
  • 如何将 Scavio MCP 连接到本地法学硕士

常见问题

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

已安装 Python 3.9+. 请求已安装库. Scavio、Brave Search 和 Tavily 的 API 密钥. 本地 LLM 设置(Ollama、llama.cpp 或 vLLM). Scavio API密钥注册即送50个免费积分。

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

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

相关资源

Best Of

2026年本地LLM接地最佳搜索API

Read more
Best Of

2026年5月本地LLM个人知识库工具推荐

Read more
Use Case

OpenSEO 搭配 Scavio 数据后端

Read more
Workflow

每日本地法学硕士搜索接地管道

Read more
Glossary

通过搜索 API 的 LLM Grounding

Read more
Glossary

LLM 流量取代

Read more

开始构建

为本地法学硕士建立多提供商搜索后备。首先尝试 Scavio,然后再使用 Brave,然后再尝试 Tavily。永远不会因为一次中断而失去搜索基础。

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

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

产品

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

开发者

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

替代方案

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

工具

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

© 2026 Scavio. 保留所有权利。

Featured on TAAFT
服务条款隐私政策