技术教程 · 阅读约 8 分钟

用 OpenAI Codex CLI 做代码审查,30 行脚本搞定整个 repo

用 OpenAI Codex CLI 做代码审查,30 行脚本搞定整个 repo

很多人用 Codex 还停留在「问一问、改一改」的阶段。但其实 Codex 真正厉害的地方,是可以批量跑——把整个项目喂进去,让它系统性地找 bug、发现安全漏洞、输出改进建议。

而且最近 Codex 送重置次数了,这个时间点正好来聊聊怎么把它的能力榨干。


痛点:手动 code review 有多累

你提了一个 PR,reviewer 要花 1-2 小时逐行看,还不一定能发现所有问题。更别说历史代码——那些「先跑起来再说」留下来的技术债,根本没人有时间系统清理。

AI review 不是来替代人的,而是在人工 review 之前先跑一遍,把明显的问题过滤掉,让 reviewer 把精力花在架构和业务逻辑上。


思路

1. 遍历指定目录下的所有代码文件

2. 每个文件单独送给模型,附上定制的 review prompt

3. 汇总输出到一个 Markdown 报告

模型用 gpt-4.1 或 claude-sonnet-4-5 都行,取决于你的预算和偏好。


完整代码(Python,约 80 行)


#!/usr/bin/env python3

"""

repo_review.py - 用 AI 批量审查代码仓库

依赖: pip install openai

"""



import os

import sys

from pathlib import Path

from openai import OpenAI



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

BASE_URL   = "https://api2everything.xyz/v1"

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

MODEL      = "gpt-4.1"          # 也可换成 claude-sonnet-4-5

MAX_TOKENS = 1024

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

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

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



client = OpenAI(api_key=API_KEY, base_url=BASE_URL)



REVIEW_PROMPT = """你是一位资深工程师,正在做代码 review。

请针对以下代码,按照这个格式给出反馈:



### 🐛 潜在 Bug

(列出逻辑错误、边界条件缺失等)



### 🔒 安全风险

(SQL 注入、未转义输入、硬编码密钥等)



### ⚡ 性能问题

(不必要的循环、重复 IO、内存泄漏风险等)



### 💡 改进建议

(可读性、命名、结构优化等,限 3 条以内)



如果这段代码没有明显问题,直接回复 `✅ 无明显问题`,不要凑字数。



文件名:{filename}

{code}






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

    result = []

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

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

            continue

        if path.suffix in EXTENSIONS and path.is_file():

            result.append(path)

    return sorted(result)





def review_file(filepath: Path) -> str:

    try:

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

    except Exception as e:

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



    # 超长文件只取前 300 行,避免超出 context

    lines = code.splitlines()

    if len(lines) > 300:

        code = "\n".join(lines[:300]) + "\n\n# ... (文件过长,已截断)"



    prompt = REVIEW_PROMPT.format(filename=filepath.name, code=code)



    try:

        resp = client.chat.completions.create(

            model=MODEL,

            messages=[{"role": "user", "content": prompt}],

            max_tokens=MAX_TOKENS,

            temperature=0.2,

        )

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

    except Exception as e:

        return f"API 调用失败: {e}"





def main():

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

    files = collect_files(root)



    if not files:

        print("没有找到可审查的代码文件")

        return



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



    report_lines = [f"# Code Review 报告\n\n扫描路径:`{root}`\n\n---\n"]



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

        rel = filepath.relative_to(root)

        print(f"[{i}/{len(files)}] 审查 {rel} ...", end=" ", flush=True)



        result = review_file(filepath)

        skipped = result.strip().startswith("✅")

        print("跳过" if skipped else "完成")



        if not skipped:

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



    report_path = Path("review_report.md")

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

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





if __name__ == "__main__":

    main()


跑起来


# 设置 key(无量Api 的 key 直接用)

export OPENAI_API_KEY=sk-xxxx



# 审查当前目录

python repo_review.py .



# 审查指定目录

python repo_review.py ./src

输出是一个 review_report.md,只包含有问题的文件,没问题的自动跳过,不会产生噪音。


几个实用调整

换成 Claude 做 review:把 MODEL 改成 claude-sonnet-4-5,对复杂逻辑的理解通常更细腻,但速度稍慢。

并发加速:文件多的时候可以用 ThreadPoolExecutor 并发跑,10 个 worker 大概能快 5-8 倍。

过滤级别:在 prompt 里加一句「只报告严重程度 High 以上的问题」,可以大幅减少输出噪音,适合接入 CI。

接入 pre-commit:把脚本改成只扫 git diff --name-only 的文件,每次提交前自动跑,几秒出结果。


关于 Codex 档位问题

V2EX 上有人在聊 Codex 用 gpt-4.5 的哪个档位性价比最高。实际上对于 review 这种任务,gpt-4.1 已经够用,准确率和 4.5 差距不大,价格便宜很多。如果你是通过官方 API 用,可以对比一下 token 单价,算下来差距挺明显的。


省钱 60% 的方案

上面代码里的 base_url 用的是 无量Api(api2everything.xyz),国内直连,不需要代理。支持 OpenAI / Claude / Gemini / DeepSeek 等 300+ 模型,比官方便宜 65%,SVIP 还有 7.7 折。

对于跑 repo review 这种批量任务,token 消耗不小,价格差就很明显了。注册送 ¥1,余额永久有效,可以先试试。

改接入点只需要一行:


client = OpenAI(api_key="你的key", base_url="https://api2everything.xyz/v1")

其他代码完全不用动。


你们目前用什么工具做 AI code review?有没有接入 CI 的经验?评论区聊聊,有问题也可以直接问。

觉得有用的话点个赞,下次继续写 AI 工程化的实战内容。