技术教程 · 阅读约 8 分钟

用 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 发现的问题」的续篇。