分析一个自动生成AI周刊的开源项目
# Agili 的 AIGC 周刊 — 项目分析
这是一个**由 Agentic AI Agent 自动策展、自动撰写、自动发布**的 AIGC(人工智能生成内容)精选周刊系统。整体采用 Serverless 架构,完全部署在 Cloudflare 边缘基础设施上。
## 一、技术栈
| 层级 | 技术 |
|------|------|
| 前端框架 | Next.js 15 (App Router) + React 19 |
| CMS | Payload CMS 3.0 (Headless) |
| 数据库 | Cloudflare D1 (SQLite) |
| 对象存储 | Cloudflare R2 |
| 边缘运行时 | Cloudflare Workers |
| Agent 运行时 | Cloudflare Containers + OpenCode |
| 部署适配 | OpenNext (`@opennextjs/cloudflare`) |
| 其他 | markdown-it-ts、rss、overtype、Firecrawl (MCP) |
## 二、三大核心组件
项目由三个解耦的组件构成,协同完成"采集 → 撰写 → 发布 → 展示"的闭环:
### 1. Next.js 应用 (`app/` + `collections/` + `lib/` + `components/`)
负责面向读者的前端展示与 Payload CMS 管理后台。
**路由结构**(App Router,使用路由分组):
- `app/(frontend)/` — 前台页面
- `page.tsx` — 首页(周刊列表 + 分页)
- `weekly/[slug]/page.tsx` — 周刊详情页(Markdown 渲染 + JSON-LD 结构化数据 + 上下篇导航)
- `layout.tsx` — 根布局(Terminal 主题 + 暗色模式 + SEO 元数据)
- `app/(payload)/` — Payload Admin (`/admin`) 与 API (`/api`)
- `app/rss.xml/route.ts` — RSS 订阅源
- `app/sitemap.ts` — 站点地图
- `app/robots.ts` — 爬虫规则
- `app/manifest.ts` — PWA 清单
**数据模型** (`collections/`):
- `Weekly.ts` — 周刊集合:标题、摘要、内容(Markdown)、期刊编号(格式 `Y26W12`,正则校验)、状态(草稿/已发布)、发布日期、封面图、链接、标签。变更后通过 hook 自动失效缓存。
- `Media.ts` — 媒体集合(上传到 R2,含 alt 文本)
- `Users.ts` — 用户集合(启用 API Key 认证,供 Agent 写入 CMS)
**数据访问层** (`lib/weekly/`):
- `data.ts` — 封装 Payload 查询,使用 Next.js `unstable_cache` + React `cache` 双层缓存。列表缓存 1 小时,详情缓存 24 小时,sitemap 缓存 1 周。提供 `getWeeklyList`、`getWeeklyBySlug`(含上下篇)、`getAllWeeklySitemapItems`。
- `cache.ts` — 缓存失效逻辑,同时清除 Next.js 标签缓存和 Cloudflare Workers Cache。
- `utils.ts` — 日期格式化
**工具库**:
- `lib/markdown.ts` — markdown-it 渲染,自定义链接规则(外链新窗口打开 + `rel=noopener noreferrer`)和图片规则(懒加载 + 异步解码)
- `lib/config.ts` — 站点全局配置(SEO、OpenGraph、Twitter Card、RSS、PWA)
- `lib/url.ts` — 绝对 URL 生成
**主题组件** (`components/theme/`):Terminal 风格主题(基于 hugo-theme-terminal),含暗色/亮色切换、分页、文章元信息、标签列表。
**Payload 自定义字段** (`components/payload/overtype.tsx`):为 CMS 内容字段集成 富文本编辑器,支持明暗主题切换。
### 2. OpenCode Agent (`agent/`)
独立的 AI Agent 服务,运行在 Cloudflare Containers 内的 Docker 容器中,负责自动采集信息、撰写周刊并写入 CMS。
**配置** (`agent/opencode.json`):
- 监听 2442 端口,提供 HTTP API
- 集成 Firecrawl MCP(网页爬取)
- 配置多模型:主模型 Claude Sonnet、小模型 Gemini Flash、Writer 用 Claude Opus thinking、Reviewer 用 GPT-5.2
- 定义 6 个 Agent:build(主)、editor、image-editor、researcher、reviewer、writer
**自动化工作流** (`agent/.opencode/commands/weekly.md`):
通过 `/weekly` 命令触发,采用**产物即状态**的恢复机制(检查中间产物判断断点),分 6 个阶段:
| 阶段 | 任务 | 产出 | 执行者 |
|------|------|------|--------|
| Phase 1 | 收集内容 | `drafts/*.md` | `batch-research` 技能 → `researcher` agent |
| Phase 2 | 筛选信息 | `drafts.yaml` | `editor` agent(三维打分≥70 入选) |
| Phase 3 | 筛选图片 | `images.yaml` | `image-editor` agent(视觉检查) |
| Phase 4 | 撰写内容 | 周刊 Markdown | `writer` agent |
| Phase 5 | 审核修订 | PASS/意见 | `reviewer` agent(最多 3 轮) |
| Phase 6 | 发布草稿 | `published/{id}.json` | `publish-weekly` 技能 → Payload API |
**子 Agent 职责**:
- `researcher` — 单源抓取,用 Firecrawl 爬取网页,深度限制(每层≤10链接、总计≤30请求、深度≤2),提取正文+图片候选,指数退避重试
- `batch-research` 技能 — 批量调度器,分 3 批(重要资源/博客/KOL)并发抓取,每轮 5 并发,同域名限流
- `editor` — 主编,抓取历史 RSS 去重,三维打分(相关性40%+影响力30%+实操性30%),GitHub <100 star 直接丢弃
- `image-editor` — 图片编辑,下载候选到临时目录,用 `read` 工具视觉检查,通过 wsrv.nl 生成最终图片 URL
- `writer` — 专栏作家,按 `chinese-writing` 技能撰写,链接以锚文本嵌入
- `reviewer` — 审稿人,依据写作指南审核,最多 3 轮修改
**技能** (`agent/.opencode/skills/`):
- `chinese-writing` — 中文写作指南(去 AI 味六原则、简化词池、反模式识别)
- `batch-research` — 批量采集调度
- `publish-weekly` — 通过 Payload REST API 幂等写入 CMS(API Key 认证,POST/PATCH),可选 Bark 推送通知
**信息源** (`agent/.opencode/REFERENCE.md`):30+ 数据源,分三类:重要资源(HN/Solidot/daily.dev 等)、博客网站(Anthropic/OpenAI/DeepMind 等)、KOL(宝玉/Karpathy 等)。
**工具** (`agent/.opencode/utils.mjs`):周次计算(UTC,周日为周首)、HN URL 生成、参数格式化。
### 3. Cloudflare Worker (`worker/`)
边缘入口,负责请求转发、鉴权与定时调度。
- `index.ts` — 入口,`fetch` 处理 HTTP 请求(Basic Auth 鉴权后转发到 Container),`scheduled` 处理定时任务
- `container.ts` — `AgentContainer` 类(继承 Cloudflare Container),管理容器生命周期(空闲 10 分钟休眠)。`runWeeklyTask` 创建 OpenCode session → 监控 SSE 事件流 → 触发 `weekly` 命令。通过 SSE 监听 session 状态(busy/idle/error),动态续期容器活动超时。
- `sse.ts` — SSE 事件流解析器
- `wrangler.jsonc` — 配置定时触发(`0 23 * * 7` 即每周日 23:00 UTC)、Container 实例(standard-1,最大 1 实例)、Durable Object 绑定、可观测性
## 三、数据流与运行机制
```
每周日 23:00 UTC
│
▼
Cloudflare Worker (scheduled trigger)
│
▼
AgentContainer.runWeeklyTask()
│ 创建 OpenCode session + SSE 监控
▼
OpenCode Agent (Container 内)
│
├─ Phase 1: researcher × N 并发爬取 30+ 数据源 → drafts/
├─ Phase 2: editor 打分筛选去重 → drafts.yaml
├─ Phase 3: image-editor 视觉选图 → images.yaml
├─ Phase 4: writer 撰写 → aigc-weekly-yXX-wYY.md
├─ Phase 5: reviewer 审核 (≤3轮)
└─ Phase 6: publish-weekly → Payload REST API (status: draft)
│
▼
Cloudflare D1 (存储) + R2 (媒体)
│
▼
revalidateTag 失效前端缓存
│
▼
读者访问 Next.js 前台 / RSS / sitemap
```
## 四、实现的关键功能
1. **AI 全自动策展**:从 30+ 信息源爬取 → 智能筛选打分 → 配图 → 撰写 → 审核 → 发布,全程无人干预
2. **断点恢复**:以中间产物(文件)存在性判断恢复点,任一阶段失败可续跑
3. **幂等发布**:按 `issueNumber` 查询,存在则 PATCH、不存在则 POST,重复执行不产生重复
4. **多层缓存**:Next.js unstable_cache(标签失效)+ React cache + Cloudflare Workers Cache,CMS 变更后 hook 自动清除
5. **SEO 完整**:sitemap、robots、RSS、OpenGraph、Twitter Card、JSON-LD(Article + BreadcrumbList + WebSite)、PWA manifest
6. **安全 Markdown 渲染**:外链新窗口 + noopener、图片懒加载、禁用 HTML
7. **容器生命周期管理**:SSE 监听 Agent 状态动态续期,空闲自动休眠节省成本
8. **多模型分工**:不同子 Agent 使用不同模型(Opus 写作、GPT-5.2 审核、Gemini Flash 编辑),优化成本与质量
9. **中文写作质量保障**:专门的去 AI 味写作指南 + 审稿人闭环审核
10. **视觉图片筛选**:image-editor 亲自用 `read` 工具查看下载的图片,而非仅凭 URL 判断
## 五、部署架构
- `pnpm deploy` → 数据库迁移(D1) + OpenNext 构建 + 部署到 Cloudflare Workers
- `pnpm deploy:worker` → 部署 Agent Worker(含 Container 镜像,由 `Dockerfile` 构建:Python+Node.js 基础镜像 + OpenCode 安装)
- 前端与 Admin 共用一个 Next.js 应用,通过 OpenNext 适配到 Cloudflare Workers 运行时
这是一个设计相当完整的 AI 内容自动化系统,工程化程度高(断点恢复、幂等、多模型、缓存、SEO),Agent 编排清晰(主 Agent 协调 5 个子 Agent + 3 个技能),且针对中文写作质量做了专门约束。
- 点赞
- 收藏
- 关注作者
评论(0)