Files
reader/docs/openclaw/openclaw-orchestration-flow.md
T

308 lines
6.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 任务和路径拼接仓库来驱动。**