AutoGPT Platform 的 Jina Search 集成:网页正文提取与联网搜索块实战指南
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.py、chunking.py、fact_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”。因此使用前的操作步骤是:
- 在 Jina(jina.ai)账户中生成一个 API Key;
- 在 AutoGPT Platform 的凭据管理界面中新建“Jina”集成凭据并粘贴该 Key(Provider 描述与认证类型已在 ProviderBuilder 中注册好,平台会据此提供对应的凭据表单);
- 在画布上把该凭据挂到 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 |
注意输出契约里同时存在 content 与 error 两个互斥出口:成功时走 content,失败时走 error。在画布上建议把 error 连到后续的错误处理/日志节点,避免失败时工作流静默中断。
3.3 底层抓取通道:raw_content 两种模式的真实差异
这是本文最值得展开的实现细节。看 run() 实现:
raw_content=False(默认,Jina Reader 模式):块把 URL 直接拼接为https://r.jina.ai/{你的URL},并携带两枚请求头:Content-Type: application/json与Authorization: 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 错误处理细节
实现中对异常做了分层处理,这在真实工作流中非常重要:
HTTPClientError(4xx)→yield "error", f"Client error ({status_code}) fetching {url}: ...";HTTPServerError(5xx)→yield "error", f"Server error ({status_code}) fetching {url}: ...";- 其他
Exception→yield "error", f"Failed to fetch {url}: ..."; - 即便请求成功但返回空内容,也会
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(),其请求构造链路非常清晰:
- 用
urllib.parse.quote对query做百分号编码,以安全处理空格与特殊字符; - 拼出 Jina Search 端点:
https://s.jina.ai/{encoded_query}; - 组装请求头:
Content-Type: application/json+Authorization: Bearer <api_key>(从凭据对象的api_key.get_secret_value()取明文值注入); - 以
json=False调用self.get_request(...)获取文本结果; - 任何异常都会包装成
BlockExecutionError(消息前缀为Search failed:),并附上block_name与block_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.py、block_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()是 pydanticSecretStr的标准做法,确保密钥在日志/序列化中不会被明文打印(_auth.py中的TEST_CREDENTIALS也以SecretStr构造,仅用于测试)。 - 测试凭据使用
mock-jina-api-key占位值、block 声明中亦通过test_mock={"get_request": ...}注入桩函数(见 search.py 与抓取块的test_input),说明这些块被设计为可在离线测试环境中验证输入输出契约,而不会真正调用 Jina 产生费用。
七、配置与使用速查
在 AutoGPT Platform 的画布/代码 Agent 编排中使用这两个块的完整要素如下:
- 连接:创建 Jina Provider 的 API Key 凭据并挂载到块输入;
- Extract Website Content:必填
url;默认走 Jina Reader(r.jina.ai前缀)输出清洗后正文,如需直连原始响应把raw_content置为true;error出口用于失败分流; - Search The Web:必填
query;块内部拼装s.jina.ai/<编码后的query>并携带 Bearer 凭据;成功输出results(含前 5 个 URL 的内容),失败抛出BlockExecutionError;注意每次成功搜索约合 $0.01 供应商成本; - 版本信息:两个块的稳定块 ID 分别为 Extract Website Content
436c3984-57fd-4b85-8e9a-459b356883bd、Search The Web87840993-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.py、backend/blocks/jina/_auth.py、backend/blocks/jina/_config.py 与 backend/test/blocks/test_jina_extract_website.py。你在把网页转正文、把查询转素材这两类自动化场景中遇到的大多数问题,都可以在这几份文件与上述调用链中找到答案。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0630
MiniCPM5-2BMiniCPM5-2B 是一款面向端侧、本地部署和资源受限场景的 2B 稠密 Transformer,能够达到同尺寸开源模型 SOTA 水平。Markdown00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00