用 Codex Mobile 的思路,自己搭一个「代码审查 Agent」——30 行 Python 跑通全流程
用 Codex Mobile 的思路,自己搭一个「代码审查 Agent」——30 行 Python 跑通全流程
很多人看到 Codex 登陆 ChatGPT 移动端的消息,第一反应是:终于可以在手机上让 AI 改代码了。
但等你真正用起来,会发现一个问题:它只能看你粘贴进去的片段,看不到整个项目的上下文。
审查一个真实 repo,你需要的不是一个聊天框,而是一个能遍历文件、理解结构、给出有针对性建议的 Agent。这篇文章就教你从零搭一个——代码不超过 80 行,逻辑清晰,可以直接跑。
思路拆解
Codex 本质上是「给模型喂代码上下文 + 让它执行任务」。我们要做的事情完全一样:
1. 遍历本地 repo,收集所有 .py / .ts / .js 文件
2. 把文件内容拼成结构化的 prompt
3. 调用模型,让它扮演 code reviewer
4. 把结果按文件输出,方便逐条处理
整个流程不依赖任何框架,只用 openai 这一个库。
环境准备
pip install openai
然后设置 API Key。如果你用的是官方 OpenAI,需要科学上网,而且价格不便宜。这里我用的是无量 Api,国内直连,兼容 OpenAI 格式,只需要改一个 base_url,价格比官方便宜 60% 以上。
export OPENAI_API_KEY="你的 key"
完整代码
import os
import sys
from pathlib import Path
from openai import OpenAI
# ── 配置区 ──────────────────────────────────────────────
BASE_URL = "https://api2everything.xyz/v1"
MODEL = "gpt-4o" # 也可以换成 claude-sonnet-4-5、deepseek-v3 等
MAX_FILE_CHARS = 8000 # 单文件截断,避免超出 context
EXTENSIONS = {".py", ".ts", ".js", ".go", ".java"}
# ────────────────────────────────────────────────────────
client = OpenAI(
api_key=os.environ["OPENAI_API_KEY"],
base_url=BASE_URL,
)
SYSTEM_PROMPT = """你是一位资深工程师,正在做 code review。
请针对每个文件给出:
1. 潜在 bug 或逻辑问题
2. 性能隐患
3. 可读性 / 命名建议
4. 安全风险(如有)
输出格式:每条建议前标注严重程度 [HIGH] / [MED] / [LOW]。
如果代码没有明显问题,直接说"LGTM",不要凑字数。"""
def collect_files(repo_path: str) -> list[tuple[str, str]]:
"""遍历 repo,返回 [(相对路径, 文件内容), ...]"""
results = []
root = Path(repo_path)
for fp in sorted(root.rglob("*")):
# 跳过隐藏目录、node_modules、__pycache__ 等
parts = fp.parts
if any(p.startswith(".") or p in {"node_modules", "__pycache__", "dist", "build"} for p in parts):
continue
if fp.is_file() and fp.suffix in EXTENSIONS:
try:
content = fp.read_text(encoding="utf-8", errors="ignore")
if content.strip():
results.append((str(fp.relative_to(root)), content[:MAX_FILE_CHARS]))
except Exception:
pass
return results
def review_file(rel_path: str, content: str) -> str:
"""对单个文件调用模型做 review"""
user_msg = f"文件路径:{rel_path}\n\n```\n{content}\n```"
resp = client.chat.completions.create(
model=MODEL,
messages=[
{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": user_msg},
],
temperature=0.2, # review 任务要稳定,温度调低
)
return resp.choices[0].message.content.strip()
def main():
repo_path = sys.argv[1] if len(sys.argv) > 1 else "."
files = collect_files(repo_path)
if not files:
print("没有找到可审查的文件,检查路径和扩展名配置。")
return
print(f"共找到 {len(files)} 个文件,开始审查...\n{'='*60}")
for rel_path, content in files:
print(f"\n## 📄 {rel_path}\n")
result = review_file(rel_path, content)
print(result)
print("\n" + "-"*60)
print("\n✅ 审查完成")
if __name__ == "__main__":
main()
跑起来
# 审查当前目录
python review_agent.py .
# 审查指定项目
python review_agent.py ~/projects/my-app
输出示例:
共找到 12 个文件,开始审查...
============================================================
## 📄 src/auth/token.py
[HIGH] 第 23 行:JWT secret 硬编码在源码中,应从环境变量读取
[MED] 第 41 行:token 过期时间设为 9999 天,存在安全风险
[LOW] 函数命名 `checkTk` 不够语义化,建议改为 `validate_token`
------------------------------------------------------------
## 📄 src/utils/db.py
LGTM
几个实用扩展
换模型只改一行:把 MODEL 改成 claude-sonnet-4-5 或 deepseek-v3,其他代码不动。无量 Api 支持 300+ 模型,格式完全兼容。
批量并发:文件多的时候可以用 concurrent.futures.ThreadPoolExecutor 并发调用,速度提升明显:
from concurrent.futures import ThreadPoolExecutor, as_completed
with ThreadPoolExecutor(max_workers=5) as executor:
futures = {executor.submit(review_file, p, c): p for p, c in files}
for future in as_completed(futures):
path = futures[future]
print(f"\n## 📄 {path}\n")
print(future.result())
输出到文件:加一行重定向就行:
python review_agent.py ~/projects/my-app > review_report.md
关于费用
用官方 GPT-4o 审查一个中型项目(约 50 个文件),大概花 $0.3-0.5。用无量 Api 的话,同样的调用大概 ¥0.5 左右,SVIP 还有 7.7 折,长期跑 CI/CD 流水线的话省下来的钱很可观。
注册还送 ¥1 余额,余额永久有效,可以先试试效果再决定充值。
👉 https://api2everything.xyz/?utm_source=zhihu&utm_medium=article&utm_campaign=daily&aff=wqUb
你的项目里有没有跑出来特别有意思的 review 结果?欢迎评论区贴出来,或者有问题直接问,看到都会回。
觉得有用的话点个赞,后续还会出「让 Agent 自动修复 review 发现的问题」的续篇。