首页
/ AutoGPT Platform 的 Jina Search 集成:网页正文提取与联网搜索块实战指南

AutoGPT Platform 的 Jina Search 集成:网页正文提取与联网搜索块实战指南

2026-09-07 21:24:54作者:田桥桑Industrious

AutoGPT Platform 通过将 AI 能力拆分为可视化、可编排的“块”(Block),让开发者可以在零代码的画布上组合出真实的自动化工作流。本文聚焦官方 Jina 集成中的两个搜索类块——**Extract Website Content(网页正文提取)**与 Search The Web(联网搜索),结合仓库源码详细讲解其输入/输出契约、底层抓取机制、凭据配置与成本行为,帮助你直接把这些能力接入自己的 Agent 图(Graph)中。

Jina 集成在 AutoGPT Platform 中定位为“搜索与内容提取”基础设施:一个块把任意网页 URL 转成干净的正文文本,供后续 LLM 摘要、情感分析、RAG 向量化等节点消费;另一个块以结构化文本形式返回联网搜索结果。读完本文,你将能够为这两个块正确配置凭据、理解 raw_content 两种抓取模式的取舍、预判错误与成本,并知道如何在仓库源码与测试中验证它们的真实行为。

一、Jina 集成在项目中的位置

在仓库中,Jina 相关代码集中在两个区域:

  • 文档侧docs/integrations/block-integrations/jina/search.md 是本文的主体依据,属于块级集成文档(同目录下还维护了 firecrawl、exa、tavily 等同类的搜索/抓取集成说明);
  • 实现侧jina 块源码目录 包含 search.py(本文两个块的实现)、embeddings.pychunking.pyfact_checker.py 以及 _auth.py_config.py 两个基础设施文件。

Jina Provider 注册 可以看到,该 Provider 的官方描述是 “Embeddings and reranking”,支持 api_key 类型的认证。也就是说,在 AutoGPT Platform 的集成体系里,Jina 被当成一个完整的能力供应商来建模——除了本文的搜索块,它还衍生出 Embeddings(向量嵌入)、Chunking(分块)、Fact Checker 等块,均在同一个 backend/blocks/jina/ 包下(各文件可通过 blocks/jina 目录列表 查看)。

从源码结构上看,这两个搜索块都属于 BlockCategory.SEARCH 类别(见 search.py 中的 categories 声明),因此它们会出现在前端画布的“搜索”分类下,与 Wikipedia、网页抓取等其他搜索块并列可选。

二、前置条件:创建 Jina API Key 凭据

两个块都强依赖 Jina 的 API Key。在 凭据定义 _auth.py 中:

  • JinaCredentials = APIKeyCredentials,即使用通用 API Key 凭据模型;
  • JinaCredentialsInput 的类型字面量被锁定为 (ProviderName.JINA, "api_key"),前端只会展示 Jina 这个 Provider 的 API Key 型凭据。

JinaCredentialsField() 生成的字段描述为 “The Jina integration can be used with an API Key”。因此使用前的操作步骤是:

  1. 在 Jina(jina.ai)账户中生成一个 API Key;
  2. 在 AutoGPT Platform 的凭据管理界面中新建“Jina”集成凭据并粘贴该 Key(Provider 描述与认证类型已在 ProviderBuilder 中注册好,平台会据此提供对应的凭据表单);
  3. 在画布上把该凭据挂到 Extract Website Content / Search The Web 块的 credentials 输入上。

值得注意的是 raw_content=True 的直连抓取模式不携带任何凭据头(详见下文),它不需要 Jina Key;但 Jina Reader 模式与搜索模式都必须在请求头中带 Authorization: Bearer <api_key>

三、块一:Extract Website Content —— 网页正文提取

3.1 功能定位与工作方式

官方文档的定义是:这个块用于抓取给定 Web URL 的内容。其工作原理为:块向目标 URL 发起请求,下载 HTML,并使用内容提取算法识别、抽取页面的主体文本。

实现 ExtractWebsiteContentBlock 中,该逻辑被拆成了两种可切换的抓取通道,由 raw_content 布尔开关控制,这是理解本块的关键。

3.2 输入与输出契约

Input 描述 类型 是否必填 默认值 / 备注
url 要抓取正文内容的 URL str 例如 https://en.wikipedia.org/wiki/Artificial_intelligence(见代码 test_input
credentials Jina API Key 凭据 object 类型锁定为 (JINA, api_key)
raw_content 是否进行原始抓取,而不是用 Jina-ai Reader 抓取 bool 默认 false,并标记为高级选项(advanced=True,见 输入字段定义
Output 描述 类型
content 从给定 URL 抓取得到的正文内容 str
error 内容获取失败时的错误消息 str

注意输出契约里同时存在 contenterror 两个互斥出口:成功时走 content,失败时走 error。在画布上建议把 error 连到后续的错误处理/日志节点,避免失败时工作流静默中断。

3.3 底层抓取通道:raw_content 两种模式的真实差异

这是本文最值得展开的实现细节。看 run() 实现

  • raw_content=False(默认,Jina Reader 模式):块把 URL 直接拼接为 https://r.jina.ai/{你的URL},并携带两枚请求头:Content-Type: application/jsonAuthorization: Bearer <api_key>。Jina Reader 服务负责抓取页面、清洗标签、抽取可读正文,返回的是干净的 Markdown/文本而非原始 HTML。这正是文档所说“使用 Jina-ai Reader 抓取”的含义。
  • raw_content=True(原始直连模式):块不经过 Jina 服务,先调用 validate_url_host(input_data.url) 做 URL 合法性校验(非法时立即 yield "error", f"Invalid URL: {e}" 并返回),随后以空请求头直接 GET 目标 URL,拿到的是服务端原始响应文本,适合那些返回 JSON/纯文本的接口或无法被 Reader 正常渲染的页面。

两种模式的请求都由继承自 GetRequest 基类的 get_request 发出。查看 HTTP 辅助类:它底层用 Requests().get(url, headers=headers) 执行 GET,json=False 时返回 response.text()(文本),json=True 时返回解析后的 JSON。搜索与抓取两个块均以 json=False 调用,因此拿到的是文本形态的内容。

3.4 错误处理细节

实现中对异常做了分层处理,这在真实工作流中非常重要:

  1. HTTPClientError(4xx)→ yield "error", f"Client error ({status_code}) fetching {url}: ..."
  2. HTTPServerError(5xx)→ yield "error", f"Server error ({status_code}) fetching {url}: ..."
  3. 其他 Exceptionyield "error", f"Failed to fetch {url}: ..."
  4. 即便请求成功但返回空内容,也会 yield "error", f"No content returned for {url}"

测试用例 test_jina_extract_website.py 可以验证上述行为:test_extract_website_content_returns_content 断言 raw_content=True 时请求的目标 URL 就是原始 URL、请求头为空字典 {},并正确产出 ("content", "page content")test_extract_website_content_handles_http_error 则模拟 HTTP 400,断言输出中包含 "Client error (400)" 与原始 URL,且不会产出 content

3.5 典型使用场景

官方文档给出的场景:数据分析师可以用本块自动抓取新闻网站的文章正文,用于情感分析或主题建模。在此之上可以扩展出的真实组合是:Extract Website Content → LLM 文本块——先抓正文,再让 LLM 做摘要、翻译、抽取要点或分类,形成一条无需登录新闻站即可持续运行的“网页情报流水线”。

四、块二:Search The Web —— 联网搜索

4.1 功能定位与工作方式

官方定义:这个块针对给定查询词在互联网上进行搜索。工作方式为:把查询词发给搜索引擎 API,处理结果后以结构化格式返回。需要注意的是,这里的“结构化格式”在实现中其实是以字符串承载的搜索内容文本(见下文的 results 输出说明)。

4.2 输入与输出契约

Input 描述 类型 是否必填
query 要在网上搜索的查询词 str
credentials Jina API Key 凭据 object
Output 描述 类型
results 搜索结果,包含前 5 个 URL 的内容 str
error 操作失败时的错误消息 str

results 的 Schema 描述为 “The search results including content from top 5 URLs”——即返回内容不只是链接清单,还尽量携带排名靠前页面的内容摘要,这在官方文档与 源码输出定义 中是一致的。

4.3 底层实现:Jina Search 请求的构造

查看 SearchTheWebBlock 的 run(),其请求构造链路非常清晰:

  1. urllib.parse.quotequery 做百分号编码,以安全处理空格与特殊字符;
  2. 拼出 Jina Search 端点:https://s.jina.ai/{encoded_query}
  3. 组装请求头:Content-Type: application/json + Authorization: Bearer <api_key>(从凭据对象的 api_key.get_secret_value() 取明文值注入);
  4. json=False 调用 self.get_request(...) 获取文本结果;
  5. 任何异常都会包装成 BlockExecutionError(消息前缀为 Search failed:),并附上 block_nameblock_id 以便定位。

与抓取块把错误从 error 输出通道吐出不同,搜索块失败时直接抛出执行异常raise BlockExecutionError(...)),运行时会将该块标记为执行失败。

4.4 成本与计量行为(源码级细节)

搜索块在成功获取结果后会调用:

self.merge_stats(
    NodeExecutionStats(provider_cost=0.01, provider_cost_type="cost_usd")
)

代码注释明确写道:Jina Reader Search 在付费档约为每查询 $0.01,该固定成本通过 cost_usd 类型的 provider_cost 路由进平台成本日志,记录真实美元开销(costMicrodollars)并与其信用额度扣费并行。这解释了仓库中 block_cost_config / 计费相关代码billing_reconciliation_test.pyblock_cost_tracking_test.py 等测试为何会出现 Jina 身影。也就是说:每次成功的搜索都会计入约 1 美分的供应商成本,在设计高频轮询/批处理类 Agent 时应将其纳入成本预算。

抓取块(Extract Website Content)在实现中则没有 merge_stats 调用,从代码结构看它的成本并未像搜索块那样被显式建模——这一点与实际执行时的计费表现以平台端结算逻辑为准。

4.5 典型使用场景

官方文档给出的场景:内容创作者可以用本块调研所在领域的热点话题,收集新文章或视频的选题灵感。典型组合是 Search The Web → LLM 文本块:先把“query”用 LLM 生成或关键词模板动态注入,再把搜索返回的顶部内容喂给 LLM 做素材归纳、竞品动态周报、或者作为 RAG 外部知识来源,驱动一个“自动选题机”。

五、共享基座:块如何真正发出 HTTP 请求

理解这两个块不能只看自身实现,还要看它们共同的基类 GetRequest。两个类声明均为 class XxxBlock(Block, GetRequest),其中 Block 来自 backend.blocks._base(块框架基类),GetRequest 来自 HTTP 辅助模块get_request 是 classmethod,内部走 backend.util.request.Requests 这一统一 HTTP 客户端,负责超时、User-Agent 等默认行为,因此这两个 Jina 块无需自建客户端,直接复用平台网络栈。

这层抽象让块作者能以“声明式”方式接入网络能力,也让测试可以用 monkeypatch.setattr(block, "get_request", fake_get_request) 轻易做单测(测试文件正是这么做的)。阅读或扩展 Jina 集成时,顺着 Block → GetRequest → Requests 这条调用链即可快速定位所有网络行为。

六、凭据与安全相关实现细节

凭据处理有两点值得注意:

  • 两个块的 Authorization 头都是从 credentials.api_key.get_secret_value() 提取——get_secret_value() 是 pydantic SecretStr 的标准做法,确保密钥在日志/序列化中不会被明文打印(_auth.py 中的 TEST_CREDENTIALS 也以 SecretStr 构造,仅用于测试)。
  • 测试凭据使用 mock-jina-api-key 占位值、block 声明中亦通过 test_mock={"get_request": ...} 注入桩函数(见 search.py 与抓取块的 test_input),说明这些块被设计为可在离线测试环境中验证输入输出契约,而不会真正调用 Jina 产生费用。

七、配置与使用速查

在 AutoGPT Platform 的画布/代码 Agent 编排中使用这两个块的完整要素如下:

  1. 连接:创建 Jina Provider 的 API Key 凭据并挂载到块输入;
  2. Extract Website Content:必填 url;默认走 Jina Reader(r.jina.ai 前缀)输出清洗后正文,如需直连原始响应把 raw_content 置为 trueerror 出口用于失败分流;
  3. Search The Web:必填 query;块内部拼装 s.jina.ai/<编码后的query> 并携带 Bearer 凭据;成功输出 results(含前 5 个 URL 的内容),失败抛出 BlockExecutionError;注意每次成功搜索约合 $0.01 供应商成本;
  4. 版本信息:两个块的稳定块 ID 分别为 Extract Website Content 436c3984-57fd-4b85-8e9a-459b356883bd、Search The Web 87840993-2053-44b7-8da4-187ad4ee518c(见 源码块注册search.py#L101-L115),可用于程序化引用或存量编排的兼容性核对。

八、进一步的探索路径

  • 若需要把抓取到的网页正文进一步向量化用于检索,可在同一集成目录下查看 embeddings.py(Jina Embeddings)与 chunking.py
  • 若要对搜索结果做可信度校验,可参考 fact_checker.py
  • 仓库的 blocks 集成文档目录 提供了与 Jina 同类的搜索/抓取集成(如 exa、tavily、firecrawl)的文档,可用于块能力横向对比选型;
  • 块运行时的测试基线可参考 test_jina_extract_website.py,它是理解该块异常语义与输出契约的最快入口。

本文档相关的官方块级说明见 docs/integrations/block-integrations/jina/search.md,实现与测试证据分别见 backend/blocks/jina/search.pybackend/blocks/jina/_auth.pybackend/blocks/jina/_config.pybackend/test/blocks/test_jina_extract_website.py。你在把网页转正文、把查询转素材这两类自动化场景中遇到的大多数问题,都可以在这几份文件与上述调用链中找到答案。

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.14 K
2.75 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
857
1.35 K
docsdocs
暂无描述
Markdown
897
5.8 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
531
594
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
916
1.83 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.58 K
1.01 K
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.36 K
1.46 K
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
1.01 K
516
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
547
388