@@ -6,7 +6,7 @@ ContentPipe 是一个面向公众号 / 图文平台的内容生产系统。它
66
77- ** Scout** :选题与切入角度
88- ** Researcher** :事实核查与证据包
9- - ** Writer** :成稿生成
9+ - ** Writer** :唯一作者人格( 成稿生成 + 审核聊天改稿)
1010- ** Director** :配图规划与视觉风格
1111- ** Image Gen** :生图
1212- ** Formatter** :排版与模板适配
@@ -60,16 +60,18 @@ scout → researcher → writer → director → image_gen → formatter → pub
6060| ---| ---| ---|
6161| Scout | 热点扫描、选题提案、切入角度、writer brief | ✅ |
6262| Researcher | 事实核查、数据点、风险与禁写项 | ✅ |
63- | Writer | 生成文章草稿,结合 writer_context 三层结构 | ✅ |
63+ | Writer | 连续主 session 负责写稿/追问/改稿;fresh 结构 LLM 负责整理正文、反 AI 对抗与正式落盘,Python 做最终提交仲裁 | ✅ |
6464| Director | 规划配图位置、风格、目的、描述 | ✅ |
6565| Image Gen | 根据规划生成图片 | ⚙️ |
6666| Formatter | 将 Markdown 转为平台 HTML,并插图 | ✅ |
6767| Publisher | 公众号 / 小红书导出或发布 | ⚙️ |
6868
69+ > 注:微信公众号发布默认目标是** 草稿箱** ,不是直接群发。未配置 ` WECHAT_APPID ` / ` WECHAT_SECRET ` 时,Publisher 仅本地保存,不会真正调用微信发布接口。
70+
6971### 2.2 关键特性
7072
7173- ** Per-node session** :每个节点独立会话,执行记录与审核聊天共享上下文
72- - ** 实时同步 ** :审核聊天中的明确修改,会自动同步回左侧结构化数据 / 文章正文
74+ - ** 逐轮提交仲裁 ** :每个节点在执行/审核/重试后都要经过 Python 读回正式产物,完成最小提交判定、提交并刷新左侧结果
7375- ** 图文精确匹配** :使用 ` after_section ` 定位,把图片插入指定段落下方
7476- ** 模板适配** :支持深色/浅色模板的内联样式输出
7577- ** 导向式审核** :在 Web UI 中查看节点输出卡片、文章、配图方案、预览
@@ -98,13 +100,21 @@ ContentPipe Service (FastAPI)
98100
99101### 3.1.1 blank-agent 执行平面
100102
101- 在 ` llm_mode=gateway ` 下,ContentPipe 不再默认让节点直接消费聊天窗口里的文本输出,而是优先走一个低污染执行平面 :
103+ 在 ` llm_mode=gateway ` 下,ContentPipe 通过一个低污染执行平面来承载节点的正式产物修改 :
102104
103105- Gateway 请求显式路由到 ` contentpipe-blank `
104- - 每个节点仍保留独立 session key
105- - blank-agent 负责把最终产物** 直接写入正式项目目录**
106+ - 每个节点保留独立 session key
107+ - 同一个节点的初始执行与后续审核追问共享同一个主 session / 主提示词
108+ - 节点可以直接修改自己的正式产物文件(` edit ` 或 ` write ` 都可以)
109+ - Python 在** 每一轮 LLM 运行后** 都负责读回正式产物,做最小提交判定、提交、更新 state 与刷新 UI
110+ - 若最小提交判定失败,Python 会把失败反馈送回对应节点继续修复
111+ - 更深层的内容 / schema 校验可作为下一阶段补齐
106112- Pipeline 下游节点只消费正式产物文件,不依赖聊天解释文字
107113
114+ 当前实现状态:
115+ - Scout / Researcher / Director / Formatter 审核聊天已接到“直接修改正式产物 → Python 读回提交”的主链路
116+ - Writer 使用“连续主 session + fresh 结构 helper”模式:主 session 负责改稿,结构 helper 落正式正文
117+
108118当前正式约定:
109119
110120- agent id: ` contentpipe-blank `
@@ -248,7 +258,7 @@ pipeline:
248258 scout : " anthropic/claude-sonnet-4-6"
249259 researcher : " anthropic/claude-sonnet-4-6"
250260 writer : " openai-codex/gpt-5.4"
251- de_ai_editor : " anthropic/claude-sonnet-4-6"
261+ de_ai_editor : " anthropic/claude-sonnet-4-6" # 内部 polish
252262 director : " anthropic/claude-opus-4-6"
253263 director_refine : " dashscope/qwen3.5-plus"
254264` ` `
@@ -273,12 +283,61 @@ DASHSCOPE_API_KEY=...
273283ANTHROPIC_API_KEY=...
274284```
275285
286+ > ⚠️ 如果你希望 ** Publisher 真正把内容创建到微信公众号草稿箱** ,必须显式配置环境变量:
287+ > - ` WECHAT_APPID `
288+ > - ` WECHAT_SECRET `
289+ >
290+ > 同时还需要把当前服务端出口 IP 加入微信公众号后台的 ** IP 白名单** ,否则会报 ` invalid ip ... not in whitelist ` 。
291+ >
292+ > 如果这两个环境变量未配置,ContentPipe 只能完成本地排版与产物保存,** 不会真正发布到任何公众号后台** 。
293+
276294说明:
277295- ` CONTENTPIPE_NOTIFY_CHANNEL ` 为空时,不会发送 Discord 通知
278296- ` CONTENTPIPE_PUBLIC_BASE_URL ` 用于 Discord 通知里的回链地址
279297- ` CONTENTPIPE_AUTH_TOKEN ` 非空时,Web UI / API 会开启鉴权(浏览器登录或请求头 ` X-ContentPipe-Token ` )
280298- 发布相关密钥建议只通过环境变量或本地未跟踪配置注入
281299
300+ ### 5.3 推荐配置方式(.env.local)
301+
302+ 1 . 复制示例文件:
303+ ``` bash
304+ cp .env.example .env.local
305+ ```
306+
307+ 2 . 编辑 ` .env.local ` ,填入真实值:
308+ ``` bash
309+ WECHAT_APPID=wx_your_app_id_here
310+ WECHAT_SECRET=your_app_secret_here
311+ ```
312+
313+ 3 . ` start.sh ` 会自动加载 ` .env.local `
314+
315+ > ⚠️ ** 安全提醒** :
316+ > - ` .env.local ` 已加入 ` .gitignore ` ,不会被提交
317+ > - 不要把真实凭证写进 ` pipeline.yaml ` 或代码
318+ > - 如果凭证已泄露,立即去公众号后台重置 AppSecret
319+
320+ ### 5.4 微信公众号发布前置条件
321+
322+ 除了配置 ` WECHAT_APPID ` 和 ` WECHAT_SECRET ` ,还必须:
323+
324+ 1 . ** 添加 IP 白名单**
325+ - 登录公众号后台:` mp.weixin.qq.com `
326+ - 进入:** 设置与开发 → 开发接口管理 → 基本配置 → IP 白名单**
327+ - 添加当前服务器出口 IP
328+
329+ 2 . ** 获取当前出口 IP**
330+ ``` bash
331+ curl -s https://api.ipify.org
332+ ```
333+
334+ 3 . ** 验证白名单是否生效**
335+ ``` bash
336+ curl " https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$WECHAT_APPID &secret=$WECHAT_SECRET "
337+ ```
338+ - 成功返回:` {"access_token":"...","expires_in":7200} `
339+ - 失败返回:` {"errcode":40164,"errmsg":"invalid ip ... not in whitelist"} `
340+
282341---
283342
284343## 6. 启动方式
@@ -570,8 +629,8 @@ git push origin main
570629### 已完成
571630
572631- 交互式多节点 pipeline
573- - 实时同步(聊天 → 结构化状态 / 文章 )
574- - Writer 三层上下文
632+ - 实时同步(每轮 LLM 运行后都经 Python 读回 / 最小提交判定 / 刷新 )
633+ - Writer 三层上下文 + 连续主 session + fresh 结构 LLM
575634- 图文精确匹配
576635- Director 配图管理
577636- 基础插件化(服务清单、健康检查、通知)
0 commit comments