项目案例

构建 AI 编程趋势日报 Agent:从抓取到推送的完整实战

更新 原创整合
标签
projecttutorialopenai-agents-sdkai-coding

项目目标

每天早上自动抓取 GitHub 上最热的 AI/Agent 仓库和 AI 编程相关新闻,用 LLM 汇总成一份 Markdown 趋势日报。

这个项目适合已经读完 OpenAI Agents SDK 入门、想做一个不太玩具化又能当天跑通的完整项目的开发者。它把工具调用、Agent 编排和输出格式串在一起——做完了你就理解了 Agent 的核心闭环。

如果你想了解为什么 AI 编程是当前最热的 Agent 赛道,参见 AI 编程工具趋势 2026框架更新追踪


技术栈选择

组件 选择 理由
Agent SDK OpenAI Agents SDK (Python) 轻量、官方维护、function_tool 装饰器上手快
数据源 GitHub REST API + RSS GitHub API 有稳定的搜索接口;RSS 抓新闻零成本
LLM gpt-4o-mini 日报任务不需要最强模型,mini 版够用且便宜
部署 Cloudflare Workers Cron Trigger 免费、定时触发、无需维护服务器

不用 LangGraph 或 CrewAI 这类多 Agent 框架——这个项目只有一个 Agent + 两个工具,多 Agent 编框架是过度设计。


Step 1:项目骨架

创建项目目录和依赖:

mkdir ai-coding-trends-agent && cd ai-coding-trends-agent

requirements.txt

openai-agents>=0.0.16
httpx>=0.27.0
feedparser>=6.0.10
python-dotenv>=1.0.0

安装依赖:

pip install -r requirements.txt

.env 文件(填入你自己的 key):

OPENAI_API_KEY=sk-your-key-here
GITHUB_TOKEN=ghp_your-token-here

目录结构:

ai-coding-trends-agent/
├── .env
├── requirements.txt
├── agent.py          # Agent 定义和运行入口
├── tools.py          # 数据抓取工具
└── reports/          # 生成的日报输出目录

Step 2:数据抓取工具

tools.py 封装两个数据源为独立函数,Agent 会通过 function_tool 调用它们:

import os
import httpx
import feedparser

GITHUB_API = "https://api.github.com/search/repositories"

# AI 编程相关 RSS 源(可按需增减)
RSS_FEEDS = [
    "https://www.latent.space/feed",
    "https://simonwillison.net/atom/everything/",
    "https://hnrss.org/newest?q=AI+coding",
]


def fetch_github_trending() -> str:
    """Fetch trending AI/LLM repos created in the last 7 days, sorted by stars."""
    headers = {"Accept": "application/vnd.github+json"}
    token = os.environ.get("GITHUB_TOKEN")
    if token:
        headers["Authorization"] = f"Bearer {token}"

    params = {
        "q": "AI agent LLM coding created:>2026-06-09",
        "sort": "stars",
        "order": "desc",
        "per_page": 10,
    }

    resp = httpx.get(GITHUB_API, params=params, headers=headers, timeout=30)
    resp.raise_for_status()
    items = resp.json().get("items", [])

    if not items:
        return "未找到热门仓库。"

    lines = []
    for item in items[:10]:
        name = item["full_name"]
        stars = item["stargazers_count"]
        lang = item["language"] or "N/A"
        desc = item["description"] or "无描述"
        lines.append(f"- {name} (★{stars}, {lang}): {desc}")

    return "\n".join(lines)


def fetch_ai_news() -> str:
    """Fetch recent AI coding news from RSS feeds."""
    entries = []
    for feed_url in RSS_FEEDS:
        feed = feedparser.parse(feed_url)
        for entry in feed.entries[:5]:
            title = entry.get("title", "")
            link = entry.get("link", "")
            entries.append(f"- {title} ({link})")

    if not entries:
        return "未抓取到新闻。"

    return "\n".join(entries[:15])

Step 3:Agent 定义与报告生成

agent.py 定义 Agent、注册工具、运行并输出 Markdown 日报:

import asyncio
import os
from datetime import datetime

from agents import Agent, Runner, function_tool
from dotenv import load_dotenv

from tools import fetch_github_trending, fetch_ai_news

load_dotenv()


@function_tool
def get_github_trending() -> str:
    """获取近 7 天最热门的 AI/Agent/LLM 仓库。"""
    return fetch_github_trending()


@function_tool
def get_ai_coding_news() -> str:
    """获取最近的 AI 编程相关新闻。"""
    return fetch_ai_news()


trends_agent = Agent(
    name="AI Coding Trends Reporter",
    instructions="""你是一个 AI 编程趋势分析师。使用工具获取数据后,生成一份 Markdown 日报:

## 今日热门仓库
列出 top 5 仓库,每个标注语言、星标数和一句话说明。

## 值得关注的动态
从新闻中选出 3-5 条最值得注意的,每条一句话总结。

## 趋势判断
用一两句话总结今天最值得注意的变化。

输出纯 Markdown,不要多余解释。""",
    tools=[get_github_trending, get_ai_coding_news],
)


async def main():
    result = await Runner.run(trends_agent, "生成今天的 AI 编程趋势日报")

    today = datetime.now().strftime("%Y-%m-%d")
    os.makedirs("reports", exist_ok=True)
    output_path = f"reports/{today}-ai-coding-daily.md"

    with open(output_path, "w", encoding="utf-8") as f:
        f.write(f"# AI 编程趋势日报 · {today}\n\n")
        f.write(result.final_output)

    print(f"日报已保存到 {output_path}")


if __name__ == "__main__":
    asyncio.run(main())

Step 4:本地测试与调试

运行 Agent:

python agent.py

预期输出:日报已保存到 reports/2026-06-16-ai-coding-daily.md

打开生成的文件检查格式是否正确。常见问题:

问题 原因 解决
Authentication failed GITHUB_TOKEN 未设置或过期 检查 .env 文件,GitHub API 不带 token 有速率限制(60 次/小时)
RateLimitError OpenAI API 额度用尽 检查账户余额,或降低 per_page 减少输入 token
报告内容空洞 prompt 不够具体 调整 instructions,明确每段的格式和数量要求
RSS 抓取为空 网络或 RSS 源不可达 检查 RSS_FEEDS 列表中的 URL 是否可访问

调试技巧:在 tools.py 的函数里加 print() 打印原始数据,确认工具返回了内容再让 Agent 处理。


Step 5:部署方向

本地跑通后,下一步是让它每天自动运行。最轻量的方案是 Cloudflare Workers Cron Trigger——免费、定时触发、无需维护服务器。

最小 wrangler.toml 配置:

name = "ai-coding-trends-agent"
main = "src/index.ts"
compatibility_date = "2026-06-01"

[triggers]
crons = ["0 1 * * *"]  # 每天 UTC 01:00(北京时间 09:00)

Worker 入口接收 scheduled 事件,调用 Agent 逻辑。具体实现取决于你的运行时选择(Workers 原生 TypeScript 或 Workers + Python WASM)。

完整的部署方案对比(Serverless / 容器 / 本地定时任务 / 生产级)参见 Agent 部署实操指南。如果你用 TypeScript 开发,也可以参考 OpenAI Agents JS/TS 指南 将项目迁移到 Workers 原生运行时。

本文代码可直接复制为本地项目。后续如发布示例仓库会在这里补充链接。


扩展方向

方向 做法 适合场景
推送到通知渠道 日报生成后调飞书/Slack/邮件 webhook 团队共享
去重 用 SQLite 存已推送的仓库 URL,跳过重复项 连续运行多天后避免重复
加数据库 把每日数据存入 D1/Postgres,支持历史趋势查询 长期追踪
做成网页 用 Astro/Next.js 渲染日报为静态页面 公开分享
多 Agent 拆成"抓取 Agent"+"分析 Agent"+"写作 Agent" 报告质量不够时

扩展时先确认核心闭环(抓取 → 汇总 → 输出)稳定,再逐步加功能。不要一开始就做多 Agent 架构。