从 0 到 1:我的第一个 AI Agent 自动化工作流(附完整代码) 一只用 AI Agent 搭副业产线的程序员写在前面为什么做这个每个周一早上我都要花20-30 分钟做同一件事——打开 Git 仓库翻提交记录回忆上周干了啥然后拼凑成周报发给领导。不是周报多难写是这件事太机械、太重复、太浪费脑力了。作为一个 8 年经验的程序员我决定用自己最擅长的方式解决它写一个 Agent让它自动帮我搞定。这不是什么高大上的项目它就是一个 Go 程序不到 400 行代码。但它是我的第一个真正跑起来的 AI Agent 工作流——从数据采集到 AI 生成再到自动推送全程无人值守。今天我把整个过程开源出来包括完整的代码和部署步骤。如果你也想用 AI 自动化一些重复劳动这篇文章就是一份可以照抄的作业。一、整体架构三步走先看全局不迷路┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ CNB API │ ──→ │ DeepSeek │ ──→ │ 企业微信 │ │ 采集提交记录 │ │ AI 生成周报 │ │ 推送消息 │ └─────────────┘ └─────────────┘ └─────────────┘ Step 1 Step 2 Step 3三步就这么简单步骤做什么技术Step 1从代码仓库拉取本周所有 commit 记录CNB类似 GitHubREST APIStep 2把原始提交记录丢给 AI让它整理成专业周报DeepSeek Chat APIStep 3把生成的周报推送到企业微信群企业微信 Webhook整个流程跑下来大概3 秒。比我自己写快了 10 倍而且不会漏。二、技术选型为什么是 Go说实话这个项目用 Python 也行用 Node.js 也行。但我选 Go 的原因很务实单文件部署go build出来一个二进制扔服务器上就能跑不用装 Python 环境、不用管依赖定时任务内置Go 的cron库一行代码搞定定时执行不用额外配 crontab 或 Windows 计划任务并发友好以后要扩展多仓库、多团队goroutine 天然支持核心依赖就两个import(github.com/robfig/cron/v3// 定时任务)对你没看错HTTP 请求用的标准库net/httpJSON 处理用的标准库encoding/json。零第三方依赖除了 cron。三、Step 1数据采集——从仓库拉取 Commit3.1 配置设计程序通过环境变量配置.env文件长这样# DeepSeek APIAI 生成周报用 DEEPSEEK_API_KEYsk-xxxxx DEEPSEEK_MODELdeepseek-chat # CNB Token代码托管平台 API 认证 CNB_TOKENyour-token # 要监控的仓库列表支持多个 CNB_REPOSorg/repo1,org/repo2 # 企业微信机器人 Webhook WECHATWORK_WEBHOOKhttps://qyapi.weixin.qq.com/cgi-bin/webhook/send?keyxxx # 定时任务每周一早上 7:00 执行 CRON_SPEC0 7 * * 1加载配置的代码很简单typeConfigstruct{DeepSeekAPIKeystringDeepSeekModelstringCNBTokenstringCNBRepos[]stringWeChatWorkWebhookstringCronSpecstring}funcloadConfig()*Config{returnConfig{DeepSeekAPIKey:getEnv(DEEPSEEK_API_KEY,),// ... 其他字段同理}}3.2 调用 CNB 获取提交记录核心逻辑遍历配置的每个仓库按日期范围逐天调用 API 拉取 PushEventfuncfetchEventsFromCNB(cfg*Config,repostring,datestring)([]Commit,error){url:fmt.Sprintf(https://api.cnb.cool/events/%s/-/%s,repo,date)req,_:http.NewRequest(GET,url,nil)req.Header.Set(Authorization,Bearer cfg.CNBToken)resp,err:http.DefaultClient.Do(req)// ... 错误处理// CNB 返回 JSONL 格式每行一个 JSON 对象scanner:bufio.NewScanner(resp.Body)forscanner.Scan(){varevt CNBEvent json.Unmarshal([]byte(scanner.Text()),evt)// 只处理 PushEvent包含代码提交ifevt.Type!PushEvent{continue}for_,c:rangeevt.Payload.Commits{commitsappend(commits,Commit{SHA:c.SHA,Author:c.Author.Name,Message:c.Message,})}}returncommits,nil}几个关键点日期范围计算默认取上周一到上周五工作日。周一早上跑刚好覆盖上一周的完整工作日。只取 PushEventCNB 的 Events API 会返回各种事件类型创建分支、合并 PR 等我们只关心 PushEvent因为那才是真正的代码提交。404 不算错某一天没有提交时CNB 返回 404 而非空数组。这是正常行为跳过即可。3.3 日期范围的坑这里有个容易踩的坑——本周一的计算now:time.Now()weekday:int(now.Weekday())ifweekday0{weekday7}// Go 里周日是 0我们要转成 7thisMonday:now.AddDate(0,0,-(weekday-1)).Truncate(24*time.Hour)lastMonday:thisMonday.AddDate(0,0,-7)lastSunday:thisMonday.AddDate(0,0,-1)Go 的time.Weekday()返回周日0、周一1…周六6。但我们的业务逻辑里一周应该从周一开始所以需要做个转换。这个坑我调试了两次才对记下来免得你踩。四、Step 2AI 生成周报——Prompt 是核心原始的 commit 数据是这样的- init. (a1b2c3d) - 总纲.md (e4f5g6h) - 01.md (i7j8k9l) - W1-个人故事开场.md (m0n1o2p) - Update cover-w1-juejin.png (q3r4s5t)直接发给领导肯定不行。我们需要 AI 做几件事合并同类项同一个功能的多次提交合并成一条去噪音“init.”、“fix”、“Update xxx” 这种无意义提交直接忽略归类整理按项目/模块分组专业语气像人写的周报不像机器吐的日志Prompt 设计systemPrompt:你是一个周报整理助手。把原始代码提交记录整理成简洁、专业的工作周报。 【核心原则】 1. 只基于原始数据归纳绝对不能编造、推测、猜测 2. 合并同类项同一功能的多轮调试提交合并为一条 3. 去噪音1、fix、Update xxx.vue 直接忽略 4. 删掉所有 Merge 相关的信息 【格式要求】 周报日期范围 ### 姓名 **项目名**简要描述 - 工作项 1 - 工作项 2 建议 - 建议 1针对本周数据的建设性意见Prompt 设计的几点经验强调不能编造LLM 很容易发挥明明没有的功能它能给你编出来。必须明确约束给示例在 Prompt 里给出输入→输出的示例比纯文字描述有效得多加建议部分让 AI 不仅整理周报还给出改进建议比如 commit message 太模糊这样领导看了觉得还有附加值调用 DeepSeek APIfuncgenerateReport(cfg*Config,rawDatastring)(string,error){reqBody:ChatRequest{Model:cfg.DeepSeekModel,Messages:[]ChatMessage{{Role:system,Content:systemPrompt},{Role:user,Content:以下是本周的代码仓库动态\nrawData},},}jsonBody,_:json.Marshal(reqBody)req,_:http.NewRequest(POST,https://api.deepseek.com/v1/chat/completions,bytes.NewReader(jsonBody))req.Header.Set(Authorization,Bearer cfg.DeepSeekAPIKey)req.Header.Set(Content-Type,application/json)resp,_:http.DefaultClient.Do(req)// ... 解析返回结果returnchatResp.Choices[0].Message.Content,nil}为什么选 DeepSeek便宜。同样的任务DeepSeek 的价格大概是 GPT-4 的 1/10。对于这种每天/每周跑一次的任务成本几乎可以忽略不计。我这边的实际花费生成一次周报约 0.01 元。五、Step 3推送到企业微信企业微信的群机器人支持 Webhook 方式推送消息非常简单funcsendWeChatWorkMarkdown(webhook,markdownstring)error{msg:WeChatWorkMarkdownMsg{MsgType:markdown,}msg.Markdown.Contentmarkdown jsonBody,_:json.Marshal(msg)resp,_:http.Post(webhook,application/json,bytes.NewReader(jsonBody))// ... 检查返回的 errcodereturnnil}企业微信支持 Markdown 格式所以 AI 生成的周报可以直接渲染成带格式的消息标题加粗、列表缩进、emoji 显示。 如果你用飞书或钉钉逻辑完全一样只是 Webhook URL 和消息格式稍有不同。六、定时执行每周一自动跑用robfig/cron库实现定时任务funcmain(){loadDotEnv()cfg:loadConfig()// 支持立即执行模式daily-report-agent nowiflen(os.Args)1os.Args[1]now{runReport(cfg)return}c:cron.New()c.AddFunc(cfg.CronSpec,func(){runReport(cfg)})c.Start()log.Printf( 周报 Agent 已启动定时: %s,cfg.CronSpec)select{}// 阻塞主 goroutine保持程序运行}CRON_SPEC0 7 * * 1表示每周一早上 7:00执行。上班路上周报已经自己跑到群里了。如果你习惯周五写周报可以改成0 18 * * 5每周五下午 6:00但需要注意当前代码的日期范围是固定取上周一上周五周五跑的话只到周四的数据。想覆盖到周五需要改一下日期计算逻辑取本周一本周五。这是一个简单的改造欢迎 PR。另外加了now参数支持手动触发方便调试./daily-report-agent now# 立即执行一次./daily-report-agent# 定时模式阻塞运行七、实际效果说了这么多看看真实效果。这是企业微信群里收到的周报此处插入截图企业微信周报效果可以看到✅ 日期范围正确✅ 按人名归类✅ 提交记录经过 AI 整理不再是原始的 commit message✅ 末尾有建议部分指出 commit message 可以更规范从杂乱的 commit 列表 → 可读的专业周报全靠中间这层 AI。八、部署指南5 分钟上手前置准备一个代码托管平台的账号和 API TokenCNB / GitHub / GitLab 都行一个 DeepSeek API Key注册就送额度一个企业微信群机器人群里添加机器人复制 Webhook URL部署步骤# 1. 克隆项目gitclone https://github.com/lobster-bujiaban/daily-report-agent.gitcddaily-report-agent# 2. 配置 .env 文件cp.env.example .env# 编辑 .env填入你的 API Key 和 Webhook# 3. 编译需要 Go 1.21go build-odaily-report-agent.测试运行./daily-report-agent now看到企业微信群里收到周报说明一切正常。长期运行根据你的服务器系统选择部署方式Linux推荐方式一systemd 服务最稳定创建/etc/systemd/system/daily-report-agent.service[Unit] DescriptionDaily Report Agent Afternetwork.target [Service] Typesimple WorkingDirectory/opt/daily-report-agent ExecStart/opt/daily-report-agent/daily-report-agent Restarton-failure RestartSec10 [Install] WantedBymulti-user.target启动并设置开机自启sudosystemctl daemon-reloadsudosystemctlenabledaily-report-agentsudosystemctl start daily-report-agent# 查看运行状态sudosystemctl status daily-report-agent# 查看日志sudojournalctl-udaily-report-agent-f方式二nohup快速但不推荐生产环境nohup./daily-report-agentreport.log21方式三crontab如果不想用程序内置定时不启动程序的 cron 模式直接用系统 crontab 调用now模式# 编辑 crontabcrontab-e# 每周五下午 6 点执行018* *5cd/opt/daily-report-agent./daily-report-agent now/var/log/report-agent.log21Windows方式一NSSM 注册为系统服务# 下载 NSSM: https://nssm.cc/downloadnssm install DailyReportAgentC:\path\to\daily-report-agent.exenssmsetDailyReportAgent AppDirectoryC:\path\tonssmstartDailyReportAgent方式二Windows 计划任务schtasks/create/tnDailyReportAgent/trC:\path\to\daily-report-agent.exe now/scweekly/d FRI/st 18:00Docker跨平台通用FROM golang:1.21-alpine AS builder WORKDIR /app COPY . . RUN go build -o daily-report-agent . FROM alpine:latest WORKDIR /app COPY --frombuilder /app/daily-report-agent . COPY .env . CMD [./daily-report-agent]dockerbuild-tdaily-report-agent.dockerrun-d--namereport-agent--restartalways daily-report-agent改造成你自己的这个项目的架构是通用的你可以轻松改造你想做的改哪里换代码平台改fetchEventsFromCNB函数适配 GitHub/GitLab API换 AI 模型改generateReport的 API 地址和 Key支持 OpenAI 兼容接口换推送渠道改sendWeChatWorkMarkdown对接飞书/钉钉/Slack加更多仓库.env里CNB_REPOS逗号分隔添加即可九、踩过的坑写的过程中遇到几个问题分享给你坑 1CNB API 的 404 问题某天没有提交记录时CNB 返回 HTTP 404 而不是空数组。一开始我当错误处理了导致日志里一堆 WARN。后来发现这是正常行为改成静默跳过就好。坑 2Commit Message 的噪音真实的 commit message 并不都像教科书一样规范。你会看到 “1”、“fix”、“12”、“update” 这种毫无意义的 message。如果不过滤AI 生成的周报会很丑。所以在 Prompt 里加了明确的去噪规则。坑 3AI 编造内容第一次跑的时候AI 居然给我编了一个我没做的功能进去。后来在 Prompt 开头加了铁律「绝对不能编造、推测、猜测」并要求只基于传入的原始数据。之后就没再出过这个问题。坑 4时间计算的边界情况当前代码默认取上周一上周五适合周一早上跑。但如果你改成周五跑想取本周一本周五的数据日期范围的计算逻辑就需要调整。这是不同执行时间带来的边界差异改起来不难但要意识到这个坑。十、总结与源码这个项目从想法到跑通花了大约一个周末。代码量不大但它是我副业产线上的第一个产品。它的意义不在于周报本身而在于验证了一个流程数据采集 → AI 处理 → 自动推送这个流程可以复用到很多场景监控告警、日报汇总、竞品追踪……周报只是第一个。 源码地址GitHub - lobster-bujiaban/daily-report-agent欢迎 Star、提 Issue、Fork 改造。如果你做了有趣的改造欢迎 PR 或者给我发邮件交流。写在最后我是龙虾一个 8 年程序员正在用 AI Agent 搭建副业产线。这不是一篇教你赚大钱的文章这是一个普通程序员从 0 到 1 的实践记录。如果你觉得有用点个「在看」就是最大的支持。下周我会写一篇踩坑实录详细记录做这个 Agent 过程中遇到的 5 个坑和解决方案。关注不迷路一只用 AI Agent 搭副业产线的程序员全平台同名虾哥不加班需要定制 AI 工具来聊聊 → lob_ai