只看改了哪几行,确认不了真问题
常见的自动审查只盯着这次改了哪几行。它得先猜文件里没改到的部分长什么样,再猜那个问题一跑会不会真的出错,最后给出的修改还是一段话,要人自己抄回项目。
教程给出的是一个 233 行的小程序 review.py,只用 Python 自带的功能。它可以在自己的电脑上跑,也可以挡在代码推送之前,或者放进 GitHub Actions(代码合并前的自动检查)。程序把改完的整个文件送进一台临时的 Linux 电脑,让模型把检查跑完,再把修改交回来;只有你明确要求应用到项目,这些修改才会写进代码。
四个模型拿同一处改动试过,里面放了五个问题。一次大约 1 到 4 分钟,花费 0.015 到 0.045 美元。
一轮审查实际在做什么
要做到先跑一遍、再交回修改,模型得看见完整文件,能在一台临时电脑里把检查跑起来,然后把修改交出来,最后按固定栏目交卷。看见文件、跑命令、交修改这三步,都还在测试阶段。
文件上传用的是 Files API。程序交上去的是每个改动文件改完后的全文、你指定的测试,以及这次的改动清单,模型就不用去猜清单没写到的那些代码。上传的文件会在第一条命令执行前放进一台托管的 Linux 电脑。在这台电脑里执行命令的工具叫 openrouter:shell,模型可以在里面跑 Python 和数据库。少了这台电脑,它就只能推测程序跑起来会怎样。
模型交回来的是补丁,工具叫 openrouter:apply_patch。补丁就是一份可以直接套到文件上的改动,新建、改写、删除都可以。写法不合格会被退回,真正去改你项目里文件的,仍是你这边的程序。收尾也不能随便写一段话,模型要调用 submit_review,按固定栏目把每条问题交回来。Claude Haiku 5.5 一旦在同一次请求里用了工具,就不会按表格回答,常常写成散文,还多出栏目,所以最后让它调用这个函数来交卷。
程序从 Git 取出改动清单和改过的文件名,连同测试一起上传,一次最多 19 个文件再加这份清单。模型读完,就写一小段检查跑一遍,确认自己怀疑的问题,同时提出修改。修改一交回来,这一轮会先停住:程序把它套到你电脑上的一份临时副本,再告诉模型这次套上没有。补丁并不进那台临时电脑,检查始终对着你上传时的代码。
模型交卷以后,上传的文件会被删掉,报告写在项目本机、提交时带不走的位置,路径是 .git/ai-review.json。你要求应用到项目,改完的文件才会拷回去。没有问题达到拦截线,或者这次没有东西可审,程序正常结束;有问题达到拦截线,就以失败结束,推送可以被拦住。和模型来回八次还没交卷,或者一次改动超过 19 个文件,程序会停下来,让你把改动拆开审。拦截线默认是“高”,指安全漏洞、数据会丢,或核心功能坏了;“中”是范围有限的错误,“低”是较轻的问题。默认模型是 Claude Haiku 5.5。
跑起来之前,电脑上要有 Python 3.11 或更新版本、Git,以及名为 OPENROUTER_API_KEY 的密钥。文件上传、执行命令和提交修改目前只走全球入口,按地区分开的入口会拒绝。改过的文件会进你的 OpenRouter 账户,并交给提供模型的那一方,所以只拿允许离开本机的代码来跑,文件里不要放密钥。
程序会在这几处停住
等得比较久的请求,如果整包结果一起回来,往往会在中途断开,所以程序改成一直读到这次回答结束;碰上断线或者对方限流,就等 5 秒再要一次。
修改必须马上套到临时副本上,并把套上了还是没套上告诉模型。只回一句已经保存、并不真的套用,模型会把同一份修改再发两到三次。指向项目外面的路径会被直接拒绝,文件写不出去。放进临时电脑的文件名会先按命令规则包好,免得文件名本身被当成一条命令去执行。
每一块修改都按它标出的位置去对整行,而且不会改到上一块之前的内容。位置对不上,这段文字在文件里又不止一处,这块就会被退回,让模型重发。Claude Sonnet 5.5 每次都会带上这种带行号的位置说明。报告里留着完整回复,包括临时电脑的输出和代码片段,放在不会被提交的目录里;上传的文件和临时副本,审查做到一半失败时也会清掉。
原有测试通过了,问题还在
教程拿一个订单小模块来演示。先放上能通过测试的版本,再加进五个问题,原有的两项测试照样通过,因为它们没碰到被改过的地方。这次临时电脑里是 Python 3.11.14 和数据库 SQLite 3.50.4,Python 自带的测试可以直接用,需要另外安装的测试工具则没有预装。
五个问题都在订单文件里。顾客填的状态被直接拼进了数据库查询,顾客编号原来是单独传的,外人可以借这个拼接口子去碰数据库。翻页起点也算错了,第 1 页会跳过前 20 条,返回的是后面那 20 条。“是不是已退款”用错了比较办法,从数据库读出的文字对不上,退款单仍被算进收入。失败后的重试把最后一次错误也吃掉,调用方只拿到一个空结果,分不清是办砸了,还是本来就没有结果。取完订单之后,数据库连接也没关。
把测试文件一并交给审查再跑,Claude Haiku 5.5 给出 5 条发现和 1 份修改,花了 0.0210 美元,用了 184 秒。查询拼接、翻页算错、退款判断这三条是“高”,错误被吃掉是“中”,四条都已确认,检查是当场跑出来的。连接没关只标成“低”,而且没能当场复现:常见的 Python 在函数结束后会把这个连接关掉,所以当时看不出漏了;换一种运行环境,或者查询做到一半出错,连接仍可能留着。
既然有“高”的问题,这次结果就是不通过。五个问题挤在同一个文件里,修改也就只有 1 份。写回项目之后还得把测试再跑一遍,因为临时电脑里的检查对着的是上传时那份代码,写回去以后修好没有,它看不到。
推送前拦住,合并前再查一次
教程把检查放在推送之前,对照的是远程主分支,一并看的还是那份订单测试。例子里先提交审查程序,再提交五个问题,然后推送。检查给出 5 条发现、1 份修改,花了 0.0117 美元,用了 96 秒,推送被拦住,远程仓库停在推送前的版本。
它比较的是你电脑上现在的代码和主分支。准备推送的那些提交以外,还没提交的改动也会算进去。有人推送时故意跳过本地检查,这一关就挡不住,合并前还得再自动查一次。Windows 上如果找不到 Python,自动检查里要写上它的完整路径。
合并前的检查写在 GitHub Actions 里,合并请求一打开或一更新就触发。这套流程没有在 GitHub 上真正跑过,同样的命令是在本机执行的。它只处理同一个仓库里的分支,从别的仓库送进来的修改会跳过,因为这一步会把代码发到 OpenRouter。检查用的程序取自基准分支,这次合并请求里的文件也进不了它的运行环境,所以改不了正在检查自己的那份程序。单次给了 15 分钟,够一次审查用的 1 到 4 分钟。密钥放在仓库的自动检查密钥里,名字仍是 OPENROUTER_API_KEY。想让没通过的检查挡住合并,还得在仓库设置里把它设为合并前必须通过。
四个模型,三次里谁把问题改完了
同一份例子、同样的默认设置、同样带上订单测试,每个模型跑了三次。做完三次,五个问题最多记 15 次;只做完两次,就最多记 10 次。修改算不算修好,要看它套到一份干净代码上、再跑测试之后,五个问题是否都消失。
做完的那些审查里,查询拼接、翻页算错、退款判断和错误被吃掉,四个模型都确认了。真正分开的是那个没关掉的数据库连接。Haiku 两次把它标成未确认,还有一次根本没报;Sonnet 标成未确认,另外还提过一条较轻、也没能复现的提醒:金额展示按“分”来排,打折却按“元”来四舍五入。GPT-6 Luna 三次都没报告连接没关,其中一次的修改却顺手改掉了这处。DeepSeek 两次做完的审查都确认了,有一次比的是连续调用 300 次前后还开着的文件数量。
DeepSeek 另有一次把来回八次都耗在反复发送修改上,始终没有交卷,花了 0.034 美元。Haiku 的三次修改里,有两次没去改那个错误的比较,反而动了收入怎么取值。订单数据按顺序排,收入原来按字段名去读,它改成按顺序取第 3 个数,传字段名的调用就会出错。修改写回项目之前,得先看一遍。
单次最便宜的是 Claude Haiku 5.5,平均 0.0153 美元、125 秒,三次里只有一次把五个问题都改完。Claude Sonnet 5.5 平均 0.0447 美元,只要 60 秒,三次修改都改完了。要换过去,指定模型 Claude Sonnet 5.5 即可。
一次花费怎么算出来
账单分成两块,一块是模型本身的用量,一块是那台临时电脑开着的时间。电脑按每秒 0.0001 美元计,从这次回答里第一次执行命令起,一直计到回答结束,模型思考的时间也算在里面;两次请求之间空着的那段不计费。新开一台,或者从休眠里唤醒,这一次至少按 30 秒计,也就是 0.003 美元。后面如果还用着同一台没休眠的电脑,就只按实际秒数计。文件上传不另收费,单个文件最大 100 MiB,一个账户下合计最多 10 GiB,传上去的文件不会过期。
这笔临时电脑的费用并不小。Haiku 每次审查里占 0.0074 到 0.0159 美元,更快的 Sonnet 占 0.0047 到 0.0068 美元。模型越慢,这一截越高,哪怕模型本身更便宜。只让模型看改动清单、不真正跑代码,Haiku 大约一次 0.001 美元;放进临时电脑里跑,大约是这个数的 10 到 40 倍。多出来的,是当场跑出来的证据,以及一份先在临时副本上试过能不能套上的修改。
代码会离开你的电脑
改过的文件、测试和改动清单会上传到你的 OpenRouter 账户,审查时交给提供模型的那一方。这些上传不能再下载,只能在 OpenRouter 的临时电脑里用;程序结束前会删掉,做到一半失败也会删。因此只拿允许离开本机的代码来跑,文件里不要放密钥。报告留在本机,里面有运行输出和代码片段。
一次最多带 20 个文件,其中 1 个名额留给改动清单。改动文件和测试加起来超过 19 个,程序就停,得拆开审。临时电脑默认上不了外网,每条命令默认最多跑 2 分钟,最长 5 分钟,所以装不了新的软件包;检查要用项目以外的现成程序库,也会失败。真要从公共软件源安装,得单独允许访问 pypi.org 和 files.pythonhosted.org。文件上传、执行命令和提交修改都还在测试阶段,目前只在全球入口提供,以后的行为可能变。
模型还是会漏掉问题,把严重程度说高,或者写出套不上的修改。已确认的问题带着当场跑出来的失败,未确认的则要人再看一遍。你的项目只有在你要求应用到项目时才会被改。
可以先把教程里的 review.py 放到项目根目录,用那份故意写了五个问题的例子跑通,看结果和报告里的命令、输出。要拦住推送,再挂到推送之前,并在合并前用基准分支上的程序再查一次。本地这一关挡不住有人故意跳过的推送。看重单次花费,就留着默认的 Claude Haiku 5.5;要三次修改都把五个问题改完,换成 Claude Sonnet 5.5。

