技术教程 · 阅读约 7 分钟

用 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 等实战内容。