Files
reader/README.md
T

11 KiB
Raw Blame History

内容提取 MCP

这是一个基于 Python 的 MCP 项目骨架,用于完成文章内容提取、结构化摘要校验、确定性过滤,以及 Markdown 输出落盘。

运行

pip install -e .
summary-mcp

服务当前暴露 5 个工具:

  • extract_url_content
  • extract_item_content
  • filter_summary_result
  • run_freshrss_openclaw_pipeline
  • generate_article_summaries

单篇文章总结后处理(可选使用独立 LLM)

生产环境推荐输入

  • 单篇总结的正式生产输入,优先使用 FreshRSS 主流水线输出的单篇 extracted 文件:
    • outputs/freshrss/rerun/<run_id>/extracted/item-XX.extracted.json
  • 这些逐条 extracted 文件是下游单篇总结的正式默认产物。
  • 像 outputs/freshrss/extracted/freshrss.extracted.json 这样的批量 extracted 文件,只作为临时场景、兼容旧流程的输入形态保留,不是首选生产默认。

daily 知识库默认配置

  • IMA_DAILY_KNOWLEDGE_BASE_ID —— 单篇日报总结默认上传的 IMA 知识库 ID
  • IMA_DAILY_KNOWLEDGE_BASE_NAME —— 默认知识库名称(预期值:daily)
  • 上传逻辑在运行时应先校验目标知识库;若配置的目标不存在,应先按名称查找,仍不存在则创建 daily

相关能力:

  • article-summary MCP 工具(基于已有 extracted payload 做单篇总结)
  • scripts/run_article_summaries.py CLI 辅助脚本

校验 LLM 摘要结果

validate-llm-result outputs/reference/summary/result.json --extracted outputs/reference/extracted/read-flow-2026.extracted.json

跑最小 extraction → summary 循环

python scripts/run_summary_loop.py ^
  --extracted outputs/reference/extracted/read-flow-2026.extracted.json ^
  --prompt outputs/prompts/llm-summary-prompt.txt ^
  --output outputs/reference/summary/result.loop.json

拉取 FreshRSS 条目并映射为标准化 item

set FRESHRSS_API_BASE_URL=http://127.0.0.1:8081/api/greader.php
set FRESHRSS_USERNAME=bot
set FRESHRSS_API_PASSWORD=your-api-password
python scripts/pull_freshrss_items.py --limit 5 --mark-read

默认会排除已经带 read 标签的条目。 如果你想拿到完整阅读列表,可以加 --include-read。 启用 --mark-read 后,脚本会在执行成功后把本次抓到的条目标记为已读。

脚本会写出:

  • outputs/freshrss/raw/freshrss.raw.json
  • outputs/freshrss/items/freshrss.items.json

拉取 FreshRSS 条目并逐条做内容提取

set FRESHRSS_API_BASE_URL=http://127.0.0.1:8081/api/greader.php
set FRESHRSS_USERNAME=osiman
set FRESHRSS_API_PASSWORD=your-api-password
python scripts/run_freshrss_extract.py --limit 1 --mark-read

默认会排除已经带 read 标签的条目。 启用 --mark-read 后,只有提取成功的条目才会被标记为已读。

脚本会写出:

  • outputs/freshrss/raw/freshrss.raw.json
  • outputs/freshrss/items/freshrss.items.json
  • outputs/freshrss/extracted/freshrss.extracted.json

注意:这个批量 extracted 文件主要用于独立提取场景和旧流程兼容。下游单篇总结的正式生产默认输入,仍然是 outputs/freshrss/rerun/<run_id>/extracted/item-XX.extracted.json 这类逐条 extracted 文件。

跑完整 FreshRSS 流水线,并在最终 delivery payload 写盘成功后再标记已读

set FRESHRSS_API_BASE_URL=http://127.0.0.1:8081/api/greader.php
set FRESHRSS_USERNAME=osiman
set FRESHRSS_API_PASSWORD=your-api-password
set LLM_API_URL=https://api.deepseek.com
set LLM_API_KEY=your-llm-api-key
set LLM_MODEL=deepseek-chat
python scripts/run_freshrss_pipeline.py --limit 5 --mark-read

如果你希望过滤时引入个人工程兴趣 / AI Agent 兴趣画像,可以传入 context 文件:

python scripts/run_freshrss_pipeline.py ^
  --limit 5 ^
  --context configs/filter_context.personal.json ^
  --mark-read

这是当前推荐的正式生产入口。默认只写出这些产物:

  • outputs/freshrss/rerun/<timestamp>/raw/freshrss.raw.json
  • outputs/freshrss/rerun/<timestamp>/candidates/openclaw-delivery-payload.json
  • outputs/freshrss/rerun/<timestamp>/run-report.json
  • outputs/freshrss/rerun/<timestamp>/extracted/item-XX.extracted.json(每篇一份)

同时还会更新每日关键词索引运行数据:

  • data/term_index/daily/YYYY-MM-DD.json
  • data/term_index/term_stats.json

主流水线默认不会产出批量级的 freshrss.extracted.json。 如果你需要更多逐条中间产物,例如标准化 items、摘要结果、过滤决策、candidate record、candidate input,可以加 --debug-artifacts。

当 OpenClaw 接入这个 MCP 服务后,应直接调用 run_freshrss_openclaw_pipeline 来获得同样行为。 在排查复杂问题时,也可以把 debug_artifacts=true 打开。

对结构化摘要结果执行确定性过滤规则

python scripts/run_filter_rules.py ^
  --summary outputs/reference/summary/result.loop.json ^
  --extracted outputs/reference/extracted/read-flow-2026.extracted.json ^
  --output outputs/reference/filter/filter-decision.json

如果你希望注入兴趣主题或来源标签,也可以额外传入 context 文件:

python scripts/run_filter_rules.py ^
  --summary outputs/reference/summary/result.loop.json ^
  --extracted outputs/reference/extracted/read-flow-2026.extracted.json ^
  --context outputs/reference/filter/filter-context.json ^
  --output outputs/reference/filter/filter-decision.with-context.json

规则引擎设计和规则编写说明见:

  • docs/design/filter-rule-engine-design.md
  • docs/design/filter-rule-engine-usage.md

将过滤结果写入 Markdown sink

python scripts/run_markdown_sink.py ^
  --summary outputs/reference/summary/result.loop.json ^
  --extracted outputs/reference/extracted/read-flow-2026.extracted.json ^
  --filter outputs/reference/filter/filter-decision.json

脚本会把 Markdown 笔记写到 knowledge-base/ 下。

构建内部 ArticleCandidateRecord 与精简版 OpenClawCandidateInput

python scripts/run_article_candidate.py ^
  --summary outputs/reference/summary/result.loop.json ^
  --extracted outputs/reference/extracted/read-flow-2026.extracted.json ^
  --filter outputs/reference/filter/filter-decision.json ^
  --section-hint tools_and_workflows

默认会写出:

  • outputs/reference/candidates/article-candidate-record.json
  • outputs/reference/candidates/openclaw-candidate-input.json

构建批量 OpenClaw delivery payload

python scripts/build_openclaw_delivery.py ^
  --input-dir outputs/freshrss/candidates/batch ^
  --sort-by-rank ^
  --date 2026-03-25

默认会写出:

  • outputs/reference/candidates/openclaw-delivery-payload.json

输出目录布局说明见 outputs/README.md。

关键词索引默认配置

相关配置文件位于:

  • configs/term_aliases.json
  • configs/term_stopwords.json
  • configs/term_cleanup_policy.json
  • configs/term_watchlist.json
  • configs/term_change_log.json

你也可以基于已有 delivery payload 重新构建关键词索引:

python scripts/build_keyword_index.py ^
  --input outputs/reference/candidates/openclaw-delivery-payload.json

运行期关键词数据存放在:

  • data/term_index/

关键词清理评审 skill 位于:

  • skills/keyword-cleanup-review/

构建给 LLM skill 使用的评审数据包(review bundle):

python skills/keyword-cleanup-review/scripts/build_review_bundle.py ^
  --days 7 ^
  --top 50 ^
  --output outputs/term_index/review/keyword-cleanup-bundle.json

现在这个评审数据包(review bundle)还会额外携带治理上下文:

  • 来自 configs/term_cleanup_policy.json 的清理阈值
  • 当前 watch list(configs/term_watchlist.json)
  • 最近已应用的变更(configs/term_change_log.json)

这个 skill 只负责生成 review 输入与建议,不会自动修改:

  • term_aliases
  • term_stopwords
  • filter_context.personal.json

如果你想先预览已接受建议,再决定是否写配置文件:

python scripts/apply_term_suggestions.py ^
  --suggestions outputs/term_index/review/term-cleanup-suggestions-YYYY-MM-DD.json ^
  --accept-watch Cron Heartbeat Memory ^
  --dry-run

去掉 --dry-run 后才会真正写文件。 这个脚本也支持通过 --accept-alias、--accept-stopword、--accept-interest 应用 alias / stopword / interest keyword 变更。 已接受的 watch 词会写入 configs/term_watchlist.json,每次应用动作也会被追加到 configs/term_change_log.json。

单篇总结 LLM 配置

如果你希望单篇总结后处理使用独立模型,而不影响主流水线,可以设置:

  • ARTICLE_SUMMARY_LLM_API_URL
  • ARTICLE_SUMMARY_LLM_MODEL
  • ARTICLE_SUMMARY_LLM_API_KEY

如果这些变量未设置,单篇总结会回退使用主流程中的 LLM_* / OPENAI_* 配置。

示例(PowerShell 风格):

set ARTICLE_SUMMARY_LLM_API_URL=https://api.deepseek.com
set ARTICLE_SUMMARY_LLM_API_KEY=your-article-summary-key
set ARTICLE_SUMMARY_LLM_MODEL=deepseek-chat

然后可以这样调用 CLI。 正式生产环境建议优先使用 outputs/freshrss/rerun/<run_id>/extracted/ 下的逐条 extracted 文件;下面这个批量 extracted 示例仅保留为兼容旧流程 / 临时场景输入:

python scripts/run_article_summaries.py ^
  --extracted outputs/freshrss/extracted/freshrss.extracted.json ^
  --ids 12345 67890 ^
  --output-dir outputs/freshrss/single_summaries

也可以通过 summary_mcp.server 暴露的 MCP 工具 generate_article_summaries 调用:

  • extracted_path(string):单篇 extracted JSON 路径(例如 outputs/freshrss/rerun/<run_id>/extracted/item-01.extracted.json),或者包含 results 数组的 batch extracted JSON
  • selected_ids(array of strings):要总结的一个或多个 item_id。如果传空数组,则对文件中的全部条目做总结
  • output_dir(optional string):Markdown 输出目录;若不传,则默认写到 extracted 文件旁边的 single_summaries/ 目录
  • llm_api_key / llm_model / llm_api_url(optional strings):单篇总结 LLM 的覆盖配置;不传时会按前文规则回退到 ARTICLE_SUMMARY_* 或主 LLM_*

该工具返回一个 JSON 数组,内容为生成好的 Markdown 文件路径。

单篇总结使用独立 prompt:outputs/prompts/article-summary-prompt.txt。 它与日报 prompt 完全独立,输出的是中文结构化知识笔记,包含这些部分:

  • 核心结论
  • 主要论点
  • 关键方法 / 机制
  • 重要细节
  • 可复用启发
  • 关键词
  • 主题