Я решил добавить в свой 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. Для этого после регистрации заходим в личный кабинет и создаем ключ:

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


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, но ее можно изменить на любую, которую поддерживает сервис.
PROMPT отвечает за сам запрос. Здесь всё просто: это обычный вопрос к модели как в обычном чате, поэтому мы просим, чтобы модель сделала ревью кода. Важно отметить, что на каждый файл с диффом будет сделан отдельный запрос.
Заключение
Теперь после создания пулл реквеста будет запускаться workflow:

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