Шаг за шагом: Как интегрировать ChatGPT для ревью пулл-реквестов на GitHub с помощью GitHub Actions

Я решил добавить в свой open source проект ChatGPT как ревьюера пулл реквестов, чтобы он сразу мог указать на опечактки и мелкие неточности в коде. В статье я поделюсь, как это сделать без покупок иностранных номеров, карт и различных ВПНов. Для этого мы будем использовать сервис ProxyAPI и напишем небольшой yml файл для GitHub Actions.

Начало

Первое, с чего необходимо начать — это добавление файла .github/workflows/cr.yml в корень проекта.

Само наполнение файла следующее:

name: Code Review

permissions:
  contents: read
  pull-requests: write

on:
  pull_request:
    types: [opened, reopened, synchronize]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: anc95/ChatGPT-CodeReview@v1.0.11
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
          LANGUAGE: Russian
          OPENAI_API_ENDPOINT: https://api.proxyapi.ru/openai/v1
          MODEL: gpt-3.5-turbo
          PROMPT: "You are an experienced Kotlin/Java developer and your job is to review pull requests. Please review the following code for any misunderstandings or violations. Don't spend time commenting on what is already working perfectly. I'm looking for constructive criticism and suggestions for improving the code, only useful and thorough notes."

Я не буду останавливаться на объяснении каждой строчки. Расскажу только про важные.

Воспользуемся готовым action - uses: anc95/ChatGPT-CodeReview@v1.0.11 ссылка на репозиторий.

Теперь пробежимся по настройкам этого action:

  • GITHUB_TOKEN нужен в большинстве actions (про GITHUB_TOKEN)

  • OPENAI_API_KEY — это ключ OpenAI. Чтобы использовать запросы к OpenAI из РФ, можно создать ключ в сервисе ProxyAPI. Для этого после регистрации заходим в личный кабинет и создаем ключ:

xnuppdewb_ujm46yoruf0byivsk.jpeg

Далее необходимо создать новый секрет с именем OPENAI_API_KEY (можете использовать свое имя) в вашем репозитории:

uozgmygakxu4vcjjmvwnahpvhvw.pngkdcmhrlizipjh_uw1phh9y8mk-k.jpeg

  • LANGUAGE отвечает за язык, на котором ChatGPT будет писать комментарии на пулл реквесте. Вот так выглядит код, где составляется prompt для chatGPT

private generatePrompt = (patch: string) => {
    const answerLanguage = process.env.LANGUAGE
      ? `Answer me in ${process.env.LANGUAGE},`
      : '';

    const prompt =
      process.env.PROMPT ||
        'Below is a code patch, please help me do a brief code review on it. Any bug risks and/or improvement suggestions are welcome:';

    return `${prompt}, ${answerLanguage}:
    ${patch}
    `;
  };

То есть после промпта из переменной PROMPT (о ней ниже) в конец запроса будет добавлено Answer me in Russian.

  • OPENAI_API_ENDPOINT отвечает за то, куда отправить запрос, но так как используется проксирующий сервис, необходимо изменить значение на https://api.proxyapi.ru/openai/v1

  • MODEL определяет версию ChatGPT, которая нам ответит. По умолчанию используется gpt-3.5-turbo, но ее можно изменить на любую, которую поддерживает сервис. О версиях ChatGPT, которые поддерживаются, можно ознакомиться тут

  • PROMPT отвечает за сам запрос. Здесь всё просто: это обычный вопрос к модели как в обычном чате, поэтому мы просим, чтобы модель сделала ревью кода. Важно отметить, что на каждый файл с диффом будет сделан отдельный запрос.

Заключение

Теперь после создания пулл реквеста будет запускаться workflow:

90rxqgxdnqefikfz9yrbdgncixm.jpeg

Если вы все сделали правильно, то после окончания workflow ChatGPT напишет комментарии на каждый измененный файл в вашем пулл реквесте:

dnta8l_1-gaa38wojmgu8lebaju.jpeg

© Habrahabr.ru