基于GPT,对Merge Requests进行AI Code Review 《应用篇》

最近公司机房建立了gpt模型,可以好好玩耍了,于是乎最近都在搞基建的我,有了个想法:

通过AI 对 Merge Requests 进行 Code Review

一、通过 Webhooks 接收 Merge Requests 通知

我们的代码管理工具是gitlab,所以,我首先想到的,自然是通过gitlab webhooks的能力进行合并请求消息通知。

1. 写一个应用

既然使用到webhooks,自然需要有一个应用进行接收,那这里我采用了nestjs进行构建(没有为什么,单纯快,spring风格,既装既用)。

webhook.controller

ts 复制代码
@Controller(`/webhook`)
export class WebhookController {
  constructor(private readonly webhookService: WebhookService) {}

  @Post('/code-review')
  postCodeReview(): string {
    return this.webhookService.codeReview();
  }
}

webhook.service

ts 复制代码
@Injectable()
export class WebhookService {
  async codeReview(): Promise<string> {
    // todo
  }
}

2. 接收 Merge Requests 通知

webhooks的选择中,我们选择通过合并请求事件触发webhooks

当开发发起 Merge Requests 时,gitlab 会调用 webhooks, 并将合并请求信息通过bodyJson的形式发送到服务器:

那这里我们就可以使用body进行接收合并信息了:

webhook.controller

ts 复制代码
type CodeReviewDto = {
  project: {
    id: string;
  };
  object_attributes: {
    id: number;
    iid: number;
    action: 'open' | 'approved' | 'merge';
  };
};

@Controller(`/webhook`)
export class WebhookController {
  constructor(private readonly webhookService: WebhookService) {}

  @Post('/code-review')
  postCodeReview(@Body() codeReviewDto: CodeReviewDto): string {
    return this.webhookService.codeReview(codeReviewDto);
  }
}

而通过调研 gitlab api 文档,这里我们需要获取此次请求所有的变更,那么我们需要使用到以下API

bash 复制代码
projects/${projectId}/merge_requests/${mergerequestIId}/changes

这里我使用了 @gitbeaker/rest 这个库进行获取:

ts 复制代码
import { Gitlab } from '@gitbeaker/rest';

const gl = new Gitlab({
    host: 'gitlab.com',  // gitlab 地址
    token: 'xxxxxxx',    // private token,在gitlab个人设置那获取
    queryTimeout: 60000, // 超时时间
  });
  
const mergeRequest: MergeRequestChangesSchema = await gl.MergeRequests.showChanges(projectId, mergeRequestIId);

console.log(mergeRequest.changes);

changes示例:

到这里,我们就可以获取到本次提交的所有代码变更了

二、对代码变更片段进行Code Review

有了代码变更片段,我们就可以对diff代码进行 Ai Code Review

1. AI Code Review 测试

这里由于公司有本地模型,所以我使用的是机房的openai地址

对本地模型搭建有兴趣的,可以去了解下OneAPI

这里主要是通过使用 openai 的库获取review后的信息:

ts 复制代码
import OpenAI from "openai";

const ai = new OpenAI({
  baseURL: 'openai 地址',
  apiKey: "openai 密钥",
  timeout: 60000, // 超时时间
});

const change = `
    function add(a, b) {
        return a * b;
    }
    
    add(1, 3); // 6
`;

const data = await ai.chat.completions.create({
    model: "gpt4",
    messages: [
      {
        role: "system",
        content: "你是一位资深的编程专家,负责代码变更的审查工作。麻烦给出审查建议并给出修改后的内容,反馈的内容请使用的markdown格式。",
      },
      { role: "user", content: `请对这部分代码变更${change}进行review。` },
    ],
  });
  const answer = data.choices?.[0].message?.content || "";
  console.log(answer);

返回的answer:

当然这里,我们也可以也可以用不同的角色来review,比如天才小女孩:

ts 复制代码
messages: [
      {
        role: "system",
        content: "你是一个天才小女孩,精通前端编程工作,性格很傲娇又高傲,负责对前辈的代码变更进行审查,用后辈的态度、活泼轻快的方式的指出存在的问题。使用markdown格式。可以包含emoji。",
      },
      { 
        role: "user", 
        content: `请对这部分代码变更${change}进行review。` 
      },
],

返回的answer:

2. 将review结果评论到Merge Requests中

这里我们依然是使用 @gitbeaker/rest 库进行评论:

bash 复制代码
${projectId}/merge_requests/${mergeRequestIId}/notes`,

webhook.service

ts 复制代码
@Injectable()
export class WebhookService {
  async codeReview(): Promise<string> {
    const gl = new Gitlab({
    host: 'gitlab.com',  // gitlab 地址
    token: 'xxxxxxx',    // private token,在gitlab个人设置那获取
    queryTimeout: 60000, // 超时时间
  });
  
    // 获取合并信息
    const mergeRequest: MergeRequestChangesSchema = await gl.MergeRequests.showChanges(projectId, mergeRequestIId);

    // 开始ai review
    const ai = new OpenAI({
      baseURL: 'openai 地址',
      apiKey: "openai 密钥",
      timeout: 60000, // 超时时间
    });
    const reviewNotes: string[] = [];
    
    for (const change of mergeRequest.changes) {
      const chatCompletion: ChatCompletion = await ai.chat.completions.create({
        model: 'chatglm2',
        messages: [
            {
              role: 'system',
              content: "你是一位资深的编程专家,负责代码变更的审查工作。麻烦给出审查建议并给出修改后的内容,反馈的内容请使用的markdown格式。",
            },
            {
              role: 'user',
              content: `请对这部分代码变更${change.diff}进行review。`,
            },
          ],
      });
      reviewNotes.push(data.choices?.[0].message?.content || "");
    }

    return await gl.MergeRequestNotes.create(projectId, mergeRequestIId, reviewNotes.join('\n\n---\n\n'));
  }
}

效果如下:

以上就是基于GPT,对Merge Requests进行Code Review 的应用部分了,这里只涉及到webhook应用,下一篇,我会说下在部署该应用时遇到的问题。

相关推荐
LaughingZhu5 小时前
Product Hunt 每日热榜 | 2026-02-14
数据库·人工智能·经验分享·神经网络·搜索引擎·chatgpt
汽车软件工程师00120 小时前
ChatGpt指导嵌入式软件开发能力
人工智能·chatgpt·autosar
有趣的杰克20 小时前
macOS 实战:用 Swift + AppleScript 实现全局快捷键直达 ChatGPT / Claude / Gemini
macos·chatgpt
烁烁闪闪烁烁2 天前
【weelinking系列Claude教程】 04 - Claude Code 安装与配置
人工智能·chatgpt·ai编程·claude·cursor·claude code·opencode
相思半2 天前
告别聊天机器人!2026 智能体元年:Claude 4.6 vs GPT-5.3 vs OpenClaw 全方位对比
人工智能·gpt·深度学习·claude·codex·智能体·seedance
冬奇Lab2 天前
一天一个开源项目(第22篇):nanochat - 百元级「最好的 ChatGPT」,Karpathy 的极简 LLM 训练套件
人工智能·gpt·chatgpt
namelessmyth2 天前
聚合AI大模型API平台-横向评测对比
人工智能·语言模型·chatgpt·ai编程
三寸3372 天前
ChatGPT Plus国内订阅三种方案深度对比:风险、成本分析
人工智能·ai·chatgpt
赛博鲁迅2 天前
dify添加中转站模型教程
人工智能·gpt·aigc·ai编程·dify·ai-native
向量引擎小橙2 天前
从“对话助手”到“数字架构师”:Claude 4.6 Opus 如何凭一己之力,终结全球程序员的“CRUD 焦虑”?
人工智能·python·gpt·深度学习