用 AutoGPT 的 Read RSS Feed 块将 RSS/Atom 订阅流接入自动化工作流:参数解析、轮询机制与源码级实现详解
Read RSS Feed 是 AutoGPT Platform(autogpt_platform)内置的一个 Input 类数据块,用于从任意 RSS 订阅地址拉取条目、按时间窗口过滤并按条/批量输出。本文结合其官方文档(rss.md)与后端实现(rss.py)展开,读完你将掌握该块的每个输入输出字段、默认值与运行语义,能把它用作"新闻/博客/行业资讯监听触发器",并理解它与下游 AI 处理块如何串成可复用的自动化 Agent。
一、块是什么:一句话定义与平台定位
按官方文档的定义,Read RSS Feed 是"A block that retrieves and processes entries from an RSS feed",即:读取并处理来自 RSS feed 的条目。
在 AutoGPT Platform 的块生态中,它通过 categories={BlockCategory.INPUT}(见 rss.py)被归入 Input 类别——这类块负责"把外部世界的数据送入 Agent 图",与 Output(向外部输出)、AI、Logic、COMMUNICATION 等类别并列(类别枚举定义见 _base.py)。因此,当你需要"让 Agent 感知外部订阅源的实时变化"时,它会出现在 Builder 画布的输入类块面板中。
二、块做什么:功能目标
原文档给出了三条功能描述,可归纳为:
- 读取:根据调用者提供的 RSS URL 获取 feed 内容;
- 过滤:仅保留发布时间落在"指定回看时间段"内的条目;
- 逐条输出:把符合条件的每个条目逐个送出,供下游节点即到即处理。
也就是说,它把一个"时刻变化的订阅流"折叠成一个可编程的数据源:时间窗口决定了"我要多新的内容",逐条输出决定了"我可以对每一条新内容单独做处理"。该块同时支持 RSS 与 Atom 两类标准格式(代码基于 feedparser 统一解析,见下文),源码描述与扩展文档(misc.md#read-rss-feed)都明确了这一点。
三、它如何工作:从 URL 到结构化输出的调用链
原文档描述了宏观流程,而源码给出了精确细节。整个块的核心实现在 rss.py 的两个方法中:
1)抓取与解析阶段(静态异步方法 parse_feed)
- 使用平台封装的
Requests(raise_for_status=True).get(url)异步下载 feed 内容; - 内存保护:设定
MAX_FEED_SIZE = 10 * 1024 * 1024(10MB)上限,先后校验响应头Content-Length与实际下载内容长度,超限直接抛ValueError; - 解析交给
feedparser.parse(该库内置针对 XML 实体攻击的防护,代码注释特别说明这是一项安全修复); - 一旦网络或解析异常,块不抛错而是记录 warning 日志并返回空 feed(
{"entries": []}),保证上游图不因单个数据源抖动而崩溃。
2)过滤与输出阶段(异步生成器 run)
start_time = now(UTC) − time_period 分钟
循环:
解析 feed
对每个条目:若 pub_date > start_time,则构建 RSSEntry 并 yield(单条端口)
最后 yield 全部命中条目组成的列表(批量端口)
sleep(polling_rate) 后进入下一轮
值得注意的是运行语义上的几个细节,它们会直接影响你的工作流设计:
- 时间窗基准:
start_time在块启动时一次性计算,time_period的语义是"相对块运行开始时刻往前回看 N 分钟"(例如设为 60,即回看最近一小时)。如果你在真实工程中用 1440(默认值),意味着获取最近 24 小时的条目。 - 轮询与持续运行的配合:默认
run_continuously=True,配合polling_rate可让块无限轮询,实现"订阅源监听";当关闭持续运行开关时,循环体只执行一轮即结束。 - 单次运行末尾也会 sleep:即使
run_continuously=False,循环体尾部仍会执行一次asyncio.sleep(polling_rate),然后才因循环条件退出——从源码结构看,这意味着单轮执行的节点会额外延迟一个轮询周期才完成,涉及链式依赖时建议关注此延迟。 - 可能重复输出:持续轮询时,只要条目仍落在时间窗口内,每一轮都会把它再次 yield 出去。代码本身不做"去重/游标"追踪,因此若用作触发器且不允许重复消费,需要在图里额外做去重(例如与记忆/存储块配合记录已见条目标识)。
四、输入参数详解(含默认值与约束)
原文档给出的 4 个输入,结合 rss.py 的字段声明与 misc.md#read-rss-feed 的类型标注,完整清单如下:
| 输入字段 | 类型 | 是否必填 | 默认值 / 占位提示 | 说明 |
|---|---|---|---|---|
rss_url |
str |
是 | 占位符 https://example.com/rss |
要读取的 RSS feed 完整 URL |
time_period |
int |
否 | 默认 1440(分钟),占位符同为 1440 |
回看时间窗:只输出发布时刻晚于"块运行时刻减去该分钟数"的条目;设 60 即最近一小时 |
polling_rate |
int |
是 | 占位符 300(秒) |
每两轮抓取之间的等待秒数;持续模式下决定了"探测新条目的频率" |
run_continuously |
bool |
否 | 默认 true |
true 表示无限循环轮询;false 表示只抓取一次 |
工程上的配置建议:
- 持续监听模式(默认开启)下,
polling_rate至少要大于上游 feed 的更新频率,避免对源站造成过密请求;5 分钟(300 秒)是比较礼貌的起点,官方占位符也以 300 为例。 - 只跑一次模式:适合"手动/定时执行一次拉取并归档"的场景,例如由调度器每 6 小时触发一次,
time_period设为 360。 rss_url指向的地址必须能被后端服务直接访问;若目标源要求鉴权或位于内网,需要先确认平台网络策略。
五、输出数据模型与两种输出端口
块有两个输出端口,对应源码中 Output 声明的两个字段(rss.py):
| 输出端口 | 类型 | 语义 |
|---|---|---|
entry |
RSSEntry |
逐条输出:每个命中的条目触发一次输出,适合链到"逐条处理"的下游块 |
entries |
list[RSSEntry] |
整批输出:本轮所有命中条目作为列表一次性送出,适合批量归档/分析 |
RSSEntry 是与该块配套的 Pydantic 模型(rss.py),共 6 个字段,正好对应原文档 Outputs 表中列出的条目信息:
| RSSEntry 字段 | 类型 | 来源 | 说明 |
|---|---|---|---|
title |
str |
条目 title | 标题 / 名称 |
link |
str |
条目 link | 原文所在的完整网址 |
description |
str |
条目的 summary(缺失时为 "") |
摘要或节选 |
pub_date |
datetime |
published_parsed 前 6 个元素,按 UTC 构造 |
发布时间 |
author |
str |
条目的 author(缺失时为 "") |
作者 |
categories |
list[str] |
条目 tags 列表中的每个 term |
主题 / 分类标签 |
两个字段级细节值得留意,它们会在你往下游接线时体现价值:
- 空值安全:
description与author用entry.get(key, "")兜底为字符串;categories在无标签时是空列表。因此下游无需再处理"字段缺失"异常,但要注意description/author可能为空串、categories可能为空数组。 - 时区统一:
pub_date统一按timezone.utc构造,跨时区比较可直接使用。
六、典型实战场景与接线建议
原文档以"新闻聚合器"为示例,扩展文档(misc.md#read-rss-feed)进一步补全了三种代表性用法,本文一并汇总:
1. 新闻 / 行业资讯监控
持续监听多个新闻源的 RSS,对每条 entry 交给下游 AI 摘要块做提炼、按 categories 分类、按 pub_date 排序后展示。原文档的经典用例:新闻聚合应用可用多个该块同时监听不同来源,把最新条目按主题归类并按发布时间排序呈现给用户。
2. 内容聚合与 Newsletter
把多个订阅源(如技术博客、竞品公告)的输出汇聚成一个待处理队列,驱动摘要、翻译与排版发布链路,产出每日 digest。此时更推荐接 entries 批量端口做整体处理。
3. 博客 / 竞品更新触发器
持续轮询某个站点的 feed,一旦出现新的 entry 就触发下游"分析文章→写入总结→通知"的链路。此时应接 entry 单条端口,并如前文所述自行处理重复条目(因为同一篇文章在时间窗口内会跨多轮重复输出)。
七、为什么这样设计:生成器与逐条语义的源码依据
若你打开 rss.py 观察 run 方法,会发现它的签名是 async def run(...) -> BlockOutput,内部大量使用 yield。这意味着该块是异步生成器驱动的流式数据源:符合条件的条目在解析完成后立即 yield 出去,不必等整个 feed 处理完,后续节点即可并行开工;而每轮末尾统一 yield "entries", all_entries 提供批量视角,一个块同时覆盖"流式逐条"与"集合批量"两种消费模式。
这种"先逐条、后整批"的输出顺序在块内预置了测试样例作为行为契约:test_input 会注入一个示例 URL、极大时间窗(10,000,000 分钟)与 1 秒轮询并关闭持续运行,期望 test_output 依次产出 1 个 entry 和 1 个 entries(见 rss.py)。这意味着你在 Builder 中拖入该块后可以立即用自带测试数据验证接线,再替换成真实订阅源。
八、使用它构建 Agent 的简明流程
- 在 AutoGPT Platform Builder 中新建 Agent,从输入/数据源类面板拖入 Read RSS Feed 块;
- 将真实订阅源 URL 填入
rss_url(可用 rss.md 描述的公开新闻 feed 试跑); - 按需求设定
time_period(默认 1440 即 24 小时);单次触发可关掉run_continuously,持续监听则保留开启并设好polling_rate; - 将
entry或entries连接到下游处理节点(AI 摘要、文本分类、通知、HTTP 推送等); - 运行验证:检查输出的
title/link/pub_date是否符合预期,再按需增加去重与错误分支。
参考:本文涉及的仓库资料
- 块功能原始文档:rss.md
- 块的扩展文档与完整用例:misc.md#read-rss-feed
- 块在后端面板中的索引:docs/integrations/README.md(Input/Output 分类表)
- 块核心实现:rss.py
- 块的类别枚举与基类约定:backend/blocks/_base.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 StartedRust0624
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
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