系统内置 AtomCraft
FeedCraft 内置了一系列“原子工艺 (AtomCrafts)”,用于对订阅源进行特定的处理。你可以将这些原子工艺组合成“组合工艺 (FlowCraft)”来构建强大的数据管道。
这些原子用于获取全文或清理 HTML。
fulltext (全文提取)
Section titled “fulltext (全文提取)”从原始网页提取文章的全文内容。
- 适用场景: 当 RSS 订阅源仅提供摘要或片段时。
- 机制: 使用标准 HTTP 客户端请求网页,并使用算法提取正文。速度快且轻量。
fulltext-plus (浏览器全文提取)
Section titled “fulltext-plus (浏览器全文提取)”使用无头浏览器 (Puppeteer) 提取全文。
- 适用场景: 针对通过 JavaScript 动态渲染内容或有较强反爬虫措施的网站。
- 机制: 连接到配置的浏览器提供方(
browserless-restful或cdp)来渲染页面。速度较慢但兼容性更强。 - 参数:
mode(默认:networkidle2): 页面加载等待模式。load: 等待load事件。domcontentloaded: 等待DOMContentLoaded事件。networkidle0: 等待直到 500ms 内没有活跃的网络连接。networkidle2: 等待直到 500ms 内活跃的网络连接数不超过 2 个。(推荐用于 SPA 单页应用)。
wait(默认:0): 显式等待时间(秒),例如5。
cleanup (HTML 清理)
Section titled “cleanup (HTML 清理)”清理 HTML 内容以去除杂乱信息。
- 适用场景: 通过移除多余的 class、style 和空标签来提高可读性。
relative-link-fix (相对链接修复)
Section titled “relative-link-fix (相对链接修复)”将内容中的相对链接(如 <a href="/about">)转换为绝对链接(如 <a href="https://example.com/about">)。
- 适用场景: 提取全文后必不可少,否则在 RSS 阅读器中查看时链接会失效。
guid-fix (GUID 修复)
Section titled “guid-fix (GUID 修复)”使用文章内容的 FNV-1a 哈希值替换 RSS 条目的 GUID。
- 适用场景: 某些订阅源在内容未变更的情况下频繁更改 GUID,导致阅读器中出现重复的未读条目。此原子可基于内容稳定 GUID。
beautify-content (智能排版)
Section titled “beautify-content (智能排版)”使用 LLM 重新格式化文章,修复排版错误,去除广告,并标准化 Markdown 格式,最后转换回干净的 HTML。
- 参数:
prompt: 设定“编辑”角色的指令。
使用大语言模型改写、增强或筛查内容。
translate-title (标题翻译)
Section titled “translate-title (标题翻译)”将文章标题翻译为你的目标语言。
- 参数:
prompt: 自定义提示词。默认使用标准翻译提示词。支持{{.TargetLang}}占位符。
translate-content (内容翻译)
Section titled “translate-content (内容翻译)”翻译整篇文章内容,替换原文。
- 参数:
prompt: 自定义提示词。支持{{.TargetLang}}。
translate-content-immersive (沉浸式翻译)
Section titled “translate-content-immersive (沉浸式翻译)”双语翻译模式。在每一段原文后面追加翻译后的内容。
- 参数:
prompt: 自定义提示词。
summary (AI 摘要)
Section titled “summary (AI 摘要)”生成文章摘要并将其添加到正文开头。
- 参数:
prompt: 用于生成摘要的自定义提示词。
introduction (AI 导读)
Section titled “introduction (AI 导读)”为文章生成简短的介绍或导语。
- 参数:
prompt: 自定义提示词。
ai-content-process (AI 内容处理)
Section titled “ai-content-process (AI 内容处理)”根据自定义规则使用大语言模型处理文章内容,并将生成结果插入到指定位置。
- 参数:
rule(必填): 针对每篇文章内容的处理指令。例如:“总结文章的关键观点并列出行动建议”。extra-payload(默认:article_content): 逗号分隔的附加信息列表,可发送给 LLM。支持:article_summary(AI 生成的摘要),article_content(文章内容),article_date(文章日期),raw_rss_item(原始 RSS 节点数据)。placement(默认:prepend): 生成内容的写入位置。支持:prepend(在原文前追加),replace(替换原文),append(在原文后追加)。
ignore-advertorial (软文过滤)
Section titled “ignore-advertorial (软文过滤)”使用 LLM 检测文章是否为软文或广告(综合评估标题和内容),并将其移除。
- 参数:
prompt-for-exclude: 如果文章是广告,应返回true的提示词。
控制最终订阅源保留哪些条目,包括关键词、时间和语义过滤。
keyword (关键词过滤)
Section titled “keyword (关键词过滤)”根据标题或内容中的关键词进行过滤。
- 参数:
keywords: 逗号分隔的关键词列表(子串匹配,区分大小写)。例如:ad,sell,SALE。mode:include(保留匹配项,默认) 或exclude(移除匹配项)。scope:title(标题),content(内容), 或all(全部,默认)。
limit (数量限制)
Section titled “limit (数量限制)”限制 Feed 中的条目数量。
- 参数:
num(默认:10): 保留的最大条目数。
time-limit (时间限制)
Section titled “time-limit (时间限制)”过滤掉超过指定天数的条目。
- 参数:
days(默认:7): 文章保留的最大天数。
llm-filter (通用 LLM 过滤)
Section titled “llm-filter (通用 LLM 过滤)”通用的 LLM 过滤器。你可以定义排除条件。LLM 会结合文章标题和内容进行评估。
- 参数:
filter_condition: 自然语言描述的条件。如果 LLM 回答 “yes” (true),则该条目会被移除。- 示例: “这篇文章是关于体育的吗?” (移除体育类文章)。
embedding-filter (Embedding 语义过滤)
Section titled “embedding-filter (Embedding 语义过滤)”基于 Embedding 模型的语义主题过滤器。它不会让聊天模型逐条判断文章,而是把“主题锚点”和文章内容都转换成向量,再用余弦相似度判断是否匹配。
推荐单独配置 Embedding 服务:
FC_EMBEDDING_API_TYPE=openaiFC_EMBEDDING_API_BASE=https://api.openai.com/v1FC_EMBEDDING_API_KEY=sk-your-api-keyFC_EMBEDDING_API_MODEL=text-embedding-3-small # 必填FC_EMBEDDING_BATCH_SIZE=5FC_EMBEDDING_MAX_INPUT_CHARS=8000FC_EMBEDDING_API_TYPE 支持:
openai: OpenAI 或 OpenAI 兼容的 Embedding 接口。gemini: 通过 Gemini 的 OpenAI 兼容 Embedding 接口调用。请显式设置FC_EMBEDDING_API_BASE和FC_EMBEDDING_API_MODEL。ollama: 本地 Ollama Embedding 模型。请设置FC_EMBEDDING_API_BASE,例如http://localhost:11434,并使用nomic-embed-text或bge-m3这类 Embedding 模型。
如果 FC_EMBEDDING_API_TYPE、FC_EMBEDDING_API_BASE、FC_EMBEDDING_API_KEY 都没有设置,FeedCraft 会回退到对应的 FC_LLM_API_TYPE、FC_LLM_API_BASE、FC_LLM_API_KEY。Embedding 模型名是独立的:你必须显式设置 FC_EMBEDDING_API_MODEL 为有效的 Embedding 模型。 FeedCraft 不再提供默认 Embedding 模型,也不会复用 FC_LLM_API_MODEL,因为它通常是聊天模型。
FC_EMBEDDING_MAX_INPUT_CHARS 是发送给 Embedding 服务前的最终安全上限,包含 instruction 前缀。它是字符预算,不是精确的 tokenizer token 数。建议按模型 token 窗口设置保守值,例如 8k token 的 Embedding 模型可从 8000 开始。
-
anchors(必填): 每行一个主题锚点。锚点应描述你想匹配的主题,例如:人工智能基础设施机器学习研究大语言模型部署 -
threshold(默认:0.6): 余弦相似度阈值,范围0到1。值越高越严格。建议从0.6开始;漏掉相关文章时调低,混入无关文章时调高。 -
mode(默认:include):include保留匹配项;exclude移除匹配项。 -
max_content_length(默认:2000): 当前 AtomCraft 使用的文章正文最大字符数;最终发送前还会受FC_EMBEDDING_MAX_INPUT_CHARS保护。 -
instruction(可选): 会作为文本前缀拼接到每条 Embedding 输入前。除非你的模型确实需要固定任务前缀,否则建议留空。
管理后台使用流程
Section titled “管理后台使用流程”- 打开 工作台 → Feed 源处理 → 原子工艺。
- 新建一个 AtomCraft,例如
ai-news-only。 - 模板选择
embedding-filter。 - 在
anchors中每行填写一个主题。 - 使用
mode=include保留匹配文章,或切换到exclude移除匹配文章。 - 保存 AtomCraft。
- 在 FlowCraft、Recipe、Feed Compare 中使用它,或直接访问:
/craft/ai-news-only?input_url=https%3A%2F%2Fexample.com%2Ffeed.xml- “anchors parameter is required”:
anchors至少需要一行非空内容。 - “FC_EMBEDDING_API_MODEL must be set”: 请配置单个 Embedding 模型。聊天模型不适合这个功能。
- 所有文章都被移除: 降低
threshold,增加更宽泛的锚点,或增大max_content_length。 - 无关文章仍然保留: 提高
threshold,让锚点更具体,或用代表性短语替代宽泛分类名。 - 服务商提示输入过长: 降低
FC_EMBEDDING_MAX_INPUT_CHARS,降低max_content_length,或缩短instruction。
透传代理。HTML / JSON / 搜索转 RSS 见功能指南与系统工具。
proxy (代理)
Section titled “proxy (代理)”简单的订阅源代理。
- 适用场景: 当你只想转发原始 Feed 而不做修改,或者将 FeedCraft 作为中心网关使用时。
FeedCraft v3.2.0