🤖HermesBlog
Hermes 功能详解 · 第47篇2026/8/9· Easy Understand Hermes Agent

第47篇:网络搜索与提取

Hermes 功能详解第47篇:Web Search & Extract。联网搜索、抓取网页。

这篇讲的是如何让 Hermes Agent 学会“上网冲浪”——既能搜索信息,又能抓取网页内容,而且全程不需要你手动复制粘贴。

网络搜索与提取:AI 的眼睛

两个核心技能

想象一下,Hermes Agent 是个能干的助手,它有两项看家本领:

  • web_search(搜索):像打开百度/Google 一样,输入关键词,返回排名结果。
  • web_extract(提取):像打开某个网页并“阅读全文”,把正文内容抓取下来。

这两项技能背后有多个“服务商”可选,就像你可以用 Chrome、Firefox 或 Safari 上网一样。默认推荐 Firecrawl(免费额度每月 500 次),如果你有 Nous Portal 付费订阅,甚至可以通过 Tool Gateway 以托管网络搜索的形式免密钥使用。

什么都不配也能用? 是的。全新安装、没有任何网络凭证时,web_search 和 web_extract 也能开箱即用:请求会在 Exa、Parallel、Firecrawl、Keenable 这几家的公共免费额度之间轮询,把负载摊匀;遇到限流会自动换到环里的下一家重试(多跳,直到有一家能服务或者全部失败)。某家服务商直接拒绝的搜索(401/402/403 访问门禁或 5xx)也会照同样的方式重试。不用注册、不用密钥。这一层是“最后的兜底”——只要你配置了后端或填了任意 API 密钥,就会优先走你自己的配置。请求里不带任何用户标识(只有一个进程内随机 session id,重启就换)。想要稳定不限流的服务,还是配一个带密钥的服务商。想彻底关掉它,设置 web.keyless_fallback: false(关掉后如果又没配任何凭证,网络工具就直接不可用了,直到你配好服务商为止)。

有 Nous 身份就免密钥? 是的。只要你带着任意 Nous 身份(正式账号、免费额度、甚至匿名访客都算),就能免密钥使用托管的 web_search——注意只有搜索,web_extract 还是得自己配服务商。这个托管通道不受上面那个 web.keyless_fallback 开关影响。

兜底救援:如果你选的是带密钥的后端(包括 Nous Tool Gateway 那条路),某次调用失败(密钥失效、服务宕机、网关连不上、上游 5xx),这一次会自动改走免费轮询环,结果里会注明是哪家救的场、为什么(rescued_from / backend_error)。救援不会“粘住”——下一次调用还是先试你选的后端。想关掉设 web.keyless_rescue: false。

想固定一家? 免费轮询环默认是“谁有空用谁”,你可以在 hermes tools 里把某一家钉住(pin),这样平时就走它,只有被限流时才按顺序切到环里的下一家。另外,Exa、Parallel、Keenable 在 hermes tools 里各会显示成两行——Free (keyless) 和 Paid (API key):选 Free 就钉住那家的匿名端点(哪怕你之后加了密钥也还是走免费);选 Paid 就钉住带密钥的路径(密钥缺失会直接报错,而不是悄悄降级到免费层)。这个选择存在 web.provider_tier.<name>: free|paid,不设就是自动(有密钥走付费,没有就走免费环)。

第1步:选择你的“浏览器”

运行 hermes tools 命令,进入 Web Search & Extract 界面,按提示选择服务商并填入 API 密钥(密钥在对应官网注册获取)。

不想折腾? 直接选默认的 Firecrawl,在 ~/.hermes/.env 文件里加一行:

FIRECRAWL_API_KEY=fc-your-key-here

想省钱? 用 SearXNG(免费、自托管、注重隐私)。用 Docker 一条命令跑起来:

docker run -p 8888:8080 searxng/searxng:latest

然后修改配置启用 JSON 输出(否则 Hermes 读不了),最后在 config.yaml 里指定:

web:
  search_backend: "searxng"

第2步:按需搭配“搜索”和“提取”

搜索和提取可以分开选不同的服务商。比如用免费的 SearXNG 搜索,用 Firecrawl 提取网页内容:

web:
  search_backend: "searxng"
  extract_backend: "firecrawl"

这就像用免费的图书馆查资料,但请付费的翻译帮你精读——各取所长。

注意:Brave Search、DDGS、xAI(Grok)和 OpenAI Native 是只能搜索的,需要 web_extract 时得搭配 Firecrawl/Tavily/Perplexity/Keenable/Exa/Parallel 之一。

Perplexity 有什么特别的? 它走的是 Perplexity 自家的索引,返回的是带排名、带日期的结果(web_search)。但做 web_extract 时,它和官方 pplx 命令行工具一样,只给你和查询相关的片段——也就是每页里真正有用的那几段,省略的部分用 … 标出来,而不是整页原文照搬。所以如果你需要完整页面,就把 web.extract_backend 换成 Firecrawl / Exa / Parallel。另外 Perplexity 只在它自己那边配密钥;而托管的 Nous 通道(任意 Nous 身份,访客也算)能免密钥提供 web_search。

DDGS 是什么? 它底层用的是 ddgs Python 包,不需要密钥。如果还没装,可以运行 python -c "import pm; pm.sync_venv(['ddgs'], explicit=True)",或者干脆让 Hermes 在第一次用到时自动懒加载。注意本页的 Python 依赖命令都基于 PM 准备好的源码检出(source checkout),改完依赖后要重新激活检出并重启 Hermes。

xAI(Grok)是什么? 它在 Responses API 上跑 Grok 服务端的 web_search 工具,结果由模型生成而非索引返回——标题、描述、URL 选择全是模型输出,所以别把它当成传统搜索引擎来信任。

OpenAI Native 是什么? 它用的是 Codex Responses 接口上 OpenAI 自带的 web_search 工具,靠 ChatGPT/Codex 订阅登录(hermes auth add openai-codex),没有独立 API 密钥。搜索在模型服务端完成,结果直接融进它的回答里,Hermes 这边不跑客户端搜索。它只负责搜索,提取还得另配后端:

web:
  search_backend: "openai-native"

第3步:理解“长文截断”机制

网页内容可能很长(比如论坛帖子、新闻评论区)。Hermes 默认只保留 15,000 字符(约 7500 个汉字),超出部分会截断并提示 [TRUNCATED]。完整内容会存到本地文件,Agent 可以按需分页读取。

如果截断影响了你,可以调大限制:

web:
  extract_char_limit: 50000

或者改用 browser_navigate 工具直接操作浏览器,获取实时页面。

第4步:验证配置是否生效

配置好后,跑个测试搜索:

curl -s "http://localhost:8888/search?q=test&format=json" | python3 -c "import sys,json; d=json.load(sys.stdin); print(len(d['results']), 'results')"

看到 10 results 就说明 SearXNG 正常工作了。

第5步:了解结果缓存

短时间内重复的网络请求会走缓存,而不是再次调用付费后端——这能省额度、降延迟。web_search 的相同查询(忽略大小写和空格)在同一进程内命中内存缓存;web_extract 的相同 URL 会把全文存到 ~/.hermes/cache/web/,在 CLI、网关、定时任务和子 Agent 之间共享。并发的相同搜索会被合并成一次后端请求,只有第一个调用者真正付费。

只有成功的响应才会被缓存,而且会按服务商回报的请求 URL 归档——如果某页服务商没给出对应的请求 URL,就只返回不缓存,避免一批结果里张冠李戴。失败一律重试后端;免费救援那一次的结果永不缓存(下次还是先试你选的后端);被 security.website_blocklist 拦下的 URL 也不会从缓存里取。缓存过的提取会重新走一遍截断流程,所以第二次换个 char_limit 也能复用同一份抓取结果。

缓存默认开启,新鲜度窗口是 20 分钟,可在 config.yaml 里调整:

web:
  cache_enabled: true      # 默认;设为 false 可同时关闭两种缓存
  cache_ttl_minutes: 20    # 新鲜度窗口,范围 1–1440

如果你在查真正实时的数据(比分、价格、突发新闻),把 TTL 调低或直接设 web.cache_enabled: false。另外,本地开发地址(localhost、127.0.0.1、*.local、私有 IP 段等)永远不会被缓存,每次都是实时抓取。

公网上的测试环境怎么办? 预发布部署和隧道 URL 是公网 DNS,本地开发那条规则管不到——把它们写进 web.cache_exempt_hosts,也会每次都实时抓取。支持精确匹配、*. 通配和域名后缀(写 mysite.dev 也覆盖 preview.mysite.dev):

web:
  cache_exempt_hosts:
    - mysite.vercel.app
    - "*.ngrok-free.app"

总结一下:搜索和提取是 Agent 的“眼睛”,选对服务商、配好密钥、理解截断机制,就能让它帮你高效获取网络信息。

下篇预告:Agent 能“看”能“搜”了,下一步该学“动手”——敬请期待第48篇:浏览器自动化操作。

📖 官方文档

本文根据 Hermes Agent 官方文档编写,原文见:官方文档 › user-guide/features/web-search