用 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 做代码语义搜索」等实战文章。