1. 项目概述:一个由AI驱动的自动化内容策展系统

最近在折腾一个挺有意思的项目,叫“Agili的AIGC周刊”。简单来说,这是一个完全由AI智能体(Agent)驱动的、专注于人工智能生成内容领域的资讯精选周刊。它不像传统的人工编辑模式,而是把“找内容、筛内容、整理内容、发布内容”这一整套流程,都交给了一个叫OpenCode的AI Agent去自动执行。最终产出的周刊网站,技术栈也相当现代,基于Next.js 15和Payload CMS,并且完全跑在Cloudflare的边缘网络上。

这个项目的核心价值在于,它验证了“AI Agent + Serverless”这套组合拳在自动化内容生产领域的可行性。对于内容创作者、技术布道者,或者任何需要定期追踪并整理某个垂直领域动态的团队来说,它提供了一个非常具体的、可复现的工程化样板。你不是在手动写爬虫和规则,而是在“教”一个AI Agent去理解你的内容偏好,然后让它自己去互联网上“狩猎”和“加工”。我自己在复现和调试这个项目的过程中,踩了不少坑,也积累了一些关于如何让AI Agent更稳定、更“听话”的经验,后面会详细聊聊。

2. 核心架构与设计思路拆解

2.1 为什么选择“AI Agent + Serverless”架构?

这个项目的架构选择非常具有代表性,它清晰地反映了当前技术潮流的一个交汇点:利用AI Agent处理非结构化的、需要“智能”判断的任务,而将结构化的、高并发的服务交给成熟的Serverless平台。

传统的自动化内容聚合,无非是写爬虫(Scrapy, Puppeteer)定好规则去抓取,然后用一套固定的清洗、分类逻辑来处理。这种方法的问题在于,规则是死的,但互联网内容是活的。网站改版、内容格式微调、甚至只是标题写法变化,都可能导致规则失效,需要人工介入维护。而AI Agent,特别是基于大语言模型(LLM)的Agent,其优势在于对自然语言的理解和泛化能力。你可以用自然语言告诉它:“帮我找找这周关于多模态AI模型的最新论文和开源项目,要那些有实际代码、讨论度高的。” Agent能理解这个意图,并在执行过程中进行一定程度的自主判断。

那么,为什么把承载这套逻辑的运行时放在Cloudflare Containers,而把前端和CMS放在Workers上呢?这里就涉及到Serverless的选型哲学。Next.js前端和Payload CMS管理界面,属于典型的Web请求-响应模式,对冷启动延迟敏感,但计算不复杂。Cloudflare Workers作为边缘函数,在全球数百个节点运行,能提供极低的访问延迟,完美匹配。而AI Agent的运行任务则不同,它可能需要长时间运行(几分钟甚至更久),消耗较多的CPU/内存资源,并且需要访问Docker环境或特定的系统工具。Cloudflare Workers的轻量级、短时运行模型不适合,而Cloudflare Containers(基于Docker容器)则提供了更强的计算能力和更灵活的运行环境,只是成本相对Workers更高。这种“Worker处理轻量交互,Container承载重型任务”的架构,在Serverless领域越来越常见。

2.2 核心组件交互流程解析

整个系统的数据流和工作流可以拆解为以下几个核心环节,理解这个流程对后续的部署和调试至关重要:

  1. 触发与调度 :目前项目没有显式配置定时任务(如Cron Trigger)。一种常见的实践是,通过Cloudflare Workers的 Scheduled 事件,或者外部调用(如手动在管理后台点击按钮)来触发Agent任务。在 worker/ 目录下的代码负责接收这个触发信号。
  2. Agent任务执行 :Worker接收到触发后,会与部署在Cloudflare Containers中的OpenCode Agent服务通信。Worker在这里扮演了“生命周期管理器”和“请求转发器”的角色。它启动(或唤醒)Container,将任务指令(例如“开始本周的资讯收集”)传递给Agent。
  3. 智能内容收集与处理 :OpenCode Agent开始工作。它根据预设的“技能”(Skills)和配置(比如关注哪些信息源、使用什么关键词),调用集成的工具。本项目关键地集成了 Firecrawl 服务。Firecrawl不是一个简单的爬虫,它是一个LLM驱动的网页理解服务。Agent可以把一个URL扔给Firecrawl,Firecrawl会返回一个结构化的JSON,包含页面主要内容、摘要、甚至提取出的特定实体(如论文标题、作者、代码库链接)。这比让Agent自己去解析混乱的HTML要可靠得多。
  4. 通过MCP更新CMS :Agent收集并初步筛选出内容后,它需要把结果存下来。这里用到了一个精妙的协议: 模型上下文协议(MCP) 。你可以把MCP理解为AI Agent和外部工具(这里是Payload CMS)之间的一套标准API。Payload CMS暴露了一系列MCP Server(定义在 collections/ 相关的配置里),比如“创建一篇周刊文章”、“在文章里添加一个资源条目”。Agent通过MCP客户端调用这些Server,就像调用函数一样,将结构化后的内容数据写入数据库(Cloudflare D1)。这个过程完全由Agent自主完成,无需人工编写特定的数据入库接口。
  5. 内容呈现 :数据通过Agent写入D1数据库后,基于Next.js构建的前端网站和Payload CMS的管理后台,就能实时读取并展示这些内容了。Next.js使用App Router,并配合OpenNext适配器,确保其能完美运行在Cloudflare Workers环境中。

注意 :这个流程中最容易出问题的环节是Agent与MCP Server的通信,以及Firecrawl的调用。需要确保环境变量配置正确,网络连通,并且API额度充足。

3. 技术栈深度配置与实操要点

3.1 环境准备:避坑指南

按照官方 README 的步骤走,大概率会在环境配置这一步卡住。以下是我从零搭建时总结的详细步骤和避坑点。

Node.js与包管理器 :要求Node.js v22以上和pnpm v10以上。这里第一个坑是Node版本。有些云开发环境或本地用nvm管理时,可能默认不是v22。务必用 node -v 确认。pnpm的安装也要注意,最好通过Corepack启用( corepack enable pnpm ),这样能保证版本一致性。

Cloudflare账号配置 :这是整个项目的依赖核心。你需要一个Cloudflare账号,并开通Workers、D1、R2、Pages和Container服务。其中Containers在免费套餐中可能受限或需要付费,这是项目运行AI Agent的前提,务必先确认。

  1. 安装Wrangler CLI :这是Cloudflare的官方命令行工具。全局安装: pnpm add -g wrangler 。安装后运行 wrangler login ,完成浏览器认证。
  2. 创建D1数据库 :在项目根目录,执行 wrangler d1 create aigc-weekly-db 。这个命令会在Cloudflare上创建一个名为 aigc-weekly-db 的D1数据库实例,并在本地 wrangler.jsonc 文件中生成对应的绑定配置。 关键点 :记下命令输出中的 database_id ,后面会用到。
  3. 创建R2存储桶 :执行 wrangler r2 bucket create aigc-weekly-assets 。同样,这会在Cloudflare上创建桶,并可能更新 wrangler.jsonc
  4. 手动配置 wrangler.jsonc :这是最容易出错的地方。项目提供的示例配置可能不完整。你需要打开 wrangler.jsonc ,确保 bindings 部分包含以下内容,且 database_id bucket_name 与你刚才创建的一致:
    {
      "bindings": [
        {
          "name": "DB",
          "type": "d1",
          "database_id": "你的-database-id-在这里",
          "database_name": "aigc-weekly-db"
        },
        {
          "name": "STORAGE",
          "type": "r2",
          "bucket_name": "aigc-weekly-assets"
        }
      ],
      // ... 其他配置
    }
    
    此外,还需要一个 PAYLOAD_SECRET 绑定,它是一个环境变量,用于Payload CMS的加密。你可以在Cloudflare Dashboard上为这个Worker设置环境变量,也可以在 wrangler.jsonc 中通过 vars 配置。

3.2 依赖安装与类型生成

在项目根目录运行 pnpm install 通常很顺利。完成后,运行 pnpm generate:types 。这个命令会基于Payload CMS的数据模型( collections/ 下的文件),生成TypeScript类型定义。 这是一个重要步骤 ,它能确保你在后续开发中,Agent通过MCP操作数据时,类型是安全的,能提前发现很多字段名拼写错误或类型不匹配的问题。

如果这一步报错,大概率是Payload的配置或数据库连接有问题。检查你的 .env.local 文件是否已正确配置数据库连接字符串(对于D1,本地开发时Wrangler会模拟,通常不需要手动配置连接串,但需要绑定正确)。

3.3 Agent与MCP的核心配置详解

项目的“智能”大脑在 agent/ 目录下。理解这里的配置,是定制你自己内容策展Agent的关键。

  1. agent/opencode.json :这是OpenCode Agent的主配置文件。里面定义了Agent使用的 模型 (比如 claude-3-5-sonnet gpt-4o )、 MCP Server 的地址、以及一些基础参数(温度、最大token数)。你需要在这里指定Payload CMS的MCP Server地址,通常是 http://localhost:3000/api/mcp (本地开发时)。 重要 :确保你使用的模型API Key有足够的权限和额度。
  2. agent/.opencode/ 目录 :这里定义了Agent的“技能包”。
    • skills/ :技能是Agent能执行的具体任务单元。比如,可能有一个 fetch_ai_news 的技能,里面用自然语言描述了“去Hacker News、arXiv、特定博客寻找AI新闻”的步骤和判断标准。
    • subagents/ :可以定义子Agent,负责更专精的任务,比如一个子Agent专门分析论文,另一个子Agent负责评测开源工具。
    • commands/ :可以扩展一些自定义命令。
    • config.yaml :Agent的整体行为配置,比如默认启用哪些技能、对话风格等。
  3. Firecrawl集成 :这是内容获取的“眼睛”。你需要去 Firecrawl官网 注册获取API Key。然后在 worker/.env.local 中设置 FIRECRAWL_API_KEY=你的key 。Firecrawl按调用次数收费,对于个人项目,初始额度通常够用,但要注意监控使用量。在Agent的技能配置中,会通过类似 @firecrawl.scrape(url) 的方式来调用它。

实操心得 :刚开始配置Agent时,不要急于让它执行复杂的多步骤任务。先写一个最简单的技能,比如“访问特定URL并用Firecrawl提取标题”,测试从触发到写入CMS的整个链路是否通畅。链路通了,再逐步增加技能的复杂性。

4. 本地开发与调试全流程

4.1 双服务启动与联调

项目需要同时运行两个服务:Next.js应用(包含CMS)和Cloudflare Worker(驱动Agent)。

  1. 启动Next.js应用 :在终端1执行 pnpm dev 。这会启动开发服务器在 localhost:3000 。打开浏览器访问 http://localhost:3000/admin ,你应该能看到Payload CMS的登录界面。首次使用需要创建管理员账号。同时, http://localhost:3000 是前端周刊页面。
  2. 启动Worker及Agent容器 :在终端2执行 pnpm dev:worker 。这个命令会做几件事:
    • 启动一个本地的Cloudflare Workers开发环境。
    • 根据配置,尝试构建并启动一个Docker容器来运行OpenCode Agent。 这里需要你的系统已安装Docker且正在运行
    • 将Worker的请求转发到本地这个Agent容器。

启动后,你通常可以通过Worker提供的本地地址(如 http://localhost:8787 )来触发Agent任务。具体触发端点需要查看 worker/ 目录下的代码,可能会是一个特定的HTTP路径,比如 /api/trigger-collect

常见问题1:Docker相关错误 如果报错关于Docker无法连接或镜像构建失败,首先确认Docker Daemon是否运行。在Mac/Windows上,Docker Desktop需要启动。在Linux上,需要确保当前用户在 docker 组中。错误信息通常会给出具体原因,比如缺少 Dockerfile 或依赖下载失败。

常见问题2:Worker与Agent连接失败 两个服务都启动了,但Worker调用Agent超时或报错。检查以下几点:

  • 端口冲突 :确保Worker和Agent容器使用的端口没有冲突。查看 wrangler.jsonc 和Agent配置中的端口设置。
  • 网络连通 :在Docker容器内, localhost 指的是容器自己。所以Worker(宿主机)不能直接用 localhost:容器端口 访问Agent。在开发模式下,Wrangler和Docker通常会自动配置网络桥接,但有时需要手动指定。确保Worker配置中连接Agent的地址是正确的容器主机名或IP(在Docker Compose或Wrangler配置中定义)。
  • 环境变量 :确保 worker/.env.local 中的 FIRECRAWL_API_KEY 等变量已正确设置,并且被注入到了Agent容器中。这通常在 wrangler.jsonc [dev] 配置或Docker构建参数中设置。

4.2 首次数据收集测试

当两个服务都正常运行后,就可以进行第一次数据收集测试了。这通常需要手动发送一个HTTP请求来触发Worker。

你可以使用 curl 命令:

curl -X POST http://localhost:8787/api/collect

或者使用更友好的工具如Postman或Hoppscotch。

触发后,观察两个终端的日志:

  • Worker终端 :会显示收到请求,并尝试与Agent容器通信。
  • Next.js终端 :如果Agent通过MCP成功调用CMS,你会看到Payload CMS的日志,显示创建了新的文章或条目。
  • Agent容器日志 :最详细,会显示OpenCode Agent的思考过程、调用了Firecrawl、以及MCP调用结果。这是调试Agent行为最重要的信息来源。

如果一切顺利,刷新 http://localhost:3000/admin ,你应该能在Payload CMS的后台看到新创建的内容数据。前端页面 http://localhost:3000 也可能随之更新(取决于前端是静态生成还是服务端渲染)。

5. 部署上云与生产环境考量

5.1 分步部署到Cloudflare

本地测试无误后,就可以部署到生产环境了。项目的部署脚本设计得很清晰。

  1. 部署数据库与核心应用

    pnpm deploy
    

    这个命令依次执行:

    • pnpm deploy:database :运行数据库迁移( migrations/ 下的SQL),在Cloudflare D1中创建所需的表结构。 务必确保此步骤成功 ,否则CMS无法工作。
    • pnpm deploy:app :使用OpenNext构建Next.js应用,并将输出部署到Cloudflare Pages。OpenNext是关键,它将Next.js的Serverless函数、图像优化、缓存等特性适配到Cloudflare Workers/Pages环境。

    部署过程中,命令行会输出一个 .vercel/output/ 目录(OpenNext生成)和最终的Pages URL。记下这个URL。

  2. 部署Worker与Agent

    pnpm deploy:worker
    

    这个命令会将 worker/ 目录下的代码部署为Cloudflare Worker,并同时构建和推送Agent的Docker镜像到Cloudflare Container Registry。 注意 :这需要你的Cloudflare账户有Containers的权限,并且可能会产生费用。

    部署成功后,你需要在Cloudflare Dashboard的Workers & Pages部分,找到你部署的Worker,为其配置 环境变量 绑定 。特别是 PAYLOAD_SECRET FIRECRAWL_API_KEY ,以及D1、R2的绑定。虽然在 wrangler.jsonc 中定义了,但部署时可能需要确认或重新绑定。

  3. 配置生产环境MCP地址 :部署后,Next.js应用(CMS)的地址变了,Agent配置中的MCP Server地址也需要更新。你需要修改 agent/opencode.json (或通过环境变量注入),将MCP Server地址从 http://localhost:3000/api/mcp 改为你的生产环境地址,例如 https://your-aigc-weekly.pages.dev/api/mcp

5.2 生产环境优化与监控

项目部署上线只是第一步,要让这个自动化系统稳定运行,还需要考虑以下几点:

  1. 触发机制 :项目没有内置定时任务。在生产环境,你有几种选择:

    • Cloudflare Workers Scheduled Triggers :最优雅的方式。在 wrangler.jsonc 中为你的Worker配置 triggers ,例如每天UTC时间早上8点运行一次。这样完全在Cloudflare生态内。
    • 外部Cron服务 :使用像Cron-job.org、GitHub Actions Scheduled Workflows,甚至另一台服务器上的crontab,定时向你的Worker触发端点发送HTTP请求。
    • 手动触发 :在Payload CMS管理后台增加一个自定义按钮,调用一个API端点来触发Agent。这提供了灵活的手动控制。
  2. 错误处理与重试 :AI Agent的执行可能因为网络波动、第三方API限制(如Firecrawl)、或LLM输出不稳定而失败。在生产环境的Worker代码中,需要增加健壮的错误处理(try-catch)和重试逻辑(尤其是对非永久性错误)。可以考虑将任务状态(进行中、成功、失败)记录到D1数据库中,便于排查。

  3. 成本监控 :主要成本来自三块:

    • Cloudflare Containers :Agent容器运行时长。优化Agent技能,避免无意义的循环或长时间运行,可以节省成本。
    • Firecrawl API :按调用次数计费。控制抓取频率和深度,避免对同一域名短时间内高频请求。
    • 大语言模型API(如Anthropic Claude, OpenAI GPT) :这是大头。Agent的每次“思考”和“调用工具”都会消耗Token。在Agent配置中,合理设置 max_tokens temperature ,并设计高效、简洁的技能提示词,能显著降低成本。
  4. 内容审核与兜底 :虽然AI Agent很强大,但完全自动化的内容发布仍有风险。可以在流程中增加一个“待审核”状态。Agent收集的内容先存入“草稿”或“待审核”分类,由人工在Payload CMS后台快速浏览确认后,再批量发布。这提供了一个安全阀。

6. 定制化开发与扩展思路

这个项目的框架非常棒,但你可能不只想做一个“AIGC周刊”。以下是一些定制化和扩展的方向:

  1. 更换内容领域 :这是最直接的定制。你只需要修改Agent的技能配置( agent/.opencode/skills/ )。例如,做一个“独立游戏开发周刊”,那么技能就应该描述为寻找游戏开发博客、引擎更新(Unity/Unreal)、有趣的游戏设计文章、新的Asset商店资源等。同时,调整Payload CMS的数据模型( collections/ )来匹配新领域的字段,比如游戏项目可能需要“平台”、“引擎”、“截图”等字段。

  2. 增加数据源 :除了Firecrawl,Agent可以集成更多工具。OpenCode支持很多内置和第三方工具。例如:

    • GitHub API工具 :让Agent直接搜索特定主题的Trending仓库。
    • RSS/Atom阅读器工具 :订阅一批高质量博客的RSS源。
    • Twitter/X API工具 :追踪特定话题标签下的热门讨论(需注意API限制)。
    • 自定义API工具 :如果你有内部数据源,可以编写一个简单的HTTP工具让Agent调用。
  3. 优化内容质量 :目前的Agent可能只是收集和简单摘要。你可以通过设计更复杂的技能链来提升质量。例如:

    • 子Agent协作 :一个“侦察兵”Agent负责广撒网收集链接;一个“分析师”Agent负责深度阅读和总结内容亮点;一个“编辑”Agent负责将所有摘要整合成连贯的周刊文章,并撰写引言和结语。
    • 多轮筛选 :第一轮基于关键词和来源可信度筛选;第二轮让Agent对初步筛选的内容进行“精读打分”;只发布分数高于阈值的内容。
    • 去重与归并 :对于同一事件的多篇报道,让Agent识别并尝试归并到同一个主题下。
  4. 丰富前端展示 :Next.js前端目前可能比较基础。你可以利用Next.js 15的App Router和React Server Components,打造更动态的体验。例如:

    • 增加按标签、时间筛选。
    • 实现一个“本周Top 5”的排行榜板块。
    • 增加深色模式、更好的移动端适配。
    • 利用R2存储的图片,实现更炫酷的封面图展示。

这个项目就像一个功能强大的“乐高”套装,提供了AI Agent、Serverless CMS、边缘部署所有这些核心模块。你的任务就是根据自己的需求和创意,把它们重新组合和装饰,构建出属于自己的、独一无二的自动化内容平台。

更多推荐