用 30 行 Python 让 AI Agent 自动审查整个代码仓库
用 30 行 Python 让 AI Agent 自动审查整个代码仓库
很多人用 AI 审代码的方式是:打开文件,复制粘贴,等回答,再开下一个文件。
这不叫 AI 辅助开发,这叫手动喂饭。
真正的做法是:给 Agent 一个入口,让它自己遍历 repo、识别问题、汇总报告。今天就来实现这个。
为什么 Codex / ChatGPT 网页版做不好这件事
最近 V2EX 上有人反映 Codex 经常在"思考中"卡死。这不是偶发 bug,是架构问题——网页端的 Agent 模式对长上下文、多文件场景本来就不稳定,加上国内访问延迟,卡死是常态。
更根本的问题是:网页端没有办法给 Agent 真正的文件系统访问权限,它能做的只是"看你粘贴过来的内容"。
用 API 自己搭一个就不一样了。
思路:把 repo 变成 Agent 的上下文
核心逻辑很简单:
1. 遍历本地 repo,读取所有 .py / .ts / .js 文件
2. 把文件内容拼成结构化 prompt
3. 调用模型,让它输出问题列表(安全漏洞、代码异味、潜在 bug)
4. 把结果写成 Markdown 报告
不需要 LangChain,不需要向量数据库,30 行核心代码搞定。
完整代码
import os
import glob
from openai import OpenAI
# 改一行 base_url,国内直连,比官方便宜 60%
client = OpenAI(
api_key="your_api_key",
base_url="https://api2everything.xyz/v1"
)
def collect_files(repo_path: str, extensions: list[str]) -> dict[str, str]:
"""遍历 repo,返回 {文件路径: 文件内容}"""
files = {}
for ext in extensions:
for filepath in glob.glob(f"{repo_path}/**/*{ext}", recursive=True):
# 跳过依赖目录
if any(skip in filepath for skip in ["node_modules", ".venv", "__pycache__", ".git"]):
continue
try:
with open(filepath, "r", encoding="utf-8", errors="ignore") as f:
content = f.read()
if len(content.strip()) > 0:
files[filepath] = content
except Exception:
continue
return files
def build_prompt(files: dict[str, str], max_chars: int = 80000) -> str:
"""把文件内容拼成 prompt,控制总长度"""
parts = []
total = 0
for path, content in files.items():
chunk = f"### 文件: {path}\n```\n{content[:3000]}\n```\n"
if total + len(chunk) > max_chars:
parts.append("(文件过多,已截断)")
break
parts.append(chunk)
total += len(chunk)
return "\n".join(parts)
def review_repo(repo_path: str) -> str:
"""主函数:审查 repo,返回 Markdown 报告"""
print(f"正在扫描 {repo_path} ...")
files = collect_files(repo_path, [".py", ".ts", ".js", ".go"])
print(f"找到 {len(files)} 个文件")
file_context = build_prompt(files)
system_prompt = """你是一个资深代码审查工程师。
请分析以下代码,输出结构化的审查报告,包含:
1. 安全漏洞(SQL 注入、未校验输入、硬编码密钥等)
2. 潜在 Bug(空指针、边界条件、异常未处理)
3. 代码异味(重复逻辑、过长函数、命名混乱)
4. 改进建议(每条给出具体修改示例)
用 Markdown 格式输出,按严重程度排序。"""
response = client.chat.completions.create(
model="claude-sonnet-4-5", # 或换成 gpt-4o、deepseek-r1,格式完全兼容
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": f"请审查以下代码:\n\n{file_context}"}
],
max_tokens=4096
)
return response.choices[0].message.content
if __name__ == "__main__":
import sys
repo = sys.argv[1] if len(sys.argv) > 1 else "."
report = review_repo(repo)
output_file = "code_review_report.md"
with open(output_file, "w", encoding="utf-8") as f:
f.write(report)
print(f"\n审查完成,报告已保存到 {output_file}")
print(report[:500] + "...")
运行方式:
pip install openai
python review.py /path/to/your/repo
几个值得注意的细节
模型选择:Claude Sonnet 4.5 在代码理解上比 GPT-4o 更擅长追踪跨文件的逻辑关系。如果 repo 很大、文件间耦合复杂,优先用它。如果只是快速扫一遍找低级错误,deepseek-v3 速度更快、成本更低。
上下文窗口:代码里 max_chars=80000 对应大约 20k token,Claude Sonnet 4.5 支持 200k context,可以放心调大。GPT-4o 是 128k,也够用。
分批处理:如果 repo 超大,可以把 collect_files 的结果按目录分组,多次调用 review_repo,最后合并报告。
增量审查:结合 git diff HEAD~1,只审查本次改动的文件,CI/CD 里接入非常方便。
关于 API 费用
这个脚本跑一次中型 repo(50 个文件),大概消耗 30k-50k token。
用官方 Claude API,claude-sonnet-4-5 大约花 ¥1.5-2.5。
用 无量Api 的话,同样的模型打 7 折,算下来 ¥1 出头。注册还送 ¥1 余额,第一次跑基本免费。接入方式就是改一行 base_url,其他代码一字不动。
扩展方向
- 加一个
--fix参数,让模型直接输出修复后的代码并写回文件 - 接入 GitHub Actions,每次 PR 自动触发审查并评论到 PR 页面
- 换成流式输出(
stream=True),大文件审查时实时看进度
如果你在接入过程中遇到问题,或者想聊聊怎么把这个改造成 CI 里的自动化工具,评论区见。
觉得有用的话点个赞,后续还会写 Agent 多步推理、自动修复 bug 等实战内容。