技术教程 · 阅读约 7 分钟

用 30 行 Python 让 AI 帮你审完整个代码仓库(附完整可运行代码)

用 30 行 Python 让 AI 帮你审完整个代码仓库(附完整可运行代码)

你写代码的时候有没有这种感觉:PR 堆了一周,自己审查累得要死,还总在低级错误上翻车。

其实现在完全可以让 AI 替你做第一道审查,把明显的问题过滤掉,你只需要把精力放在架构决策上。

下面这个脚本我自己在用,核心逻辑不到 30 行,能遍历整个 repo、逐文件调用模型做 code review,最后输出一份 Markdown 报告。


思路拆解

整个流程很简单:

1. 递归遍历目录,过滤掉不需要看的文件(node_modules、.git、二进制文件等)

2. 把文件内容塞给模型,附上一段结构化的 review prompt

3. 把每个文件的反馈汇总成报告,写入 review_report.md

模型用 gpt-4.1 或者 claude-sonnet-4-5 都行,接口是 OpenAI 格式,改一个 base_url 就能切换。


完整代码


import os

import sys

from pathlib import Path

from openai import OpenAI



# ✅ 改这一行就能用,国内直连,不需要梯子

client = OpenAI(

    api_key=os.environ.get("API_KEY", "your-key-here"),

    base_url="https://api2everything.xyz/v1",

)



# 跳过这些目录和扩展名

SKIP_DIRS = {".git", "node_modules", "__pycache__", ".venv", "dist", "build"}

SKIP_EXTS = {".png", ".jpg", ".jpeg", ".gif", ".svg", ".ico", ".lock", ".bin"}

MAX_FILE_CHARS = 8000  # 避免单文件太长超出上下文



REVIEW_PROMPT = """你是一位资深代码审查工程师。请对以下代码进行审查,重点关注:

1. 潜在的 Bug 或逻辑错误

2. 安全漏洞(SQL 注入、未校验输入、硬编码密钥等)

3. 性能问题

4. 可读性和命名规范



请用中文输出,格式为:

- **问题**:具体描述

- **位置**:大致行号或函数名

- **建议**:如何改进



如果代码没有明显问题,直接回复「✅ 无明显问题」。

"""



def should_skip(path: Path) -> bool:

    if any(part in SKIP_DIRS for part in path.parts):

        return True

    if path.suffix.lower() in SKIP_EXTS:

        return True

    return False



def review_file(filepath: Path, model: str = "gpt-4.1-mini") -> str:

    try:

        content = filepath.read_text(encoding="utf-8", errors="ignore")

    except Exception as e:

        return f"❌ 读取失败:{e}"



    if len(content.strip()) < 10:

        return "⏭ 文件为空,跳过"



    if len(content) > MAX_FILE_CHARS:

        content = content[:MAX_FILE_CHARS] + "\n\n[...文件过长,已截断...]"



    response = client.chat.completions.create(

        model=model,

        messages=[

            {"role": "system", "content": REVIEW_PROMPT},

            {"role": "user", "content": f"文件路径:{filepath}\n\n```\n{content}\n```"},

        ],

        temperature=0.2,

    )

    return response.choices[0].message.content.strip()



def review_repo(repo_path: str, model: str = "gpt-4.1-mini"):

    root = Path(repo_path)

    files = [p for p in root.rglob("*") if p.is_file() and not should_skip(p)]



    print(f"📁 共找到 {len(files)} 个文件,开始审查...\n")



    report_lines = [f"# Code Review 报告\n\n仓库路径:`{repo_path}`\n"]



    for i, filepath in enumerate(files, 1):

        rel_path = filepath.relative_to(root)

        print(f"[{i}/{len(files)}] 正在审查:{rel_path}")



        result = review_file(filepath, model=model)

        report_lines.append(f"\n## `{rel_path}`\n\n{result}\n")



    report_path = root / "review_report.md"

    report_path.write_text("\n".join(report_lines), encoding="utf-8")

    print(f"\n✅ 审查完成,报告已写入:{report_path}")



if __name__ == "__main__":

    target = sys.argv[1] if len(sys.argv) > 1 else "."

    review_repo(target)


跑起来


pip install openai



# 设置 API Key(在无量Api 注册后获取,注册送 ¥1)

export API_KEY="sk-xxxxxxxx"



# 审查当前目录

python review_repo.py .



# 或者指定路径

python review_repo.py /path/to/your/project

跑完会在项目根目录生成一个 review_report.md,按文件分节,问题一目了然。


模型选择建议

| 场景 | 推荐模型 | 说明 |

|------|----------|------|

| 快速过滤 | gpt-4.1-mini | 速度快、成本低,适合大型 repo |

| 深度审查 | claude-sonnet-4-5 | 逻辑推理更强,适合核心模块 |

| 安全审计 | gemini-2.5-pro | 对安全漏洞的识别相对全面 |

只需要改 model= 这个参数,其他不用动,这就是 OpenAI 格式兼容的好处。


关于费用

审查一个中等规模的 Python 项目(~50 个文件,~5000 行代码),用 gpt-4.1-mini 大概消耗不到 ¥0.5。如果你直接用 OpenAI 官方 API,同样的用量大概要 ¥1.4 左右。

我自己用的是 无量Api,国内直连不需要梯子,价格比官方便宜 60% 以上,支持 300+ 模型统一入口,注册就送 ¥1 余额,拿来跑这个脚本够用很久了。改一行 base_url 就接入,迁移成本基本为零。


几个可以继续扩展的方向

  • 只审查 diff:结合 git diff HEAD~1 的输出,只把改动的部分喂给模型,更聚焦
  • CI 集成:把这个脚本加到 GitHub Actions,每次 PR 自动触发
  • 自定义规则:在 REVIEW_PROMPT 里加上你们团队的编码规范,让模型按规范审

有遇到问题或者想聊具体用法的,评论区留言,我看到都会回。觉得有用的话点个赞,后续还会写更多 AI 工程化的实战内容。