Skip to content

Commit f6f0017

Browse files
committed
docs: architecture alignment v0.7.2
- Update to reflect unified artifact review flow - Document逐轮提交仲裁 replacing old _sync_chat_to_state - Document Writer continuous main session + fresh structure helper - Add MVP commit checklist (3.3.1) and future validation (3.3.2) - Add node official artifact table (3.3.3) - Document current implementation status (3.3.4) - Update model table with Writer Main/Extractor/Structure roles - Update BUILTIN-SKILLS.md with new Python arbitration responsibilities - Update SKILL.md with Writer persona and model table
1 parent 108c5e4 commit f6f0017

3 files changed

Lines changed: 151 additions & 43 deletions

File tree

SKILL.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ scout → researcher → writer → director → image_gen → formatter → pub
7676
|------|---------|------|------|
7777
| 🔍 Scout | 选题策划 || 热搜分析+社交搜索,输出完整 Briefing |
7878
| 📚 Researcher | 深度调研 || 事实核查+证据包,输出 writer_packet |
79-
| ✍️ Writer | 写手+去AI味 || GPT 5.4 写稿 → Sonnet 4.6 去AI味 |
79+
| ✍️ Writer | 唯一作者人格 || GPT 5.4 写稿/审核聊天Extractor 分离 reply/article → Sonnet 4.6 内部 polish |
8080
| 🎬 Director | 视觉导演 || 配图方案,支持图片上传/替换/删除 |
8181
| 🖼️ Image Gen | 图片生成 | ⚙️ | Pollinations.ai 自动生成 |
8282
| 📐 Formatter | 排版引擎 || Markdown→微信 HTML,图文精确匹配 |
@@ -129,10 +129,11 @@ POST http://localhost:8765/api/runs/{run_id}/chat
129129
|------|------|------|
130130
| Scout | qwen3.5-plus | 快速+结构化 |
131131
| Researcher | qwen3.5-plus | 量大+理解力 |
132-
| Writer | gpt-5.4 | 创造力最强 |
133-
| De-AI | sonnet-4-6 | 语感+反检测 |
132+
| Writer Main | gpt-5.4 | 唯一作者人格,写稿+审核聊天改稿 |
133+
| Writer Extractor | qwen3.5-flash | reply/article 分离,避免正文混入说明文字 |
134+
| De-AI | sonnet-4-6 | 内部 polish,隐藏工序 |
134135
| Director | qwen3.5-plus | 策划能力 |
135-
| 意图判断 | qwen3.5-flash | 轻量快速 |
136+
| 意图判断 | qwen3.5-flash | 轻量快速(结构化节点) |
136137
| YAML 同步 | qwen3.5-flash | 结构化快速 |
137138

138139
可在 `config/pipeline.yaml``llm_overrides` 覆盖。

docs/ARCHITECTURE.md

Lines changed: 142 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
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. 设计哲学
@@ -12,7 +12,7 @@
1212
- **信息瀑布**:上游节点的输出自动成为下游的输入,用户的讨论意见也随之传递
1313
- **断点可恢复**:状态持久化到 YAML,任意节点可断点续跑
1414
- **双模式**:人工审核(每步暂停)或全自动(一键到底)
15-
- **实时同步**审核对话中的修改意见实时写回 YAML/文章,下游节点以最新版本为准
15+
- **逐轮提交仲裁**每次节点运行(初始执行 / 审核追问 / 重试)后,Python 都会读回正式产物并做提交仲裁;MVP 阶段先做最小提交判定,后续再补深层校验
1616

1717
## 2. 系统架构
1818

@@ -48,8 +48,10 @@
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/
8890
output/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
100103
x-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 配图管理(上传/替换/删除) | ✅ |

docs/BUILTIN-SKILLS.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,10 +121,10 @@ ContentPipe 的 blank-agent 需要“有列表可查”的能力,但不能因
121121
- 发布动作说明与流程知识
122122

123123
### Python pipeline 负责
124-
- state 读写
125-
- 文件落盘
126-
- validator
127-
- 重试编排
124+
- 每轮运行后的正式产物读回与提交仲裁
125+
- validator / schema 校验(尽量返回可定位的行号/字段错误)
126+
- state 更新与必要的反向解析
127+
- 失败回滚 / 重试编排 / 向同一节点反馈校验错误
128128
- UI 刷新
129129
- 运行时产物管理
130130

0 commit comments

Comments
 (0)