技术教程 · 阅读约 8 分钟

用 Codex CLI + 国内直连 API,30 行脚本帮你 Review 整个 Repo

用 Codex CLI + 国内直连 API,30 行脚本帮你 Review 整个 Repo

很多人不知道:OpenAI Codex CLI 本质上就是一个带 shell 权限的 GPT-4o agent,你完全可以用兼容 OpenAI 格式的第三方 API 驱动它——不需要翻墙,不需要信用卡,token 费用直接省 60%。

这篇文章教你搭一套「本地 Codex 代码审查流水线」,扫完整个 repo 给出 review 报告,顺带解决国内访问的问题。


为什么要自己跑 Code Review?

  • CI 里的 lint 只查语法,逻辑漏洞、安全隐患它不管
  • GitHub Copilot Review 要订阅,团队用贵得要命
  • 手动 Review 漏看概率随代码量线性增长

一个可编程的 LLM agent 做 review,好处是:提示词可定制、输出结构化、能集成进 CI/CD。


环境准备


pip install openai gitpython

Node 版本类似,本文用 Python。


核心思路

1. 用 git diff 或 git log 拿到最近改动的文件列表

2. 逐文件读取内容,组装成 prompt

3. 调用 Chat Completions API,让模型给出 review 意见

4. 把结果汇总写成 Markdown 报告


完整代码(可直接运行)


#!/usr/bin/env python3

"""

repo_review.py  —  用 LLM 对最近改动文件做 Code Review

用法: python repo_review.py [--since HEAD~5] [--model gpt-4o]

"""



import argparse

import subprocess

from pathlib import Path

from openai import OpenAI



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

client = OpenAI(

    api_key="sk-xxxxxxxxxxxxxxxx",   # 换成你的 key

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

)

DEFAULT_MODEL = "gpt-4o"

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



SYSTEM_PROMPT = """你是一位严格的高级工程师,负责 Code Review。

请按以下维度逐条输出:

1. 🐛 潜在 Bug

2. 🔒 安全风险

3. ⚡ 性能隐患

4. 📖 可读性 / 命名问题

5. ✅ 值得肯定的地方



每条给出文件名 + 行号 + 具体建议,无问题的维度直接写「无」。

输出 Markdown 格式。"""





def get_changed_files(since: str) -> list[str]:

    """返回 since 以来变更的 .py / .ts / .js / .go 文件列表"""

    result = subprocess.run(

        ["git", "diff", "--name-only", since, "HEAD"],

        capture_output=True, text=True, check=True

    )

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

    return [

        f for f in result.stdout.strip().splitlines()

        if Path(f).suffix in exts and Path(f).exists()

    ]





def review_file(filepath: str, model: str) -> str:

    content = Path(filepath).read_text(errors="replace")

    if len(content) > 12000:          # 超长文件截断,避免爆 context

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



    resp = client.chat.completions.create(

        model=model,

        messages=[

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

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

        ],

        temperature=0.2,

    )

    return resp.choices[0].message.content





def main():

    parser = argparse.ArgumentParser()

    parser.add_argument("--since",  default="HEAD~3",  help="git diff 起点,默认最近3次提交")

    parser.add_argument("--model",  default=DEFAULT_MODEL)

    parser.add_argument("--output", default="review_report.md")

    args = parser.parse_args()



    files = get_changed_files(args.since)

    if not files:

        print("没有找到需要 review 的文件,退出。")

        return



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

    report_lines = [f"# Code Review Report\n\n> 基于 `{args.since}..HEAD` 的变更\n"]



    for f in files:

        print(f"  → {f}")

        result = review_file(f, args.model)

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



    report = "\n".join(report_lines)

    Path(args.output).write_text(report, encoding="utf-8")

    print(f"\n✅ 报告已写入 {args.output}")





if __name__ == "__main__":

    main()


跑起来


# review 最近 5 次提交改动的文件

python repo_review.py --since HEAD~5



# 指定模型,换成 claude-3-5-sonnet 也行

python repo_review.py --since HEAD~5 --model claude-3-5-sonnet-20241022



# 输出到自定义路径

python repo_review.py --output docs/review_2025.md

生成的 review_report.md 长这样:


# Code Review Report



> 基于 `HEAD~5..HEAD` 的变更



---



## `src/auth/login.py`



1. 🐛 潜在 Bug

   - 第 42 行:`user_id` 未做类型校验,传入字符串时会静默失败 ...



2. 🔒 安全风险

   - 第 78 行:SQL 拼接未参数化,存在注入风险 ...

...


几个实用技巧

批量并发:文件多时可用 asyncio + AsyncOpenAI 并发调用,速度提升 3-5x。

集成 CI:在 GitHub Actions 里加一步,PR 触发自动 review,结果 comment 到 PR 上。

换模型做对比:--model deepseek-r1 跑一遍逻辑分析,--model gpt-4o 再跑一遍安全审查,两份报告对照看。

控制成本:gpt-4o-mini 价格极低,日常 review 足够;重要发布前再用 gpt-4o 或 claude-opus。


关于 API 费用

这套脚本每次 review 大概消耗 5k-20k tokens,用官方 OpenAI 大概 ¥0.3-1.2/次,频繁跑确实有点肉疼。

我最近切到了无量Api(api2everything.xyz),同样的 gpt-4o,价格比官方便宜约 65%,支持国内直连,把上面代码里的 base_url 改一行就能用,余额永久不过期,注册还送 ¥1 试用。

注册地址:https://api2everything.xyz

遇到问题欢迎评论区问,比如「怎么把 review 结果自动 comment 到 PR」「怎么过滤掉第三方库文件」这类需求我都可以继续写。

觉得有用的话点个赞,后续还会出「用 LLM 自动生成 changelog」「本地跑 embedding 做代码语义搜索」等实战文章。