🤖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_searchweb_extract 也能开箱即用:请求会在 Exa、Parallel、Firecrawl、Keenable 这几家的公共免费额度之间轮询,遇到限流就自动换下一家重试。这一层是“最后的兜底”——只要你配置了后端或填了任意 API 密钥,就会优先走你自己的配置。想彻底关掉它,设置 web.keyless_fallback: false

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

第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 之一。

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。另外,本地开发地址(localhost127.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