技术教程 · 阅读约 8 分钟

用 30 行 Python 给整个 Repo 做 AI Code Review(附完整可运行代码)

用 30 行 Python 给整个 Repo 做 AI Code Review(附完整可运行代码)

很多人订阅 ChatGPT Pro 或 Claude Max,每月花几百块,但 90% 的时间只是在聊天框里粘贴代码片段——这其实是最低效的用法。

今天聊一个真实场景:让 AI 自动扫描你的整个代码仓库,逐文件给出 review 意见,而不是你一段一段地喂给它。

触发这个想法的是 V2EX 上有人在讨论 Codex 的新功能,以及大家对 GPT 系列模型速度和成本的抱怨。其实很多"ChatGPT 网络问题"、"订阅太贵"的烦恼,换个姿势调 API 就能绕开。


思路

1. 遍历本地 repo,读取所有 .py / .ts / .js 等源文件

2. 每个文件内容作为 prompt 发给模型

3. 让模型返回结构化的 review 意见(问题、建议、严重程度)

4. 汇总输出成一份 Markdown 报告

整个流程不需要任何框架,标准库 + openai SDK 就够了。


完整代码


#!/usr/bin/env python3

"""

repo_review.py — 用 AI 自动 review 整个代码仓库

依赖: pip install openai

"""



import os

import sys

from pathlib import Path

from openai import OpenAI



# ── 配置区 ──────────────────────────────────────────────

client = OpenAI(

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

    base_url="https://api2everything.xyz/v1",   # 国内直连,无需代理

)



MODEL = "gpt-4o"          # 也可以换成 claude-sonnet-4-5 / gemini-2.5-pro

MAX_FILE_BYTES = 40_000   # 超过这个大小的文件跳过,避免超 token

EXTENSIONS = {".py", ".ts", ".js", ".go", ".java", ".rs"}

# ────────────────────────────────────────────────────────





SYSTEM_PROMPT = """你是一位资深工程师,正在做 code review。

对于给定的代码文件,请输出:

1. **潜在 Bug**(如有)

2. **性能隐患**(如有)

3. **可读性 / 可维护性建议**

4. **安全风险**(如有)



每条意见注明严重程度:🔴 高 / 🟡 中 / 🟢 低

如果代码质量良好,直接说"✅ 无明显问题"即可,不要凑字数。

输出语言:中文。"""





def collect_files(root: str) -> list[Path]:

    """递归收集目标扩展名的源文件,跳过 node_modules / .git 等"""

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

    result = []

    for path in Path(root).rglob("*"):

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

            continue

        if path.suffix in EXTENSIONS and path.stat().st_size < MAX_FILE_BYTES:

            result.append(path)

    return sorted(result)





def review_file(path: Path, root: str) -> str:

    """调用 API review 单个文件,返回 Markdown 格式结果"""

    code = path.read_text(encoding="utf-8", errors="ignore")

    rel = path.relative_to(root)



    response = client.chat.completions.create(

        model=MODEL,

        messages=[

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

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

        ],

        temperature=0.2,

    )

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





def main():

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

    files = collect_files(repo_root)



    if not files:

        print("没有找到符合条件的源文件。")

        return



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



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



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

        rel = path.relative_to(repo_root)

        print(f"[{i}/{len(files)}] {rel}")

        result = review_file(path, repo_root)

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



    report = "\n---\n\n".join(report_lines)

    out_path = Path("review_report.md")

    out_path.write_text(report, encoding="utf-8")

    print(f"\n✅ 报告已写入 {out_path}")





if __name__ == "__main__":

    main()


跑起来只需三步


# 1. 安装依赖

pip install openai



# 2. 设置 API Key(去 api2everything.xyz 注册,送 ¥1 余额)

export API_KEY="sk-xxxx"



# 3. 指定你的 repo 路径

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

运行完会在当前目录生成 review_report.md,直接用 Typora 或 VS Code 打开就是一份完整报告。


几个值得注意的细节

模型选择影响很大。 gpt-4o 速度快、综合能力强,适合大多数场景。如果你的项目有复杂的架构问题想深挖,换 claude-sonnet-4-5 往往给出的建议更有深度,它对代码上下文的理解比较细腻。

token 成本怎么算。 一个 500 行的 Python 文件大概消耗 3000-5000 token。用 gpt-4o 的话,review 一个中型项目(50 个文件)大概花 ¥1-2。如果用官方 API,同样的量要贵将近 3 倍。

并发可以加速。 上面的代码是串行的,如果文件多,可以用 concurrent.futures.ThreadPoolExecutor 并发发请求,速度能提升 5-10 倍。这里为了代码简洁没加,有需要的话评论区说一声。

大文件处理。 超过 MAX_FILE_BYTES 的文件会被跳过。如果你有几千行的大文件想 review,可以按函数/类切分后分批发送,这个逻辑用 ast 模块解析 Python 文件很容易实现。


关于 API 成本这件事

很多人卡在"订阅太贵"或者"国内访问不稳定"这两个问题上。其实这两个问题用 API 调用都能绕开——不需要订阅,按量付费,国内直连。

我现在用的是 无量Api,支持 OpenAI / Claude / Gemini / DeepSeek 等 300+ 模型,价格比官方便宜约 65%,SVIP 还有 7.7 折。接入方式就是改一行 base_url,其他代码完全不用动。注册就送 ¥1 余额,够你先跑几十个文件试试效果。


如果你跑起来遇到问题,或者想要并发版本、支持更多语言的版本,评论区说一下,我来补。觉得有用的话点个赞,后续还会写更多 API 实战场景。