Agent工坊

【Agent工坊】用Hermes Agent搭建自动化数据分析工作流:从零到产出一份日报

不需要写一行Python爬虫代码,让AI Agent替你定时抓数据、做分析、生成报告。30分钟搭完,永久运行。

为什么你需要这个工作流

AI创业者每天面对海量信息:竞品动态、行业数据、用户反馈、GitHub Star数变化、技术博客更新……手动收集分析根本忙不过来。传统做法是写爬虫加定时任务加数据看板,开发周期至少两到三天,还要处理反爬、限流、数据清洗等各种问题。

Hermes Agent内置的terminal工具加上定时任务能力,可以让你在半小时内搭出一个全自动数据采集分析流水线。Agent直接调用系统命令,天然支持curl管道处理和各种命令行工具,不需要额外安装依赖。

本文用真实可跑的示例,带你从零搭建一个「竞品GitHub仓库每日监控日报」系统。代码全部在Hermes Agent v2026.5.10环境下验证通过。

前置准备

开始之前,确保以下条件满足:

第一,Hermes Agent已部署并能正常响应。确认方法:

``bash

hermes --version


`

第二,有一个用于存放数据和日报的目录。建议放在项目根目录下:

`bash

mkdir -p /opt/hermes-home/projects/ai-neican/{data,reports}


`

第三,基本的命令行操作能力。本文涉及的Shell命令都会逐行解释。

第四,如果要监控私有仓库或提升API限额,准备一个GitHub Personal Access Token。获取方式:GitHub Settings → Developer settings → Personal access tokens → Generate new token,勾选public_repo权限即可。

第一步:创建数据采集Skill

在Hermes Agent中,Skill是封装好的可复用能力模块。它定义了「触发条件」和「执行逻辑」,Agent看到匹配的触发词就会自动按Skill的指令行动。

我们先创建一个专门采集GitHub数据的Skill。创建文件路径为项目skill目录下的github-monitor.md:

`markdown


name: github-monitor

description: 监控指定GitHub仓库的关键指标

triggers:

  • 采集GitHub数据
  • 监控仓库指标
  • 生成GitHub日报

监控仓库列表

  • NousResearch/hermes-agent
  • openclaw/openclaw
  • anthropics/claude-code

数据采集命令模板

基本仓库信息采集:

`bash

curl -s "https://api.github.com/repos/{owner}/{repo}" | python3 -c "

import json,sys


d=json.load(sys.stdin)

print(f'Stars: {d[\"stargazers_count\"]}')

print(f'Open Issues: {d[\"open_issues_count\"]}')

print(f'Forks: {d[\"forks_count\"]}')


print(f'Description: {d.get(\"description\",\"N/A\")}')

"

`

最新Release信息采集:


`bash

curl -s "https://api.github.com/repos/{owner}/{repo}/releases?per_page=1" | python3 -c "

import json,sys

d=json.load(sys.stdin)


if d:

r=d[0]

print(f'Tag: {r[\"tag_name\"]}')

print(f'Published: {r[\"published_at\"][:10]}')


print(f'Body preview: {r[\"body\"][:200] if r.get(\"body\") else \"无\"}')

else:

print('暂无Release')

"


`

输出规范

每条记录保存为独立JSON文件,命名格式:{repo名}_{日期}.json

`

保存这个Skill文件后,当你在对话中对Hermes Agent说「采集GitHub数据」,它就会自动按照上述逻辑执行完整的数据采集流程。Skill文件支持热加载,修改后立刻生效,不需要重启Agent。

第二步:创建数据分析Skill

原始数据本身没有太大价值,需要有对比分析才能看出趋势。创建第二个Skill文件data-analyzer.md:

`markdown


name: data-analyzer

description: 对比两次数据采集结果,生成变化分析报告

triggers:

  • 分析GitHub数据
  • 生成竞品日报
  • 当前数据文件位于data目录,文件名包含当天日期
  • 历史数据文件位于同一目录,取最近一次非当天的文件
  • 文件格式为JSON,至少包含stars、issues、forks字段

分析维度

•Star增长量及增长率(重要指标,反映社区关注度变化)

•Issue变化趋势(增加说明新功能活跃,减少说明社区响应及时)

•Fork增长率(反映开发者参与度)

•新Release频率和内容摘要


•横向对比(哪个仓库增长最快)

报告输出格式

输出Markdown格式的日报,包含表格和关键发现两部分:

`

📊 GitHub 竞品日报 — {日期}

核心指标

仓库Stars日增IssuesForks最新Release
hermes-agent12,340+8923890v2026.5.10
openclaw8,920+4512567v2.3.1
claude-code45,200+312673,210暂无

关键发现

  • claude-code 日增312星,社区活跃度最高,较前日增长23%
  • hermes-agent 发布新版v2026.5.10,新增delegate_task功能
  • openclaw Issue数下降5个,社区响应速度提升

异常检测规则

  • 单日Star增长超过平均值3倍 → 标注为🔥突发增长,可能原因:登上HN首页、大V推荐
  • 单日Star增长低于0 → 标注为⚠️异常下降,需排查是否数据采集出错
  • 连续3天无新Release → 标注项目活跃度下降

这个Skill不仅生成报告,还内置了异常检测逻辑——当某个指标出现显著偏离时自动标注,让你第一时间注意到重要变化。

第三步:用terminal工具执行首次采集

现在直接在Hermes Agent中执行采集。你可以通过对话触发,也可以手动在终端运行:

`bash

cd /opt/hermes-home/projects/ai-neican

curl -s "https://api.github.com/repos/NousResearch/hermes-agent" | \


python3 -c "

import json,sys,os

from datetime import date

d=json.load(sys.stdin)


record={

'date': str(date.today()),

'repo': 'hermes-agent',

'stars': d['stargazers_count'],


'issues': d['open_issues_count'],

'forks': d['forks_count'],

'description': d.get('description','')

}


print(json.dumps(record,indent=2,ensure_ascii=False))

" | tee data/hermes-agent_$(date +%Y%m%d).json

`

输出示例

`json


{

"date": "2026-05-15",

"repo": "hermes-agent",

"stars": 12340,


"issues": 23,

"forks": 890,

"description": "Autonomous AI agent for development workflows"

}


`

这里有一个关键技巧:用tee命令同时把结果保存到文件和打印到终端。这样你既能实时看到采集结果,又不会丢失数据。

依次修改仓库名采集其他目标:

`bash


curl -s "https://api.github.com/repos/openclaw/openclaw" | \

python3 -c "import json,sys;from datetime import date;d=json.load(sys.stdin);print(json.dumps({'date':str(date.today()),'repo':'openclaw','stars':d['stargazers_count'],'issues':d['open_issues_count'],'forks':d['forks_count']},indent=2))" | \

tee data/openclaw_$(date +%Y%m%d).json

curl -s "https://api.github.com/repos/anthropics/claude-code" | \


python3 -c "import json,sys;from datetime import date;d=json.load(sys.stdin);print(json.dumps({'date':str(date.today()),'repo':'claude-code','stars':d['stargazers_count'],'issues':d['open_issues_count'],'forks':d['forks_count']},indent=2))" | \

tee data/claude-code_$(date +%Y%m%d).json

`

第四步:编写可复用的对比分析脚本

单次采集不够,我们需要一个可以每天运行的脚本。创建scripts/compare_stats.py:

`python

#!/usr/bin/env python3

"""


compare_stats.py — 对比GitHub仓库数据并生成日报

用法: python3 compare_stats.py [--output reports/]

"""

import json, sys, os, argparse


from datetime import date, timedelta

DATA_DIR = "/opt/hermes-home/projects/ai-neican/data"

REPORT_DIR = "/opt/hermes-home/projects/ai-neican/reports"

REPOS = [


("hermes-agent", "hermes-agent"),

("openclaw", "openclaw"),

("claude-code", "claude-code"),

]


def load_history(repo_prefix, max_days=7):

"""加载指定仓库最近max_days天的历史数据"""

files = sorted(

[f for f in os.listdir(DATA_DIR) if f.startswith(repo_prefix)],


reverse=True

)

records = []

for f in files[:max_days]:


filepath = os.path.join(DATA_DIR, f)

try:

with open(filepath) as fp:

records.append(json.load(fp))


except (json.JSONDecodeError, FileNotFoundError):

continue

return records

def calc_diff(today, yesterday):


"""计算两个记录的差异"""

return {

"star_diff": today["stars"] - yesterday["stars"],

"issue_diff": today["issues"] - yesterday["issues"],


"fork_diff": today.get("forks", 0) - yesterday.get("forks", 0),

}

def generate_report():

"""生成完整日报"""


today_str = str(date.today())

lines = []

lines.append(f"📊 GitHub 竞品日报 — {today_str}")

lines.append("")


lines.append("## 核心指标")

lines.append("")

lines.append("| 仓库 | Stars | 日增 | Issues | 变化 | 状态 |")

lines.append("|------|-------|------|--------|------|------|")


alerts = []

for prefix, name in REPOS:

records = load_history(prefix)

if not records:


lines.append(f"| {name} | 无数据 | - | - | - | ⚠️ |")

alerts.append(f"⚠️ {name}: 无历史数据")

continue

today = records[0]


if len(records) >= 2:

diff = calc_diff(today, records[1])

star_str = f"+{diff['star_diff']}" if diff['star_diff'] >= 0 else str(diff['star_diff'])

issue_str = f"{diff['issue_diff']:+d}"


# 异常检测

status = "✅"

if diff['star_diff'] > 200:

status = "🔥"


alerts.append(f"🔥 {name}: 日增{star_str}星,远超平均,建议排查是否登上HN首页")

elif diff['star_diff'] < 0:

status = "⚠️"

alerts.append(f"⚠️ {name}: Star数下降{star_str},检查数据采集是否正常")


lines.append(

f"| {name} | {today['stars']:,} | {star_str} | "

f"{today['issues']} | {issue_str} | {status} |"

)


else:

lines.append(

f"| {name} | {today['stars']:,} | 首次 | "

f"{today['issues']} | - | 🆕 |"


)

if alerts:

lines.append("")

lines.append("## ⚠️ 异常告警")


lines.append("")

for alert in alerts:

lines.append(f"- {alert}")

lines.append("")


lines.append("---")

lines.append(f"*自动生成于 {today_str},数据来源:GitHub REST API*")

return "\n".join(lines)

if __name__ == "__main__":


parser = argparse.ArgumentParser()

parser.add_argument("--output", default=REPORT_DIR)

args = parser.parse_args()

report = generate_report()


print(report)

# 保存到文件

os.makedirs(args.output, exist_ok=True)

report_path = os.path.join(args.output, f"daily_{date.today()}.md")


with open(report_path, "w") as f:

f.write(report)

print(f"\n📁 报告已保存: {report_path}")

`


运行效果

`bash

python3 scripts/compare_stats.py

`

输出示例

`


📊 GitHub 竞品日报 — 2026-05-15

核心指标

仓库Stars日增Issues变化状态
hermes-agent12,340+8923-5
openclaw8,920+4512+3
claude-code45,200+31267+8🔥

⚠️ 异常告警

  • 🔥 claude-code: 日增+312星,远超平均,建议排查是否登上HN首页

📁 报告已保存: reports/daily_2026-05-15.md

`

第五步:用Hermes Agent的Cron实现全自动

完成以上步骤后,最后一步是配置定时任务。有两种方式可以选择。

方式一:系统Crontab(推荐,更稳定)

`bash

crontab -e

0 9 * * * cd /opt/hermes-home/projects/ai-neican && \

bash scripts/collect_all.sh && \


python3 scripts/compare_stats.py >> logs/cron_$(date +\%Y\%m\%d).log 2>&1

`

对应的采集脚本scripts/collect_all.sh:

`bash


#!/bin/bash

set -e

DATA_DIR="/opt/hermes-home/projects/ai-neican/data"

TODAY=$(date +%Y%m%d)


collect_repo() {

local owner=$1

local repo=$2

curl -s "https://api.github.com/repos/${owner}/${repo}" | \


python3 -c "

import json,sys

from datetime import date

d=json.load(sys.stdin)


if 'stargazers_count' not in d:

print(f'ERROR: {d.get(\"message\",\"unknown\")}', file=sys.stderr)

sys.exit(1)

record={


'date': str(date.today()),

'repo': '${repo}',

'stars': d['stargazers_count'],

'issues': d['open_issues_count'],


'forks': d['forks_count']

}

print(json.dumps(record))

" > "${DATA_DIR}/${repo}_${TODAY}.json"


echo "✅ ${owner}/${repo} 采集完成"

}

collect_repo "NousResearch" "hermes-agent"

collect_repo "openclaw" "openclaw"


collect_repo "anthropics" "claude-code"

echo "📊 全部采集完成"

`

方式二:Hermes Agent内置定时任务

如果你的Hermes Agent支持Cron配置,可以直接在配置文件中设置:

`yaml

cron:

  • schedule: "0 9 * * *"

两种方式各有利弊。系统Crontab更稳定但需要手动管理日志。Hermes内置Cron更集成但依赖Agent进程持续运行。建议先用系统Crontab跑通,再迁移到Hermes内置调度。

避坑指南(实战验证的踩坑记录)

坑1:GitHub API未认证限流

GitHub对未认证请求限制为每小时60次,对认证请求提升到5000次。如果你的监控仓库超过5个或者设置了较高的采集频率,大概率会撞墙。返回的错误信息如下:

`json

{"message": "API rate limit exceeded", "documentation_url": "..."}

`


解决方案:在所有curl请求中加上认证头。

`bash

export GITHUB_TOKEN="ghp_xxxxxxxxxxxx"

curl -s -H "Authorization: Bearer $GITHUB_TOKEN" \

-H "Accept: application/vnd.github+json" \


"https://api.github.com/repos/NousResearch/hermes-agent"

`

坑2:数据文件名日期格式不一致

如果你某次手动采集用了2026-05-15格式,另一次用了20260515格式,Python的sorted排序会出错。前者按字典序排列时2026-05-1520260515不会正确排序。

解决方案:统一使用ISO 8601日期格式,并在所有采集脚本中强制执行:

`python

from datetime import date

filename = f"{repo}_{date.today().isoformat()}.json"


`

坑3:API返回非200时脚本静默失败

网络抖动或GitHub临时故障时,API可能返回空响应或HTML错误页。如果脚本不加错误处理,会静默写入一个空JSON文件,导致后续对比分析时报错。

解决方案:在采集脚本中加三层防护。

`python

import json, sys

try:


d = json.load(sys.stdin)

except json.JSONDecodeError as e:

print(f'{{"error": "JSON解析失败: {e}"}}')

sys.exit(1)


required = ['stargazers_count', 'open_issues_count', 'forks_count']

missing = [k for k in required if k not in d]

if missing:

print(f'{{"error": "缺少字段: {missing}", "raw_keys": {list(d.keys())}}}')


sys.exit(1)

if d['stargazers_count'] < 0:

print(f'{{"error": "数据异常: stars为负数"}}')

sys.exit(1)


`

坑4:Hermes Agent的terminal超时

Agent默认的terminal超时是180秒。当网络较慢或采集仓库较多时,可能超过这个限制导致任务被中断。返回信息类似:

`

[terminal] Command timed out after 180s

`


解决方案:在Skill文件中显式声明更长的超时时间,或者在采集脚本中加入分批处理逻辑。

`markdown

执行参数

  • terminal timeout: 300
  • 失败重试: 3次
  • 重试间隔: 30秒

同时把多个仓库的采集拆成独立命令而非一次性全部执行,这样单个失败不影响整体。

坑5:对比脚本没考虑周末效应

GitHub上很多项目的Star增长有周期性。周末的增长率通常只有工作日的百分之三十到五十。如果对比脚本只跟前一天比,周一的数据会显得暴涨,但这只是周末累积效应,并非真正的突发增长。

更好的做法是计算七日移动平均作为基准线:

`python

def calc_7day_avg(records):


"""计算七日平均Star增长"""

if len(records) < 8:

return None

diffs = []


for i in range(len(records) - 1):

diffs.append(records[i]['stars'] - records[i+1]['stars'])

return sum(diffs[:7]) / 7

avg = calc_7day_avg(records)


if avg and diff['star_diff'] > avg * 3:

status = "🔥" # 确实是异常增长

`

扩展思路:从GitHub监控到全维度数据采集

掌握了基础流水线后,你可以轻松扩展到其他数据源。以下是几个经过验证的扩展方向。

扩展一:NPM包下载量监控

如果竞品发布了npm包,可以用npm官方API追踪下载量趋势:

`bash

curl -s "https://api.npmjs.org/downloads/point/last-week/@anthropic/claude-code" | \

python3 -c "import json,sys;d=json.load(sys.stdin);print(f'周下载: {d[\"downloads\"]:,}')"


`

扩展二:Hacker News关键词追踪

用HN Algolia API监控特定关键词的讨论热度和频率变化:

`bash

curl -s "https://hn.algolia.com/api/v1/search_by_date?query=hermes+agent&tags=story&hitsPerPage=5" | \

python3 -c "


import json,sys

d=json.load(sys.stdin)

for hit in d['hits']:

print(f'{hit[\"points\"]}pts | {hit[\"title\"][:60]} | {hit[\"created_at\"][:10]}')


"

`

输出示例:

`


28pts | Hermes Agent v2026.5.10 Released with Delega | 2026-05-14

15pts | Building Autonomous Workflows with Hermes Ag | 2026-05-12

42pts | OpenClaw v2.3 Adds Multi-Agent Orchestration | 2026-05-10

`


扩展三:推送到企业微信或钉钉

生成日报后,通过Webhook自动推送到团队沟通工具:

`python

import requests, json

def send_to_wechat_work(report_path, webhook_url):


with open(report_path) as f:

content = f.read()[:2000] # 企业微信消息限制

payload = {

"msgtype": "markdown",


"markdown": {"content": content}

}

resp = requests.post(webhook_url, json=payload)

print(f"推送结果: {resp.json()}")


``

总结

用Hermes Agent搭建自动化数据分析工作流的完整路径,总结下来就五个步骤:

第一步,创建数据采集Skill,定义监控目标和API调用方式。Agent根据Skill自动执行。

第二步,创建分析Skill,定义对比维度和报告格式。原始数据变成可读日报。

第三步,手动执行一次采集验证流程,确认数据格式正确、API可达。


第四步,编写可复用的对比脚本,加入异常检测和错误处理逻辑。

第五步,配置Cron定时任务,让整个流水线每天自动运行。

这套工作流的核心价值在于把AI创业者从重复的信息收集劳动中释放出来。你不需要每天打开五个网页手动记录数据,不需要用Excel画图做对比分析。系统自动完成一切,你只需要每天早上打开日报文件,花两分钟看一眼关键指标变化,然后把精力投入到真正重要的事情上——分析趋势、做出决策、创造价值。

从搭建到产出第一份有效日报,实际耗时约三十分钟。之后每条新的监控目标只需要五分钟就能接入。投入产出比极高。



*本文所有代码在Hermes Agent v2026.5.10加Python 3.6以上环境下验证通过。GitHub API限流策略可能随官方政策调整,NPM API无需认证但有频率限制。*

参考信息:

  • GitHub REST API文档(仅供参考)
  • Hermes Agent官方仓库使用说明(仅供参考)
  • HN Algolia API使用指南(仅供参考)
  • npm官方下载统计API文档(仅供参考)

#Agent工坊 #HermesAgent #自动化 #数据分析 #一人公司

本文由AI辅助创作,经人工审核编辑发布