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

相关推荐
Nayxxu14 小时前
GPT API 迁移教程:Chat Completions 到 Responses API 的最小改造路径
数据库·gpt
AI智图坊14 小时前
电商详情页转化率提升实战:基于AI的“卖点-视觉”转化链路设计与自动化实现
大数据·运维·人工智能·gpt·ai作画·自动化·aigc
提示词牛马14 小时前
技术前沿深度洞察报告-第10期
人工智能·chatgpt
AI设计小站14 小时前
GPT Image2国内可用方案实测:创客贴AI生成+分层编辑能力解析
人工智能·gpt·php
happyprince14 小时前
18-Hugging Face Transformers之GPT-2 案例详解:Decoder-only 自回归模型的完整生命周期
gpt·数据挖掘·回归
摆烂工程师1 天前
今天 ChatGPT 大规模无差别封号,附上 GPT 官方申诉入口 以及 GPT 聊天记录备份方式
chatgpt·openai·ai编程
烬、、、1 天前
如何用 Claude Code 调用 gpt-image2 生成图片?
人工智能·笔记·gpt·prompt·skills
jike88ai1 天前
Windows版Claude Code安装与API对接教程(附常见问题解决)
windows·gpt·node.js·claude·claudecode·88api
m0_535817552 天前
Mac下Claude Code完整配置指南:API中转+环境变量设置一步到位
gpt·macos·node.js·api·claude·claudecode·88api
码农小旋风2 天前
Codex中文网 | Codex CLI 中文指南
运维·服务器·ide·人工智能·chatgpt·claude