Адкрыты бот для рэв’ю PR: LangGraph, Node.js і вэбхукі GitHub
Рэв’ю пул-рэквестаў паэтапным агентам LangGraph, які правярае бяспеку, прадукцыйнасць і архітэктуру і пакідае каментарыі да радкоў праз GitHub API.
Крыніцы: Building an AI Code Review Agent: Architecture, LangGraph, and Practical Lessons
У практычна кожнай команды накапліваюцца запросы прыўязкі. Зазвычай толькі старшыя інжынеры можаўць з’явіць тонкія проблемы: запіты тыпу N+1, зашчытаныя у кодзе секрэты, крайнія случаўкі, якімі ніхто не займаўся. Яны таксама ёсць найзанятыяй часткаю команды, таму перагляды запросаў прыводзяцца да гэткіх спешакоў чы ўсуненняў, і ў будзь-якім случае якась частка запросаў праходзіць далей.
Інструменты для перагляду AI у комерчыях цілях зазвычай маюць закрыты код чы ўзмоўклівыя цены, а часта і тое, і другое. Альтэрнатыва — бот, які малая команда можа запусціць у своіх рэпазітарыях, без неабходнасці адправляць код у «чорную скрынку». Паказаны ніжэй дызайн — гэта бот з адкрытым кодам, які сочыць за новымі запросамі прыўязкі на GitHub, пераглядае кожны з іх за дапамогою багатаэтапнага агента LangGraph і прадае конкрэтыя, дэталізаваныя адгукі ў вачоўку запроса прыўязкі.
Што выходзіць, калі відкрываецца PR
- Webhook на GitHub доставляе паведамленне.
- API GitHub, праз Octokit, запрашае даны пра змены.
Самэ галоўнае — перагляд па этапах. Калі запытаць LLM пра "перагляд гэтага коду", часта атрымваюцца расплывчатыя, загальнія заўважэння. Разбіўка задачы на перагляд безпекі, выканання і архітэктуры дае болей точныя рэзультаты, адколькі кожны этап мае чыста адну задачу.
Тэхналогія
| Слой | Тэхналогія |
|---|---|
| Фрэймворк агента | LangGraph для багатаэтапнага разумавання |
| LLM | OpenAI GPT-4 або Claude, як вы выберазе |
| Бэкенд | Node.js з Express |
Такая структура застаецца блізкай да таго, што ужо выкарыстоўваюць большасць команд на Node.js. Мэтай не было прадстаўлення новага фрэймворку; галоўная мэта — стварыць апрант, які каманда можа размясціць і даверыць.
Прабег і структура
Працэс праходзіць ад ачыненага PR праз пераканальны webhook да агента, а пасля вяртаецца у вастоўку як каментар:
GitHub PR opened
│
▼
Webhook (signed, verified)
│
▼
Express API ──► Fetch diff (Octokit)
│
▼
LangGraph Agent
├── Security check
├── Performance check
└── Architecture check
│
▼
Post PR comment + save to PostgreSQL
Кожныя перапалачкі в праграме LangGraph являюцца самастайнымі вузламі. Команда можа тэставаць, налагоджваць або выключаць адну перапалачку без паўління на іншыя, што дапамагае, калі людзі актуальваюцься толькі пра прынтакі безпекі і не хочуць мнэнняў пра архітэктуру для кожнага PR.
Два фрагменты коду, якія варта паказаць
Першы — перакананне падпіса webhook. Без яго кожны, хто знаходзіць URL webhook, можа адправляць фальшывыя запускі і спрычыніць неправдаподобныя перагляды:
function verifySignature(payload: string, signature: string) {
const hmac = crypto.createHmac("sha256", process.env.GITHUB_WEBHOOK_SECRET!);
const digest = "sha256=" + hmac.update(payload).digest("hex");
return crypto.timingSafeEqual(Buffer.from(digest), Buffer.from(signature));
}
Ён мініяцюрны, але яго прыняць не ўвахоўваць — частая памылка у інструментах, які працуюць на адпаведных вебхук-сервісах.
Другое — прабэг LangGraph складаецца з адзінаковых вузлаў, а не з адной большай запрасы:
const graph = new StateGraph(ReviewState)
.addNode("security", securityCheckNode)
.addNode("performance", performanceCheckNode)
.addNode("architecture", architectureCheckNode)
.addEdge("security", "performance")
.addEdge("performance", "architecture");
Кожны канэт прымае разлік і вяртае толькі свае сопасты, а яны з’едынаюцца ў адну прымэту. Так стае лёгкая дыбаггаванне. Калі пераказ пра выконвальную спроможнасць прадае што-небудзь страннае, трэба адразу пераглядаць толькі адзін канэт, а не вялічэзную прымэту.
Што спрацавало
- Раздзелэнне аналізу на окрэмыя пераказы па безпеце, выконвальной спроможнасці і архітэктуры дала яскравае, болей конкрэтнае адзначэнне, чым адна з’едынаная прымэта. Гэта быў найбольшы падых у якосці ў всім праекце.
- Перакананне падпісаў webhook з самага пачатку значыць, што безпека была часткай дызайну, а не чымось, што было дадана пазней.
- Зберагачыце історыю аналізу ў PostgreSQL, нават у простай форме, дазволіла пазней бачыць патэрны, напрыклад, якія проблемы постаўляліся ў розных PR-ах.
Што засталося складным
- Неправі позытывныя рэзультаты ўскладнення працы з такімі сістэмамі. Аналіз, базаваны на LLM, іноды пазначае тыя рэчы, якія не ўтвараюць проблем, і дасяглінні сістэмы павінны быць чыста адкрытыя. Доверлівасць мае большое значэнне, чым прыгожы спіс функцый.
- Вартасць таксацый расце. Тры вызовы LLM на кожны PR даюць большую точнасць, чым адзін, але ўсё гэта коштае больш і займае больш часу. Маленькай камандзе патрэбна баланс межу якасцю аналізу і цэнай, яку яна можа сабе дазволіць.
- Ёжы напісанню каментаў у стылі, які будзе схожы на напісанне чалавекам, знадобілася большая колькасць перадзменаў прапты, чым для рэалізаціі логікі LangGraph. Каменты павінны быць короткімі, конкрэтнымі і прыязначанымі да конкрэтнага номера рэядка, таму што ніхто не чытае п’ятыпараграфовыя эсэі AI ў тэксце PR.
Бот ёсць чацькіў зялік у серыў маленькіх експерыментыв на відкрытому коду, які застовуюць оркастанацію LLM з LangChain і LangGraph для розв'язання конкрэтніх проблем робочого працэсу, такіх як запітаня і адказы шчодо дакументаў, запітаня і адказы шчодо політык для послуг, які спрамовані до грамадзян, і перэтворэння голосовіх ноток на Agile-сторыі корыстувача. Гэта не готовій продукт, які можна вікорыстовуваты будзь-дэ. Гэта працездатна початкова точка, на якій команда можа продовжуваты розвіватыся.
Спробаване локально
Рэпазітарый швідко запускаецца. Клонуйце яго, встановіць залежносты і запусціць сервер распрацоўкі:
git clone https://github.com/Srameshgitnow/agentic-code-reviewer.git
cd agentic-code-reviewer
npm install
npm run dev
У даслівнай інструкцыі паведамляецца пра всю процэдуру наладкі, зменныя сераўыска і спосабы падключэння GitHub webhook. Адзінакавасці ў парадках або ідэі ўзгляду на працэс LangGraph — гэта тыя аповешчэння, якія дапамагаюць найбольш.