1- # ContentPipe Architecture v0.7.1
1+ # ContentPipe Architecture v0.7.2
22
3- > 最后更新: 2026-03-11
3+ > 最后更新: 2026-03-12
44> 形态: OpenClaw Plugin(managed-service)
55
66## 1. 设计哲学
1212- ** 信息瀑布** :上游节点的输出自动成为下游的输入,用户的讨论意见也随之传递
1313- ** 断点可恢复** :状态持久化到 YAML,任意节点可断点续跑
1414- ** 双模式** :人工审核(每步暂停)或全自动(一键到底)
15- - ** 实时同步 ** :审核对话中的修改意见实时写回 YAML/文章,下游节点以最新版本为准
15+ - ** 逐轮提交仲裁 ** :每次节点运行(初始执行 / 审核追问 / 重试)后,Python 都会读回正式产物并做提交仲裁;MVP 阶段先做最小提交判定,后续再补深层校验
1616
1717## 2. 系统架构
1818
4848
4949- ContentPipe 通过 ` x-openclaw-agent-id: contentpipe-blank ` 路由到空白 agent
5050- 同时保留独立 ` x-openclaw-session-key ` ,保证每个 run / node 的上下文隔离
51- - blank-agent 的职责不是返回一段“可解析聊天文本”,而是** 直接把正式产物写入项目目录**
52- - Pipeline 下游节点以文件为准,不以聊天输出为准
51+ - blank-agent 的职责是承载节点的** 正式产物修改** (初始执行 + 后续审核追问)
52+ - 节点收到命令后先自行执行任务并尝试修改自己的正式产物文件
53+ - Python 在** 每一轮 LLM 运行后** 读回文件,并先做最小提交判定;更深层的格式/规范校验和带行号反馈作为下一阶段增强
54+ - Pipeline 下游节点以正式产物文件为准,不以聊天解释文字为准
5355
5456当前正式约束:
5557
@@ -88,8 +90,9 @@ plugins/content-pipeline/skills/
8890output/runs/{run_id}/
8991├── chat_scout.json ← Scout 执行 + 审核聊天
9092├── chat_researcher.json ← Researcher 执行 + 审核聊天
91- ├── chat_writer.json ← Writer 执行 + 审核聊天
93+ ├── chat_writer.json ← Writer 执行 + 审核聊天(唯一作者人格)
9294├── chat_director.json ← Director 执行 + 审核聊天
95+ ├── writer_last_exchange.json ← Writer 最近一次审核改稿调试记录(可选)
9396└── ...
9497```
9598
@@ -100,6 +103,22 @@ x-openclaw-agent-id: contentpipe-blank
100103x-openclaw-session-key: contentpipe:{run_id}:{node_id}:main
101104```
102105
106+ 节点的规范形态是:** 一个节点 = 一个主 session = 一个主提示词 = 一个正式产物文件** 。
107+
108+ ``` text
109+ contentpipe:{run_id}:scout:main
110+ contentpipe:{run_id}:researcher:main
111+ contentpipe:{run_id}:writer:main
112+ contentpipe:{run_id}:director:main
113+ contentpipe:{run_id}:formatter:main
114+ ```
115+
116+ 说明:
117+ - 初始执行与后续审核追问共用同一个 node session / prompt,属于同一个连续 agent 人格
118+ - 节点可以在审核阶段继续直接修改自己的正式产物文件
119+ - 同一个节点的“继续修、重试、用户追问”都沿用这个连续 session
120+ - 个别内部 helper lane(例如去 AI 味、图片细化)可以作为实现细节保留,但** 不是架构主路径** ,也不改变“单节点单主 session”的设计
121+
103122### 3.2 消息分层:internal vs visible
104123
105124``` json
@@ -112,26 +131,82 @@ x-openclaw-session-key: contentpipe:{run_id}:{node_id}:main
112131{"role" : " assistant" , "content" : " 好的,从成本角度..." , "tag" : " user_chat" }
113132```
114133
115- ### 3.3 实时同步机制
134+ ### 3.3 逐轮执行 / 最小提交 / 后续校验机制
116135
117- 审核对话中的修改 ** 实时写回 state ** (不需要等用户点「继续」) :
136+ 无论是 ** 节点初始执行 ** 、 ** 审核聊天追问 ** 还是 ** 手动重试 ** ,都走同一个闭环 :
118137
119138```
120- 用户发消息 → AI 回复 → 意图判断(qwen3.5-flash)
121- ↓ YES=有修改意图
122- 完整同步: 当前YAML + 对话 → LLM → 更新后YAML → 写回state
123- ↓
124- 前端左栏卡片自动刷新(绿框闪一下)
139+ 收到命令 / 用户消息
140+ → 当前节点主 agent(同一 session / 同一 prompt)执行任务并修改正式产物
141+ → Python 读回正式产物文件
142+ → 先做最小提交判定(是否存在 / 是否可读 / 是否写到正确路径 / 是否有变化)
143+ ↓ 通过
144+ 更新 state / 写 prev / 刷新 UI / 允许下游继续消费
145+ ↓ 失败
146+ 反馈“未成功提交正式产物”给同一节点继续修
125147```
126148
127- ** 同步覆盖的节点** :
149+ 这意味着:
150+ - ** 每次 LLM 运行一轮,都必须经过 Python 读回正式产物**
151+ - 节点可以用追问方式持续修同一个文件
152+ - 用户审核聊天本质上也是“继续驱动同一个节点修正式产物”
153+
154+ 关键约束:
155+ - ** 允许局部 edit,也允许整文件 write** ;架构不强制修改方式
156+ - ** Python 不信 agent 的口头确认** ,只信正式产物文件的实际结果
157+ - ** 状态更新以正式产物为主** :必要时由 Python 从正式产物反推 state 对应字段
158+ - ** 纯讨论可以不改文件** ;只有正式产物实际发生变化,才算本轮修改成功
159+
160+ ### 3.3.1 MVP 必做(当前阶段)
161+
162+ 当前阶段先不做深层内容校验,Python 至少必须做:
163+
164+ 1 . ** 路径正确性** :节点只能修改自己的正式产物文件
165+ 2 . ** 文件存在性** :本轮结束后目标文件必须存在
166+ 3 . ** 文件可读性** :必须能以正确编码读回
167+ 4 . ** 变更检测** :本轮文件内容 / hash / mtime 至少有一个发生变化
168+ 5 . ** state 回写** :由正式产物反推并刷新 state
169+ 6 . ** prev / diff** :对可比对节点保留上一版本,支持 diff 与回滚
170+ 7 . ** 前端刷新** :只基于 Python 读回并接受的结果刷新 UI
171+
172+ ### 3.3.2 可后置(下一阶段补)
173+
174+ 以下内容校验先不作为 MVP 硬要求,但后续应逐步补齐:
175+
176+ - Scout / Researcher 的 YAML schema 校验
177+ - Director 的 JSON schema 校验
178+ - Writer 的 document contract 校验(例如正文纯净度、禁止解释性话语混入)
179+ - 更细粒度的结构化错误反馈(行号 / 字段 / 失败原因)
180+ - 校验失败后的自动重试链路
128181
129- | 节点 | 同步的 state 字段 | 同步方式 |
130- | ------| ------------------| ---------|
131- | Scout | topic, writer_brief, handoff_to_researcher, reference_articles, user_requirements | YAML 同步 |
132- | Researcher | writer_packet, verification_results, evidence_backed_insights, open_issues | YAML 同步 |
133- | Writer | article_edited(文章全文) | 文章改写同步 |
134- | Director | visual_plan | YAML 同步 |
182+ ### 3.3.3 节点正式产物约定
183+
184+ | 节点 | 正式产物 | Python MVP 提交动作 |
185+ | ------| ---------| ---------------------|
186+ | Scout | ` topic.yaml ` | 读回文件、确认变更、刷新 ` topic ` /` writer_brief ` /` reference_articles ` 等 state |
187+ | Researcher | ` research.yaml ` | 读回文件、确认变更、刷新 ` writer_packet ` / 核查结果 |
188+ | Writer | ` article_edited.md ` (或初稿阶段 ` article_draft.md ` ) | 读回正文、确认变更、刷新正文 / diff / 预览 |
189+ | Director | ` visual_plan.json ` | 读回文件、确认变更、刷新配图方案 |
190+ | Formatter | ` formatted.html ` | 读回文件、确认变更、刷新 HTML 预览 |
191+
192+ 这个协议的核心是:** 节点的人格连续,但提交权交给 Python。**
193+
194+ ### 3.3.4 当前实现状态(2026-03-12)
195+
196+ 当前代码已经落地的主路径如下:
197+
198+ - ** Scout / Researcher / Director / Formatter**
199+ - 审核聊天走同一个 node session
200+ - LLM 可直接修改本节点正式产物
201+ - Python 读回正式产物后做最小提交判定
202+ - 成功则刷新 state 与左侧 UI
203+ - ** Writer**
204+ - ` writer:main ` 为连续主 session
205+ - ` writer-structure.md ` 对应的结构 helper 每次 fresh session 运行
206+ - 结构 helper 负责把正式正文落到 ` article_edited.md `
207+ - Python 再读回正文、写 ` .prev ` 、更新 ` state.article_edited ` 、刷新左侧 UI
208+ - 旧的 ` _sync_chat_to_state() ` 二次 YAML 同步链路已经退役,不再作为主路径
209+ - 旧的 ` writer-extractor.md ` 已移入 ` prompts/deprecated/ ` ,不再挂主链路
135210
136211### 3.4 跨节点数据传递
137212
@@ -175,9 +250,22 @@ Scout session Researcher session
175250- ** 发任意 URL** → Jina Reader 抓取
176251- ** "搜一下 XXX"** → Brave Search + 小红书搜索
177252
178- ## 5. Writer 三层消费结构
253+ ## 5. Writer:连续主 session + fresh 结构 LLM
254+
255+ Writer 仍然消费结构化的 ` writer_context ` ,但在运行方式上比其他节点更特殊:
179256
180- Writer 不再直接拼接零散字段,而是消费一份结构化的 ` writer_context ` :
257+ - ** Writer 主 session 是连续的** :初稿、用户追问、审核聊天、重试,都走同一个 ` writer:main ` 连续 session
258+ - ** 结构 LLM 是 fresh session** :每次单独启动一个新的 helper session,用来读取 Writer 主 session 里产出的正文,做结构化整理 / 反 AI 对抗 / 正式正文提取
259+ - ** Python 仍是最终仲裁者** :不管 Writer 主 session 还是结构 LLM 产出什么,最终都要经过 Python 读回文件、做提交仲裁、刷新 UI
260+
261+ Writer 的核心原则:
262+ - ** 唯一作者人格** :同一个 Writer 主 session 负责持续写稿、追问、改稿;
263+ - ** 主 session 连续** :用户追问和 retry 都沿用这个 session,不重新开新人格;
264+ - ** 结构 helper 独立** :结构 LLM 每次 fresh session,不继承旧对话负担,只做“把正文整理成合规正式产物 + 把多余解释留给用户”这件事;
265+ - ** 正式产物单一** :审核阶段唯一正式正文仍然是 ` article_edited.md ` ;
266+ - ** 提交由 Python 仲裁** :Python 读取正文、做最小提交判定、写 ` .prev ` 、更新 state、驱动 diff/UI;正文内容契约校验后续再补。
267+
268+ Writer 不直接拼接零散字段,而是消费一份结构化的 ` writer_context ` :
181269
182270``` yaml
183271# 第 1 层:立题层(来自 Scout)
@@ -199,8 +287,24 @@ writer_packet:
199287 useful_data : [...]
200288` ` `
201289
202- ### 去 AI 味自动执行
203- Writer 节点内部自动调用去 AI 味 LLM(Sonnet 4.6),用独立 session 不污染 Writer 对话。
290+ ### Writer 审核阶段闭环
291+
292+ 审核聊天阶段:
293+ 1. 用户向 ` writer:main` 追问/要求改稿
294+ 2. `writer:main` 在连续 session 中继续生成正文与说明
295+ 3. fresh 的结构 LLM 读取这轮正文,做结构化整理 / 反 AI 对抗 / 正文抽取
296+ 4. 结构 LLM 将正式正文写入 `article_edited.md`,把多余解释性话语留给用户侧
297+ 5. Python 读取 `article_edited.md` 并做最小提交判定(存在 / 可读 / 正确路径 / 有变化)
298+ 6. 通过后更新 `state.article_edited`、写 `.prev`、刷新左栏和 diff
299+ 7. 若失败,Python 把“未成功提交正式正文”的反馈再送回相应链路继续修
300+
301+ > 注:Writer 的正文内容契约校验(例如解释话语混入正文、结构污染、反 AI 纯净度)暂不作为 MVP 硬门槛,后续再补。
302+
303+ # ## 去 AI 味 / 结构化 helper
304+ “去 AI 味”与“结构化整理”都可以由 Writer 的 helper LLM 承担;它们属于 Writer 节点内部实现,而不是新的用户交互人格。关键约束是:
305+ - Writer 主 session 连续
306+ - helper session 每次 fresh
307+ - Python 永远负责最终校验与提交
204308
205309# # 6. 模板系统
206310
@@ -260,18 +364,17 @@ Director 审核页面的配图方案面板:
260364
261365| 角色 | 模型 | 用途 |
262366|------|------|------|
263- | Scout | anthropic/claude-sonnet-4-6 | 选题分析 |
264- | Researcher | anthropic/claude-sonnet-4-6 | 深度调研 |
265- | Writer | openai-codex/gpt-5.4 | 写作主模型 |
266- | De-AI Editor | anthropic/claude-sonnet-4-6 | 去 AI 味(独立 session) |
267- | Director | anthropic/claude-opus-4-6 | 配图方案 |
367+ | Scout | anthropic/claude-sonnet-4-6 | 选题分析 + 审核追问 |
368+ | Researcher | anthropic/claude-sonnet-4-6 | 深度调研 + 审核追问 |
369+ | Writer Main | openai-codex/gpt-5.4 | 连续主 session:写稿 + 审核聊天 + 改稿 |
370+ | Writer Structure LLM | dashscope/qwen3.5-flash | fresh session:读取 Writer 正文,做结构整理 / 反 AI 对抗 / 正文落盘 |
371+ | De-AI Editor | anthropic/claude-sonnet-4-6 | Writer 节点内部 polish(可并入结构 helper 链路) |
372+ | Director | anthropic/claude-opus-4-6 | 配图方案 + 审核追问 |
268373| Director Refine | dashscope/qwen3.5-plus | 配图细化/压缩 |
269374| 图像 prompt helper | anthropic/claude-sonnet-4-6 | prompt 翻译/压缩 |
270- | 意图判断 | dashscope/qwen3.5-flash | 审核对话是否有修改意图 |
271- | YAML 同步 | dashscope/qwen3.5-flash | 对话→YAML 更新 |
272- | 聊天节点 | 跟随节点配置 | 审核聊天用该节点同一个 model |
375+ | Formatter | anthropic/claude-sonnet-4-6 | 排版预览 + 审核追问 |
273376
274- **关键设计**:Writer 写稿 + 审核聊天 + 审核改写使用同一个 model,保持风格一致 。
377+ **关键设计**:除 Writer 的“连续主 session + fresh 结构 helper”外,其余节点都走“单节点单主 session + 正式产物直接修改 + Python 逐轮提交仲裁”的统一闭环 。
275378
276379## 9. Pipeline 节点(7 步)
277380
@@ -308,9 +411,13 @@ plugins/content-pipeline/
308411│ ├── scout.md
309412│ ├── researcher.md
310413│ ├── writer.md
414+ │ ├── writer-review.md
415+ │ ├── writer-structure.md
311416│ ├── de-ai-engine.md
312417│ ├── art-director.md
313- │ └── art-director-refine.md
418+ │ ├── art-director-refine.md
419+ │ └── deprecated/
420+ │ └── writer-extractor.md
314421├── templates/
315422│ └── wechat/
316423│ ├── base.html
@@ -372,7 +479,7 @@ plugins/content-pipeline/
372479| 8 | Formatter + Publisher stub | ✅ |
373480| 9 | Scout 新 schema + 三层消费 | ✅ |
374481| 10 | Per-node session + internal/visible | ✅ |
375- | 11 | 实时同步(对话→YAML/文章 ) | ✅ |
482+ | 11 | 实时同步(对话→正式产物→Python 校验提交 ) | ✅ |
376483| 12 | 模板匹配修复 + 深色适配 | ✅ |
377484| 13 | 图文匹配(after_section 精确插入) | ✅ |
378485| 14 | Director 配图管理(上传/替换/删除) | ✅ |
0 commit comments