AI 工具开发实战(6):开发一个 AI 周报自动生成器——读 Git 日志,生成周报
每周写周报是程序员的固定动作。这个工具自动读取 Git 提交记录,调用 AI 生成一份结构化的周报。
工具做什么
运行 aicr report --since "7 days ago"
↓
1. 读取 Git log(最近 7 天的提交)
2. 按日期和文件分组统计
3. 调用 AI 生成周报
4. 输出 Markdown 格式周报
项目结构
aiweekly/
├── aiweekly.py # CLI 主程序
├── gitlog.py # Git 日志解析
├── reporter.py # AI 周报生成
├── requirements.txt
└── .env
Git 日志解析
# gitlog.py
import subprocess
from datetime import datetime, timedelta
from collections import defaultdict
def get_git_log(since="7 days ago", author=None, repo_path="."):
"""获取 Git 提交记录。"""
cmd = [
"git", "-C", repo_path, "log",
f"--since={since}",
"--pretty=format:%h|%an|%ad|%s",
"--date=short",
"--name-only",
]
if author:
cmd.append(f"--author={author}")
result = subprocess.run(cmd, capture_output=True, text=True)
if result.returncode != 0:
return []
commits = []
lines = result.stdout.strip().split("\n")
i = 0
while i = 4:
commit = {
"hash": parts[0],
"author": parts[1],
"date": parts[2],
"message": parts[3],
"files": [],
}
i += 1
while i 1:
stats["by_file"][parts[0]] += 1
else:
stats["by_file"][f] += 1
return stats
AI 周报生成
# reporter.py
from openai import OpenAI
import os
from dotenv import load_dotenv
load_dotenv()
client = OpenAI(
api_key=os.getenv("DEEPSEEK_API_KEY"),
base_url="https://api.deepseek.com/v1",
)
WEEKLY_PROMPT = """你是一个技术周报撰写助手。根据以下 Git 提交记录生成一份周报。
要求:
1. 用 Markdown 格式
2. 包含以下章节:
- 📊 本周概况(提交数、影响的模块)
- 🔧 主要工作(按模块分类,总结每类改动)
- 🐛 问题修复(如果有 bug fix 类提交)
- ✨ 新增功能(如果有 feature 类提交)
- 📝 下周计划(根据当前进展合理推测)
3. 语言简洁专业,避免冗长
提交记录:
{commit_log}
统计信息:
- 总提交数:{total}
- 提交者:{authors}
- 涉及模块:{modules}
"""
def generate_weekly_report(commits, stats):
"""生成周报。"""
commit_log = "\n".join(
f"[{c['date']}] {c['author']}: {c['message']}"
for c in commits[:100] # 限制最多 100 条
)
authors = ", ".join(
f"{k}({v}次)" for k, v in
sorted(stats["by_author"].items(), key=lambda x: -x[1])
)
modules = ", ".join(
f"{k}({v})" for k, v in
sorted(stats["by_file"].items(), key=lambda x: -x[1])[:10]
)
response = client.chat.completions.create(
model="deepseek-chat",
messages=[{
"role": "system",
"content": WEEKLY_PROMPT.format(
commit_log=commit_log,
total=stats["total_commits"],
authors=authors,
modules=modules,
),
}],
temperature=0.3,
max_tokens=2048,
)
return response.choices[0].message.content
CLI 主程序
#!/usr/bin/env python3
# aiweekly.py
import click
from gitlog import get_git_log, analyze_commits
from reporter import generate_weekly_report
@click.group()
def cli():
"""aiweekly - AI 周报生成器"""
pass
@cli.command()
@click.option("--since", "-s", default="7 days ago", help="起始时间")
@click.option("--author", "-a", default=None, help="按作者筛选")
@click.option("--output", "-o", default=None, help="输出文件(默认打印到终端)")
@click.option("--path", "-p", default=".", help="Git 仓库路径")
def report(since, author, output, path):
"""生成周报。"""
click.echo(f"📊 正在分析 {since} 以来的提交记录...")
commits = get_git_log(since=since, author=author, repo_path=path)
if not commits:
click.echo("❌ 没有找到提交记录")
return
stats = analyze_commits(commits)
click.echo(f"✅ 找到 {stats['total_commits']} 条提交记录")
click.echo("🤖 AI 正在生成周报...")
report = generate_weekly_report(commits, stats)
if output:
with open(output, "w", encoding="utf-8") as f:
f.write(report)
click.echo(f"✅ 周报已保存到 {output}")
else:
click.echo("\n" + report)
@cli.command()
@click.option("--since", "-s", default="7 days ago")
@click.option("--path", "-p", default=".")
def stats(since, path):
"""查看提交统计(不生成周报)。"""
commits = get_git_log(since=since, repo_path=path)
if not commits:
click.echo("❌ 没有提交记录")
return
s = analyze_commits(commits)
click.echo(f"📊 {since} 以来的统计:")
click.echo(f" 总提交:{s['total_commits']}")
click.echo(f" 提交者:{dict(s['by_author'])}")
click.echo(f" 提交日期:{dict(sorted(s['by_date'].items()))}")
if __name__ == "__main__":
cli()
使用方式
# 生成本周周报
aiweekly report --since "7 days ago"
# 📊 正在分析 7 days ago 以来的提交记录...
# ✅ 找到 23 条提交记录
# 🤖 AI 正在生成周报...
#
# ## 📊 本周概况
# 本周共完成 23 次提交,涉及 api、models、frontend 等 8 个模块...
#
# ## 🔧 主要工作
# ### API 层(8 次提交)
# - 新增用户认证中间件
# - 优化知识库查询接口性能
# ...
# 保存到文件
aiweekly report -o weekly_report.md
# 查看统计
aiweekly stats
# 📊 7 days ago 以来的统计:
# 总提交:23
# 提交者:{'张三': 15, '李四': 8}
成本
一次周报生成约 2000-5000 token,费用约 ¥0.01-0.02。
总结
AI 周报生成器的核心:
1. 用 git log 获取原始数据
2. 统计分类(按日期、作者、模块)
3. 把数据喂给 AI → 生成结构化周报
比手工写省 90% 的时间,比模板填空效果好。
本文是 《AI 开发者工具链实战》 系列的第 6 篇。
本文由 Zyentor(智元界)原创发布