基于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应用,下一篇,我会说下在部署该应用时遇到的问题。

相关推荐
return19991 小时前
gpt进行修改润色 不要和原来的一样
gpt·深度学习
百***074510 小时前
Claude Opus 4.5 场景化实战指南:全链路赋能开发,提升效率翻倍
人工智能·gpt·开源
大得3691 天前
gpt-oss:20b大模型知识库,ai大模型
人工智能·python·gpt
蹦蹦跳跳真可爱5891 天前
Python----大模型(GPT-2模型训练加速,训练策略)
人工智能·pytorch·python·gpt·embedding
独自破碎E1 天前
解释一下RAG中的Rerank
gpt·语言模型
迈火2 天前
ComfyUI - ELLA:解锁ComfyUI图像生成新境界的神奇插件
人工智能·gpt·stable diffusion·aigc·音视频·midjourney·llama
中國龍在廣州2 天前
谈谈2025年人工智能现状及发展趋势分析
人工智能·深度学习·算法·自然语言处理·chatgpt·机器人·机器人学习
迪娜学姐2 天前
Nano Banana Pro科研绘图能力实测
论文阅读·人工智能·chatgpt·prompt·论文笔记
程序员佳佳2 天前
026年AI开发实战:从GPT-5.2到Gemini-3,如何构建下一代企业级Agent架构?
开发语言·python·gpt·重构·api·ai写作·agi
KG_LLM图谱增强大模型2 天前
悬壶GPT:中医药领域大语言模型的参数高效微调
人工智能·gpt·语言模型·大模型·知识图谱