# OpenClaw → reader MCP 标准编排流程 ## 1. 文档目的 本文档定义 OpenClaw 在正式环境中如何调用 reader 作为上游 MCP workflow service。 目标不是描述 reader 内部实现,而是明确 OpenClaw 的编排动作: - 什么时候启动新 run - 什么时候查询状态 - 什么时候读取结果 - 什么时候尝试恢复 - 什么时候直接新开 run - 什么时候需要人工介入 本文档基于 reader 当前**已真实落地**的能力编写,不描述尚未实现的未来接口。 --- ## 2. 当前 reader 已正式支持的 MCP 能力 当前可用能力: - `run_freshrss_openclaw_pipeline` - `get_run_status` - `list_runs` - `list_run_artifacts` - `get_delivery_payload` - `get_run_report` - `resume_run` 其中: - `run_freshrss_openclaw_pipeline` 是当前正式启动入口 - `get_run_status` / `list_runs` / `list_run_artifacts` 用于观测 - `get_delivery_payload` / `get_run_report` 用于读取正式结果 - `resume_run` 用于最小恢复能力 --- ## 3. 编排基本原则 ### 3.1 OpenClaw 不再手拼路径 OpenClaw 不应再自己拼 reader 输出路径来判断运行状态或读取核心结果。 优先使用 MCP: - 查状态 → `get_run_status` - 读 payload → `get_delivery_payload` - 读 report → `get_run_report` - 做恢复 → `resume_run` 只有在排障/人工核查时,才回退到直接看 reader run 目录。 ### 3.2 reader 是上游 workflow engine reader 负责: - FreshRSS 拉取 - 内容提取 - 摘要 - 过滤 - payload 生成 - run 状态记录 - 最小恢复 OpenClaw 负责: - 触发执行 - 轮询状态 - 读取结果 - 生成 digest markdown - Hugo 发布 - 聊天汇报 - 用户确认精选 - IMA 编排 ### 3.3 默认生产语义 正式生产运行默认: - `mark_read=true` - `debug_artifacts=false` - 只在 debug/test/validation 时显式放宽 --- ## 4. 标准 Happy Path ### Step 1: 启动新 run 调用: - `run_freshrss_openclaw_pipeline` 推荐参数示例: ```json { "limit": 5, "mark_read": true, "include_read": false, "debug_artifacts": false, "timeout_seconds": 60, "max_retries": 2 } ``` 期望: - 获得 `run_id` - 获得 `output_dir` - 获得初始结果摘要 如果启动阶段直接抛错: - 直接判为启动失败 - 不进入后续查询 ### Step 2: 查询运行状态 调用: - `get_run_status(run_id=...)` 根据返回: - `status=running` → 继续轮询 - `status=success` → 进入结果读取 - `status=failed` → 进入失败处理 - `status=partial` → 视为未完成,优先看 `recovery` 和当前阶段 ### Step 3: 读取正式结果 成功后读取: - `get_delivery_payload(run_id=...)` - `get_run_report(run_id=...)` 后续 OpenClaw 编排应以这两个接口为正式结果源,而不是自己拼路径读取 JSON。 ### Step 4: 进入下游编排 OpenClaw 在拿到正式 payload / report 后,继续执行: - public/internal digest 生成 - Hugo 发布 - 聊天汇报 - 用户确认精选 - IMA 沉淀 --- ## 5. 状态 → 动作映射 | reader 状态 | OpenClaw 动作 | |---|---| | `running` | 继续轮询 `get_run_status` | | `success` | 读取 `get_delivery_payload` 和 `get_run_report` | | `failed` 且 `recovery.resumable=true` | 评估是否调用 `resume_run` | | `failed` 且 `recovery.resumable=false` | 直接判失败,通常新开 run 或人工介入 | | `partial` | 先读状态详情和 recovery,再决定继续等 / 恢复 / 人工介入 | --- ## 6. 失败处理与恢复决策 ### 6.1 什么时候优先尝试 `resume_run` 满足以下条件时,优先考虑恢复而不是新开 run: - `get_run_status` 返回 `failed` - `recovery.resumable=true` - 当前 run 对应的是 freshrss workflow - 当前失败点在 reader 第一版支持的恢复范围内 ### 6.2 `resume_run` 当前支持范围 当前最小实现仅支持: - 仅对带 `run-state.json` 的 freshrss run - 仅从最近可恢复点继续 - 支持的恢复点: - `generate_summaries` - `apply_filters` - `build_delivery_payload` - `write_run_report` 明确不支持: - `fetch_feed` - `extract_articles` ### 6.3 什么时候不要恢复,直接新开 run 以下情况不建议 `resume_run`: - `recovery.resumable=false` - run 没有 `run-state.json` - 失败点是 `fetch_feed` 或 `extract_articles` - 恢复所需关键产物缺失 - 恢复点语义不明确或结果存在明显漂移风险 这时更合理的动作通常是: - 直接新开 run - 或人工介入排查 ### 6.4 什么时候需要人工介入 出现以下任一情况时,建议人工介入: - 连续恢复失败 - `get_run_status` 与实际产物明显不一致 - payload/report 结构不符合预期 - 恢复依赖的关键文件缺失且原因不明 - FreshRSS / LLM / 外部环境异常 --- ## 7. 读取结果的标准动作 ### 7.1 `get_delivery_payload` 用途: - 获取正式交付给 OpenClaw 的 payload - 后续 digest 生成应以该返回为准 OpenClaw 应做: - 读取后直接进入 digest 生成 - 不再自己拼 `candidates/openclaw-delivery-payload.json` ### 7.2 `get_run_report` 用途: - 获取 run 的结果摘要与关键元信息 - 用于状态判断、排障、补充上下文 OpenClaw 应做: - 作为诊断与编排辅助信息读取 - 不把 raw file path 解析逻辑继续散落到 skill 里 --- ## 8. 最小编排动作表 ### 8.1 标准生产执行 1. 调 `run_freshrss_openclaw_pipeline` 2. 拿 `run_id` 3. 轮询 `get_run_status` 4. 若 `success`: - 调 `get_delivery_payload` - 调 `get_run_report` 5. 进入 digest / Hugo / chat / IMA 下游编排 ### 8.2 失败恢复执行 1. 调 `get_run_status` 2. 若 `failed && recovery.resumable=true`: - 调 `resume_run` 3. 恢复后再次: - 调 `get_run_status` - 若成功,再读 payload / report 4. 若恢复失败或明确不可恢复: - 新开 run 或人工介入 --- ## 9. 不推荐做法 以下做法不应再作为正式主路径: - 让 OpenClaw 直接长时间 `exec` reader CLI 作为主要生产入口 - 让 OpenClaw 自己拼 reader 输出路径来判断成功/失败 - 让 OpenClaw 自己读取 `outputs/.../*.json` 作为正式结果源 - 在未确认 `resume_run` 支持范围外的失败点上强行恢复 CLI 现在的定位是: - debug - fallback - 人工排障 而不是正式生产主入口。 --- ## 10. 当前已知局限 - `resume_run` 仍是最小实现,不支持任意 stage 任意重入 - 历史无 `run-state.json` 的 run 不支持正式恢复 - 极旧 run 的结果读取仍可能依赖保守目录扫描 - `write_run_report` 若涉及重新 `mark_read`,仍依赖 FreshRSS 环境和可用凭据 --- ## 11. 一句话结论 OpenClaw 当前应把 reader 当作正式 MCP workflow service 使用: **启动用 `run_freshrss_openclaw_pipeline`,观测用 `get_run_status`,结果读取用 `get_delivery_payload` / `get_run_report`,恢复仅在 `resume_run` 最小支持范围内启用;不要再把 reader 当成长 CLI 任务和路径拼接仓库来驱动。**