AI Agent+Serverless自动化内容策展:从架构到部署实战
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 核心组件交互流程解析
整个系统的数据流和工作流可以拆解为以下几个核心环节,理解这个流程对后续的部署和调试至关重要:
- 触发与调度 :目前项目没有显式配置定时任务(如Cron Trigger)。一种常见的实践是,通过Cloudflare Workers的
Scheduled事件,或者外部调用(如手动在管理后台点击按钮)来触发Agent任务。在worker/目录下的代码负责接收这个触发信号。 - Agent任务执行 :Worker接收到触发后,会与部署在Cloudflare Containers中的OpenCode Agent服务通信。Worker在这里扮演了“生命周期管理器”和“请求转发器”的角色。它启动(或唤醒)Container,将任务指令(例如“开始本周的资讯收集”)传递给Agent。
- 智能内容收集与处理 :OpenCode Agent开始工作。它根据预设的“技能”(Skills)和配置(比如关注哪些信息源、使用什么关键词),调用集成的工具。本项目关键地集成了 Firecrawl 服务。Firecrawl不是一个简单的爬虫,它是一个LLM驱动的网页理解服务。Agent可以把一个URL扔给Firecrawl,Firecrawl会返回一个结构化的JSON,包含页面主要内容、摘要、甚至提取出的特定实体(如论文标题、作者、代码库链接)。这比让Agent自己去解析混乱的HTML要可靠得多。
- 通过MCP更新CMS :Agent收集并初步筛选出内容后,它需要把结果存下来。这里用到了一个精妙的协议: 模型上下文协议(MCP) 。你可以把MCP理解为AI Agent和外部工具(这里是Payload CMS)之间的一套标准API。Payload CMS暴露了一系列MCP Server(定义在
collections/相关的配置里),比如“创建一篇周刊文章”、“在文章里添加一个资源条目”。Agent通过MCP客户端调用这些Server,就像调用函数一样,将结构化后的内容数据写入数据库(Cloudflare D1)。这个过程完全由Agent自主完成,无需人工编写特定的数据入库接口。 - 内容呈现 :数据通过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的前提,务必先确认。
- 安装Wrangler CLI :这是Cloudflare的官方命令行工具。全局安装:
pnpm add -g wrangler。安装后运行wrangler login,完成浏览器认证。 - 创建D1数据库 :在项目根目录,执行
wrangler d1 create aigc-weekly-db。这个命令会在Cloudflare上创建一个名为aigc-weekly-db的D1数据库实例,并在本地wrangler.jsonc文件中生成对应的绑定配置。 关键点 :记下命令输出中的database_id,后面会用到。 - 创建R2存储桶 :执行
wrangler r2 bucket create aigc-weekly-assets。同样,这会在Cloudflare上创建桶,并可能更新wrangler.jsonc。 - 手动配置
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的关键。
-
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有足够的权限和额度。 -
agent/.opencode/目录 :这里定义了Agent的“技能包”。skills/:技能是Agent能执行的具体任务单元。比如,可能有一个fetch_ai_news的技能,里面用自然语言描述了“去Hacker News、arXiv、特定博客寻找AI新闻”的步骤和判断标准。subagents/:可以定义子Agent,负责更专精的任务,比如一个子Agent专门分析论文,另一个子Agent负责评测开源工具。commands/:可以扩展一些自定义命令。config.yaml:Agent的整体行为配置,比如默认启用哪些技能、对话风格等。
- 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)。
- 启动Next.js应用 :在终端1执行
pnpm dev。这会启动开发服务器在localhost:3000。打开浏览器访问http://localhost:3000/admin,你应该能看到Payload CMS的登录界面。首次使用需要创建管理员账号。同时,http://localhost:3000是前端周刊页面。 - 启动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
本地测试无误后,就可以部署到生产环境了。项目的部署脚本设计得很清晰。
-
部署数据库与核心应用 :
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。 -
部署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中定义了,但部署时可能需要确认或重新绑定。 -
配置生产环境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 生产环境优化与监控
项目部署上线只是第一步,要让这个自动化系统稳定运行,还需要考虑以下几点:
-
触发机制 :项目没有内置定时任务。在生产环境,你有几种选择:
- 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。这提供了灵活的手动控制。
- Cloudflare Workers Scheduled Triggers :最优雅的方式。在
-
错误处理与重试 :AI Agent的执行可能因为网络波动、第三方API限制(如Firecrawl)、或LLM输出不稳定而失败。在生产环境的Worker代码中,需要增加健壮的错误处理(try-catch)和重试逻辑(尤其是对非永久性错误)。可以考虑将任务状态(进行中、成功、失败)记录到D1数据库中,便于排查。
-
成本监控 :主要成本来自三块:
- Cloudflare Containers :Agent容器运行时长。优化Agent技能,避免无意义的循环或长时间运行,可以节省成本。
- Firecrawl API :按调用次数计费。控制抓取频率和深度,避免对同一域名短时间内高频请求。
- 大语言模型API(如Anthropic Claude, OpenAI GPT) :这是大头。Agent的每次“思考”和“调用工具”都会消耗Token。在Agent配置中,合理设置
max_tokens和temperature,并设计高效、简洁的技能提示词,能显著降低成本。
-
内容审核与兜底 :虽然AI Agent很强大,但完全自动化的内容发布仍有风险。可以在流程中增加一个“待审核”状态。Agent收集的内容先存入“草稿”或“待审核”分类,由人工在Payload CMS后台快速浏览确认后,再批量发布。这提供了一个安全阀。
6. 定制化开发与扩展思路
这个项目的框架非常棒,但你可能不只想做一个“AIGC周刊”。以下是一些定制化和扩展的方向:
-
更换内容领域 :这是最直接的定制。你只需要修改Agent的技能配置(
agent/.opencode/skills/)。例如,做一个“独立游戏开发周刊”,那么技能就应该描述为寻找游戏开发博客、引擎更新(Unity/Unreal)、有趣的游戏设计文章、新的Asset商店资源等。同时,调整Payload CMS的数据模型(collections/)来匹配新领域的字段,比如游戏项目可能需要“平台”、“引擎”、“截图”等字段。 -
增加数据源 :除了Firecrawl,Agent可以集成更多工具。OpenCode支持很多内置和第三方工具。例如:
- GitHub API工具 :让Agent直接搜索特定主题的Trending仓库。
- RSS/Atom阅读器工具 :订阅一批高质量博客的RSS源。
- Twitter/X API工具 :追踪特定话题标签下的热门讨论(需注意API限制)。
- 自定义API工具 :如果你有内部数据源,可以编写一个简单的HTTP工具让Agent调用。
-
优化内容质量 :目前的Agent可能只是收集和简单摘要。你可以通过设计更复杂的技能链来提升质量。例如:
- 子Agent协作 :一个“侦察兵”Agent负责广撒网收集链接;一个“分析师”Agent负责深度阅读和总结内容亮点;一个“编辑”Agent负责将所有摘要整合成连贯的周刊文章,并撰写引言和结语。
- 多轮筛选 :第一轮基于关键词和来源可信度筛选;第二轮让Agent对初步筛选的内容进行“精读打分”;只发布分数高于阈值的内容。
- 去重与归并 :对于同一事件的多篇报道,让Agent识别并尝试归并到同一个主题下。
-
丰富前端展示 :Next.js前端目前可能比较基础。你可以利用Next.js 15的App Router和React Server Components,打造更动态的体验。例如:
- 增加按标签、时间筛选。
- 实现一个“本周Top 5”的排行榜板块。
- 增加深色模式、更好的移动端适配。
- 利用R2存储的图片,实现更炫酷的封面图展示。
这个项目就像一个功能强大的“乐高”套装,提供了AI Agent、Serverless CMS、边缘部署所有这些核心模块。你的任务就是根据自己的需求和创意,把它们重新组合和装饰,构建出属于自己的、独一无二的自动化内容平台。
更多推荐

所有评论(0)