From 3579feda59edf4edcb3f2d4791cb004949eb5bf8 Mon Sep 17 00:00:00 2001 From: Gleb Alekseev Date: Sat, 15 Mar 2025 11:40:51 +0400 Subject: [PATCH 01/37] init --- .github/workflows/chatgpt-review.yml | 26 ++++++++++++++++++ .github/workflows/chatgpt_review.py | 40 ++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 .github/workflows/chatgpt-review.yml create mode 100644 .github/workflows/chatgpt_review.py diff --git a/.github/workflows/chatgpt-review.yml b/.github/workflows/chatgpt-review.yml new file mode 100644 index 00000000..67d55fde --- /dev/null +++ b/.github/workflows/chatgpt-review.yml @@ -0,0 +1,26 @@ +name: ChatGPT Code Review + +# Даем разрешения на чтение кода и запись комментариев к PR​:contentReference[oaicite:1]{index=1} +permissions: + contents: read + pull-requests: write + +on: + pull_request: + types: [opened, reopened, synchronize] # Запуск при создании PR и каждом новом коммите​:contentReference[oaicite:2]{index=2} + +jobs: + code_review: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Install dependencies + run: pip install openai requests + + - name: Run ChatGPT code review script + env: + OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: python3 .github/workflows/chatgpt_review.py diff --git a/.github/workflows/chatgpt_review.py b/.github/workflows/chatgpt_review.py new file mode 100644 index 00000000..e80049a2 --- /dev/null +++ b/.github/workflows/chatgpt_review.py @@ -0,0 +1,40 @@ +import os, requests, openai + +# Получаем переменные среды +repo = os.environ.get("GITHUB_REPOSITORY") # e.g. "user/repo" +pr_number = os.environ.get("GITHUB_REF", "").split("/")[-2] # извлекаем номер PR из ссылки вида "refs/pull/123/merge" +openai.api_key = os.environ["OPENAI_API_KEY"] + +# 1. Получение diff через GitHub API +pr_url = f"https://api.github.com/repos/{repo}/pulls/{pr_number}" +headers = { + "Authorization": f"Bearer {os.environ['GITHUB_TOKEN']}", + "Accept": "application/vnd.github.v3.diff" +} +diff_response = requests.get(pr_url, headers=headers) +diff_text = diff_response.text + +# 2. Формирование промпта для ChatGPT +prompt = ( + "Вы выступаете в роли ассистента по ревью кода. Вам предоставлен дифф коммитов в Pull Request. " + "Проанализируйте изменения и предоставьте отзывы: найдите потенциальные ошибки, проблемы безопасности, " + "несоответствия стилю или лучшие практики, а также дайте рекомендации по улучшению кода.\n\n" + f"Дифф:\n{diff_text}" +) + +# 3. Вызов OpenAI ChatCompletion +model_name = "gpt-3.5-turbo" # можно сделать настраиваемым через переменные среды +completion = openai.ChatCompletion.create( + model=model_name, + messages=[ + {"role": "system", "content": "You are a senior software engineer and code reviewer."}, + {"role": "user", "content": prompt} + ], + temperature=0.3, + max_tokens=1000 +) +review_text = completion["choices"][0]["message"]["content"] + +# 4. Публикация комментария в PR через GitHub API +comment_url = f"https://api.github.com/repos/{repo}/issues/{pr_number}/comments" +requests.post(comment_url, headers={"Authorization": f"Bearer {os.environ['GITHUB_TOKEN']}"}, json={"body": review_text}) From c8dbd78d5746874eb22baf765c8e61f5d31c5835 Mon Sep 17 00:00:00 2001 From: Gleb Alekseev Date: Sat, 15 Mar 2025 12:03:05 +0400 Subject: [PATCH 02/37] fixes --- .github/workflows/chatgpt_review.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/chatgpt_review.py b/.github/workflows/chatgpt_review.py index e80049a2..7791f86a 100644 --- a/.github/workflows/chatgpt_review.py +++ b/.github/workflows/chatgpt_review.py @@ -1,7 +1,7 @@ import os, requests, openai # Получаем переменные среды -repo = os.environ.get("GITHUB_REPOSITORY") # e.g. "user/repo" +repo = os.environ.get("GITHUB_REPOSITORY") pr_number = os.environ.get("GITHUB_REF", "").split("/")[-2] # извлекаем номер PR из ссылки вида "refs/pull/123/merge" openai.api_key = os.environ["OPENAI_API_KEY"] @@ -24,7 +24,7 @@ # 3. Вызов OpenAI ChatCompletion model_name = "gpt-3.5-turbo" # можно сделать настраиваемым через переменные среды -completion = openai.ChatCompletion.create( +completion = openai.chat.completions.create( model=model_name, messages=[ {"role": "system", "content": "You are a senior software engineer and code reviewer."}, From 6d7e73e36ab748088d950d8a29cbc2d40adf7ba7 Mon Sep 17 00:00:00 2001 From: Gleb Alekseev Date: Sat, 15 Mar 2025 12:33:15 +0400 Subject: [PATCH 03/37] fix --- .github/workflows/chatgpt_review.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/chatgpt_review.py b/.github/workflows/chatgpt_review.py index 7791f86a..b7166671 100644 --- a/.github/workflows/chatgpt_review.py +++ b/.github/workflows/chatgpt_review.py @@ -33,7 +33,7 @@ temperature=0.3, max_tokens=1000 ) -review_text = completion["choices"][0]["message"]["content"] +review_text = completion.choices[0].message.content # 4. Публикация комментария в PR через GitHub API comment_url = f"https://api.github.com/repos/{repo}/issues/{pr_number}/comments" From 650d0a2a78ac08d4b6f3ad5aeac60133789edcce Mon Sep 17 00:00:00 2001 From: Gleb Alekseev Date: Sat, 15 Mar 2025 13:25:29 +0400 Subject: [PATCH 04/37] Update chatgpt_review.py --- .github/workflows/chatgpt_review.py | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/.github/workflows/chatgpt_review.py b/.github/workflows/chatgpt_review.py index b7166671..93520e64 100644 --- a/.github/workflows/chatgpt_review.py +++ b/.github/workflows/chatgpt_review.py @@ -1,11 +1,9 @@ import os, requests, openai -# Получаем переменные среды repo = os.environ.get("GITHUB_REPOSITORY") pr_number = os.environ.get("GITHUB_REF", "").split("/")[-2] # извлекаем номер PR из ссылки вида "refs/pull/123/merge" openai.api_key = os.environ["OPENAI_API_KEY"] -# 1. Получение diff через GitHub API pr_url = f"https://api.github.com/repos/{repo}/pulls/{pr_number}" headers = { "Authorization": f"Bearer {os.environ['GITHUB_TOKEN']}", @@ -14,20 +12,32 @@ diff_response = requests.get(pr_url, headers=headers) diff_text = diff_response.text -# 2. Формирование промпта для ChatGPT prompt = ( - "Вы выступаете в роли ассистента по ревью кода. Вам предоставлен дифф коммитов в Pull Request. " - "Проанализируйте изменения и предоставьте отзывы: найдите потенциальные ошибки, проблемы безопасности, " - "несоответствия стилю или лучшие практики, а также дайте рекомендации по улучшению кода.\n\n" - f"Дифф:\n{diff_text}" + "You are acting as an advanced code review assistant. Below is a diff from a Pull Request. " + "Please analyze these changes in detail and provide a constructive critique. Focus on:\n" + "- Potential bugs and security vulnerabilities\n" + "- Conformance to coding style and best practices\n" + "- Opportunities for performance or maintainability improvements\n" + "\n" + f"Diff:\n{diff_text}" +) + +sys_prompt = ( + "You are a highly experienced senior software engineer and code reviewer with deep " + "expertise across various programming languages and frameworks " + "(including Solidity, JavaScript/TypeScript, and Rust). " + "Your role is to thoroughly analyze code changes, focusing on correctness, security, " + "maintainability, and adherence to best practices. Provide clear, actionable, and concise " + "feedback with concrete suggestions for improvement where necessary. Avoid unnecessary elaboration, " + "but ensure that critical details are clearly explained." ) # 3. Вызов OpenAI ChatCompletion -model_name = "gpt-3.5-turbo" # можно сделать настраиваемым через переменные среды +model_name = "o1" # можно сделать настраиваемым через переменные среды completion = openai.chat.completions.create( model=model_name, messages=[ - {"role": "system", "content": "You are a senior software engineer and code reviewer."}, + {"role": "system", "content": sys_prompt}, {"role": "user", "content": prompt} ], temperature=0.3, From 10f0db1f0f5ae96ed01d049223ccd6ec21524724 Mon Sep 17 00:00:00 2001 From: Gleb Alekseev Date: Sat, 15 Mar 2025 13:27:14 +0400 Subject: [PATCH 05/37] model change --- .github/workflows/chatgpt_review.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/chatgpt_review.py b/.github/workflows/chatgpt_review.py index 93520e64..9f09ab9c 100644 --- a/.github/workflows/chatgpt_review.py +++ b/.github/workflows/chatgpt_review.py @@ -33,7 +33,7 @@ ) # 3. Вызов OpenAI ChatCompletion -model_name = "o1" # можно сделать настраиваемым через переменные среды +model_name = "o1-mini" completion = openai.chat.completions.create( model=model_name, messages=[ From df056d9a6ac2a0e3b84ceb8c7f40baa77723c8f1 Mon Sep 17 00:00:00 2001 From: Gleb Alekseev Date: Sat, 15 Mar 2025 14:08:52 +0400 Subject: [PATCH 06/37] fix --- .github/workflows/chatgpt_review.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/chatgpt_review.py b/.github/workflows/chatgpt_review.py index 9f09ab9c..54316427 100644 --- a/.github/workflows/chatgpt_review.py +++ b/.github/workflows/chatgpt_review.py @@ -22,7 +22,7 @@ f"Diff:\n{diff_text}" ) -sys_prompt = ( +dev_prompt = ( "You are a highly experienced senior software engineer and code reviewer with deep " "expertise across various programming languages and frameworks " "(including Solidity, JavaScript/TypeScript, and Rust). " @@ -37,7 +37,7 @@ completion = openai.chat.completions.create( model=model_name, messages=[ - {"role": "system", "content": sys_prompt}, + {"role": "developer", "content": dev_prompt}, {"role": "user", "content": prompt} ], temperature=0.3, From 86303786b4dca3f691f724461544b716dd8817c6 Mon Sep 17 00:00:00 2001 From: Gleb Alekseev Date: Sat, 15 Mar 2025 14:11:09 +0400 Subject: [PATCH 07/37] fix --- .github/workflows/chatgpt_review.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/chatgpt_review.py b/.github/workflows/chatgpt_review.py index 54316427..ae35a6bc 100644 --- a/.github/workflows/chatgpt_review.py +++ b/.github/workflows/chatgpt_review.py @@ -37,7 +37,7 @@ completion = openai.chat.completions.create( model=model_name, messages=[ - {"role": "developer", "content": dev_prompt}, + # {"role": "developer", "content": dev_prompt}, {"role": "user", "content": prompt} ], temperature=0.3, From 46c09e9cf71549b63a291f76835558ca4ecf843c Mon Sep 17 00:00:00 2001 From: Gleb Alekseev Date: Sat, 15 Mar 2025 14:20:26 +0400 Subject: [PATCH 08/37] fix --- .github/workflows/chatgpt_review.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/chatgpt_review.py b/.github/workflows/chatgpt_review.py index ae35a6bc..08655e3e 100644 --- a/.github/workflows/chatgpt_review.py +++ b/.github/workflows/chatgpt_review.py @@ -33,15 +33,16 @@ ) # 3. Вызов OpenAI ChatCompletion -model_name = "o1-mini" +model_name = "gpt-4o" completion = openai.chat.completions.create( model=model_name, + reasoning_effort="medium", messages=[ - # {"role": "developer", "content": dev_prompt}, + {"role": "developer", "content": dev_prompt}, {"role": "user", "content": prompt} ], temperature=0.3, - max_tokens=1000 + max_completion_tokens=1000 ) review_text = completion.choices[0].message.content From 9493bf2b8d80d014ee5c67567d781e40a7771c62 Mon Sep 17 00:00:00 2001 From: Gleb Alekseev Date: Sat, 15 Mar 2025 14:21:31 +0400 Subject: [PATCH 09/37] Update chatgpt_review.py --- .github/workflows/chatgpt_review.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/chatgpt_review.py b/.github/workflows/chatgpt_review.py index 08655e3e..acf8cad6 100644 --- a/.github/workflows/chatgpt_review.py +++ b/.github/workflows/chatgpt_review.py @@ -36,7 +36,7 @@ model_name = "gpt-4o" completion = openai.chat.completions.create( model=model_name, - reasoning_effort="medium", + # reasoning_effort="medium", messages=[ {"role": "developer", "content": dev_prompt}, {"role": "user", "content": prompt} From 32537363f716f1348dd9065b1a86ce5c4d5ec253 Mon Sep 17 00:00:00 2001 From: Gleb Alekseev Date: Sat, 15 Mar 2025 15:01:09 +0400 Subject: [PATCH 10/37] ref --- .github/workflows/chatgpt-review.yml | 2 +- .../{chatgpt_review.py => gpt-4o_review.py} | 11 ++--- .github/workflows/o3-mini-review.py | 41 +++++++++++++++++++ 3 files changed, 48 insertions(+), 6 deletions(-) rename .github/workflows/{chatgpt_review.py => gpt-4o_review.py} (85%) create mode 100644 .github/workflows/o3-mini-review.py diff --git a/.github/workflows/chatgpt-review.yml b/.github/workflows/chatgpt-review.yml index 67d55fde..63c3c740 100644 --- a/.github/workflows/chatgpt-review.yml +++ b/.github/workflows/chatgpt-review.yml @@ -23,4 +23,4 @@ jobs: env: OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: python3 .github/workflows/chatgpt_review.py + run: python3 .github/workflows/o3-mini_review.py diff --git a/.github/workflows/chatgpt_review.py b/.github/workflows/gpt-4o_review.py similarity index 85% rename from .github/workflows/chatgpt_review.py rename to .github/workflows/gpt-4o_review.py index acf8cad6..d46d1a91 100644 --- a/.github/workflows/chatgpt_review.py +++ b/.github/workflows/gpt-4o_review.py @@ -1,7 +1,11 @@ -import os, requests, openai +import os +import requests +import openai + +# Exctracts PR number from the link like "refs/pull/123/merge" +pr_number = os.environ.get("GITHUB_REF", "").split("/")[-2] repo = os.environ.get("GITHUB_REPOSITORY") -pr_number = os.environ.get("GITHUB_REF", "").split("/")[-2] # извлекаем номер PR из ссылки вида "refs/pull/123/merge" openai.api_key = os.environ["OPENAI_API_KEY"] pr_url = f"https://api.github.com/repos/{repo}/pulls/{pr_number}" @@ -32,11 +36,9 @@ "but ensure that critical details are clearly explained." ) -# 3. Вызов OpenAI ChatCompletion model_name = "gpt-4o" completion = openai.chat.completions.create( model=model_name, - # reasoning_effort="medium", messages=[ {"role": "developer", "content": dev_prompt}, {"role": "user", "content": prompt} @@ -46,6 +48,5 @@ ) review_text = completion.choices[0].message.content -# 4. Публикация комментария в PR через GitHub API comment_url = f"https://api.github.com/repos/{repo}/issues/{pr_number}/comments" requests.post(comment_url, headers={"Authorization": f"Bearer {os.environ['GITHUB_TOKEN']}"}, json={"body": review_text}) diff --git a/.github/workflows/o3-mini-review.py b/.github/workflows/o3-mini-review.py new file mode 100644 index 00000000..59403365 --- /dev/null +++ b/.github/workflows/o3-mini-review.py @@ -0,0 +1,41 @@ +import os, requests, openai + +repo = os.environ.get("GITHUB_REPOSITORY") +pr_number = os.environ.get("GITHUB_REF", "").split("/")[-2] # извлекаем номер PR из ссылки вида "refs/pull/123/merge" +openai.api_key = os.environ["OPENAI_API_KEY"] + +pr_url = f"https://api.github.com/repos/{repo}/pulls/{pr_number}" +headers = { + "Authorization": f"Bearer {os.environ['GITHUB_TOKEN']}", + "Accept": "application/vnd.github.v3.diff" +} +diff_response = requests.get(pr_url, headers=headers) +diff_text = diff_response.text + +prompt = ( + "Do code review and analyze code changes " + "Provide clear, actionable, and concise feedback with concrete suggestions for improvement where necessary. " + "Avoid unnecessary elaboration, but ensure that critical details are clearly explained. " + "Focus on:\n" + "- Potential bugs and security vulnerabilities\n" + "- Conformance to coding style and best practices\n" + "- Opportunities for performance or maintainability improvements\n" + "\n" + f"Diff:\n{diff_text}" +) + +model_name = "o3-mini" +completion = openai.chat.completions.create( + model=model_name, + reasoning_effort="medium", + messages=[ + {"role": "user", "content": prompt} + ], + temperature=0.3, + max_completion_tokens=1000 +) +review_text = completion.choices[0].message.content + +# 4. Публикация комментария в PR через GitHub API +comment_url = f"https://api.github.com/repos/{repo}/issues/{pr_number}/comments" +requests.post(comment_url, headers={"Authorization": f"Bearer {os.environ['GITHUB_TOKEN']}"}, json={"body": review_text}) From a0511bd67458c35862ed748a47e11868aca8cd74 Mon Sep 17 00:00:00 2001 From: Gleb Alekseev Date: Sat, 15 Mar 2025 15:02:03 +0400 Subject: [PATCH 11/37] fix --- .github/workflows/{o3-mini-review.py => o3-mini_review.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{o3-mini-review.py => o3-mini_review.py} (100%) diff --git a/.github/workflows/o3-mini-review.py b/.github/workflows/o3-mini_review.py similarity index 100% rename from .github/workflows/o3-mini-review.py rename to .github/workflows/o3-mini_review.py From 2442cd727ad97aff5c2f40a25e040d4deda0427a Mon Sep 17 00:00:00 2001 From: Gleb Alekseev Date: Sat, 15 Mar 2025 15:04:44 +0400 Subject: [PATCH 12/37] fix --- .github/workflows/chatgpt-review.yml | 2 +- .github/workflows/{o3-mini_review.py => o1-mini_review.py} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename .github/workflows/{o3-mini_review.py => o1-mini_review.py} (98%) diff --git a/.github/workflows/chatgpt-review.yml b/.github/workflows/chatgpt-review.yml index 63c3c740..e877c2af 100644 --- a/.github/workflows/chatgpt-review.yml +++ b/.github/workflows/chatgpt-review.yml @@ -23,4 +23,4 @@ jobs: env: OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: python3 .github/workflows/o3-mini_review.py + run: python3 .github/workflows/o1-mini_review.py diff --git a/.github/workflows/o3-mini_review.py b/.github/workflows/o1-mini_review.py similarity index 98% rename from .github/workflows/o3-mini_review.py rename to .github/workflows/o1-mini_review.py index 59403365..444ddc2e 100644 --- a/.github/workflows/o3-mini_review.py +++ b/.github/workflows/o1-mini_review.py @@ -24,7 +24,7 @@ f"Diff:\n{diff_text}" ) -model_name = "o3-mini" +model_name = "o1-mini" completion = openai.chat.completions.create( model=model_name, reasoning_effort="medium", From ef1dac86794af5d10818d83483bb210fd301f667 Mon Sep 17 00:00:00 2001 From: Gleb Alekseev Date: Sat, 15 Mar 2025 15:05:50 +0400 Subject: [PATCH 13/37] fix --- .github/workflows/o1-mini_review.py | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/o1-mini_review.py b/.github/workflows/o1-mini_review.py index 444ddc2e..2e4c5785 100644 --- a/.github/workflows/o1-mini_review.py +++ b/.github/workflows/o1-mini_review.py @@ -31,7 +31,6 @@ messages=[ {"role": "user", "content": prompt} ], - temperature=0.3, max_completion_tokens=1000 ) review_text = completion.choices[0].message.content From 7ea404e0796f35f1b2bddab1afdd7c62b8505cce Mon Sep 17 00:00:00 2001 From: Gleb Alekseev Date: Sat, 15 Mar 2025 15:11:10 +0400 Subject: [PATCH 14/37] Update o1-mini_review.py --- .github/workflows/o1-mini_review.py | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/o1-mini_review.py b/.github/workflows/o1-mini_review.py index 2e4c5785..0b5f9490 100644 --- a/.github/workflows/o1-mini_review.py +++ b/.github/workflows/o1-mini_review.py @@ -27,7 +27,6 @@ model_name = "o1-mini" completion = openai.chat.completions.create( model=model_name, - reasoning_effort="medium", messages=[ {"role": "user", "content": prompt} ], From 47c0ab0fb4f262be7caf2b80868797d5ca7a6c0e Mon Sep 17 00:00:00 2001 From: Gleb Alekseev Date: Sat, 15 Mar 2025 15:14:24 +0400 Subject: [PATCH 15/37] Update o1-mini_review.py --- .github/workflows/o1-mini_review.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/o1-mini_review.py b/.github/workflows/o1-mini_review.py index 0b5f9490..252df605 100644 --- a/.github/workflows/o1-mini_review.py +++ b/.github/workflows/o1-mini_review.py @@ -34,6 +34,8 @@ ) review_text = completion.choices[0].message.content -# 4. Публикация комментария в PR через GitHub API +print("Review text:") +print(review_text) + comment_url = f"https://api.github.com/repos/{repo}/issues/{pr_number}/comments" requests.post(comment_url, headers={"Authorization": f"Bearer {os.environ['GITHUB_TOKEN']}"}, json={"body": review_text}) From 5b69a255070561809394c16f0133cc8b03768477 Mon Sep 17 00:00:00 2001 From: Gleb Alekseev Date: Sat, 15 Mar 2025 15:18:23 +0400 Subject: [PATCH 16/37] Update o1-mini_review.py --- .github/workflows/o1-mini_review.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/o1-mini_review.py b/.github/workflows/o1-mini_review.py index 252df605..d5a5a629 100644 --- a/.github/workflows/o1-mini_review.py +++ b/.github/workflows/o1-mini_review.py @@ -29,9 +29,9 @@ model=model_name, messages=[ {"role": "user", "content": prompt} - ], - max_completion_tokens=1000 + ] ) + review_text = completion.choices[0].message.content print("Review text:") From eceab269671a6d0e20735ff110538b1d36f5bee6 Mon Sep 17 00:00:00 2001 From: Gleb Alekseev Date: Sat, 15 Mar 2025 15:38:18 +0400 Subject: [PATCH 17/37] prompt fix --- .github/workflows/o1-mini_review.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/o1-mini_review.py b/.github/workflows/o1-mini_review.py index d5a5a629..8fc478aa 100644 --- a/.github/workflows/o1-mini_review.py +++ b/.github/workflows/o1-mini_review.py @@ -15,7 +15,8 @@ prompt = ( "Do code review and analyze code changes " "Provide clear, actionable, and concise feedback with concrete suggestions for improvement where necessary. " - "Avoid unnecessary elaboration, but ensure that critical details are clearly explained. " + "Avoid unnecessary elaboration, be brief, but ensure that critical details are clearly explained. " + "Avoid giving general recommendations, not related to code fixes or improvements. " "Focus on:\n" "- Potential bugs and security vulnerabilities\n" "- Conformance to coding style and best practices\n" From dfab6598d901d263af31db80b2670b044fadf0ee Mon Sep 17 00:00:00 2001 From: Gleb Alekseev Date: Sat, 15 Mar 2025 16:27:31 +0400 Subject: [PATCH 18/37] Update o1-mini_review.py --- .github/workflows/o1-mini_review.py | 146 +++++++++++++++++++++------- 1 file changed, 112 insertions(+), 34 deletions(-) diff --git a/.github/workflows/o1-mini_review.py b/.github/workflows/o1-mini_review.py index 8fc478aa..44294085 100644 --- a/.github/workflows/o1-mini_review.py +++ b/.github/workflows/o1-mini_review.py @@ -1,42 +1,120 @@ -import os, requests, openai +import os +import requests +import openai +import logging +# Configure logging +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' +) +logger = logging.getLogger('pr_review_bot') + +# Extract PR number from github environment +def get_pr_number(github_ref): + parts = github_ref.split("/") + if len(parts) >= 3 and parts[1] == "pull": + pr_number = parts[2] + else: + raise ValueError(f"Unexpected GITHUB_REF format: {github_ref}") + return pr_number + +# Fetch PR code diff +def fetch_diff(pr_url, github_token): + headers = { + "Authorization": f"Bearer {github_token}", + "Accept": "application/vnd.github.v3.diff" + } + diff_response = requests.get(pr_url, headers=headers) + if diff_response.status_code != 200: + raise RuntimeError(f"Failed to fetch PR diff: {diff_response.status_code} {diff_response.text}") + return diff_response.text + +# Fetch PR description +def fetch_pr_description(pr_url, github_token): + json_headers = { + "Authorization": f"Bearer {github_token}", + "Accept": "application/vnd.github.v3+json" + } + pr_details_response = requests.get(pr_url, headers=json_headers) + pr_data = pr_details_response.json() + pr_title = pr_data.get("title", "(no title)") + pr_body = pr_data.get("body", "(no body)") + return pr_title, pr_body + +def generate_review(diff_text, pr_title, pr_body): + logger.info("Generating code review") + # OpenAI API call + prompt = ( + "Do code review and analyze code changes " + "Provide clear, actionable, and concise feedback with concrete suggestions for improvement where necessary. " + "Avoid unnecessary elaboration, be brief, but ensure that critical details are clearly explained. " + "Avoid giving general recommendations, not related to code fixes or improvements. " + "Focus on:\n" + "- Potential bugs and security vulnerabilities\n" + "- Conformance to coding style and best practices\n" + "- Opportunities for performance or maintainability improvements\n" + "\n" + f"PR Title:\n{pr_title}\n" + f"PR Description:\n{pr_body}\n" + f"Diff:\n{diff_text}" + ) + + model_name = "o1-mini" + try: + completion = openai.chat.completions.create( + model=model_name, + messages=[ + {"role": "user", "content": prompt} + ] + ) + except Exception as e: + logger.error(f"Failed to generate review: {e}") + raise RuntimeError(f"Failed to generate review: {e}") + finally: + return completion.choices[0].message.content + +# Post review as a comment +def post_review_comment(repo, pr_number, review_text, github_token): + logger.info(f"Posting review comment for PR #{pr_number}") + comment_url = f"https://api.github.com/repos/{repo}/issues/{pr_number}/comments" + comment_headers = {"Authorization": f"Bearer {github_token}"} + response = requests.post(comment_url, headers=comment_headers, json={"body": review_text}) + if response.status_code != 201: + logger.error(f"Failed to post comment: {response.status_code} {response.text}") + return False + else: + logger.info("Successfully posted review comment") + return True + +# Action start +logger.info("Starting PR review workflow") + +# Get environment variables repo = os.environ.get("GITHUB_REPOSITORY") -pr_number = os.environ.get("GITHUB_REF", "").split("/")[-2] # извлекаем номер PR из ссылки вида "refs/pull/123/merge" +github_ref = os.environ.get("GITHUB_REF") +github_token = os.environ.get("GITHUB_TOKEN") openai.api_key = os.environ["OPENAI_API_KEY"] -pr_url = f"https://api.github.com/repos/{repo}/pulls/{pr_number}" -headers = { - "Authorization": f"Bearer {os.environ['GITHUB_TOKEN']}", - "Accept": "application/vnd.github.v3.diff" -} -diff_response = requests.get(pr_url, headers=headers) -diff_text = diff_response.text - -prompt = ( - "Do code review and analyze code changes " - "Provide clear, actionable, and concise feedback with concrete suggestions for improvement where necessary. " - "Avoid unnecessary elaboration, be brief, but ensure that critical details are clearly explained. " - "Avoid giving general recommendations, not related to code fixes or improvements. " - "Focus on:\n" - "- Potential bugs and security vulnerabilities\n" - "- Conformance to coding style and best practices\n" - "- Opportunities for performance or maintainability improvements\n" - "\n" - f"Diff:\n{diff_text}" -) +# Check if required environment variables exist +if not repo or not github_ref or not github_token: + logger.critical("Missing required environment variables") + raise ValueError("Missing required environment variables: GITHUB_REPOSITORY, GITHUB_REF, or GITHUB_TOKEN") -model_name = "o1-mini" -completion = openai.chat.completions.create( - model=model_name, - messages=[ - {"role": "user", "content": prompt} - ] -) +# Get PR ids +pr_number = get_pr_number(github_ref) +logger.info(f"Processing PR #{pr_number}") +pr_url = f"https://api.github.com/repos/{repo}/pulls/{pr_number}" -review_text = completion.choices[0].message.content +# Fetch PR details +logger.info("Fetching PR diff") +diff_text = fetch_diff(pr_url, github_token) +logger.info("Fetching PR description") +pr_title, pr_body = fetch_pr_description(pr_url, github_token) -print("Review text:") -print(review_text) +# Generate review with AI +review_text = generate_review(diff_text, pr_title, pr_body) -comment_url = f"https://api.github.com/repos/{repo}/issues/{pr_number}/comments" -requests.post(comment_url, headers={"Authorization": f"Bearer {os.environ['GITHUB_TOKEN']}"}, json={"body": review_text}) +# Post the review +post_review_comment(repo, pr_number, review_text, github_token) +logger.info("PR review workflow completed") From aa3502d0842b3270c4ed473e3d2181195b864341 Mon Sep 17 00:00:00 2001 From: Gleb Alekseev Date: Sat, 15 Mar 2025 16:31:20 +0400 Subject: [PATCH 19/37] bug fix --- .github/workflows/o1-mini_review.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/o1-mini_review.py b/.github/workflows/o1-mini_review.py index 44294085..87a2e0a9 100644 --- a/.github/workflows/o1-mini_review.py +++ b/.github/workflows/o1-mini_review.py @@ -71,8 +71,8 @@ def generate_review(diff_text, pr_title, pr_body): except Exception as e: logger.error(f"Failed to generate review: {e}") raise RuntimeError(f"Failed to generate review: {e}") - finally: - return completion.choices[0].message.content + + return completion.choices[0].message.content # Post review as a comment def post_review_comment(repo, pr_number, review_text, github_token): From e49d4519ad89493cf98ecb21d74cb0b38760b1e8 Mon Sep 17 00:00:00 2001 From: Gleb Alekseev Date: Sat, 15 Mar 2025 16:34:56 +0400 Subject: [PATCH 20/37] refactoring --- .github/{workflows => scripts}/gpt-4o_review.py | 0 .github/{workflows => scripts}/o1-mini_review.py | 0 .github/workflows/{chatgpt-review.yml => ai-review.yml} | 6 +++--- 3 files changed, 3 insertions(+), 3 deletions(-) rename .github/{workflows => scripts}/gpt-4o_review.py (100%) rename .github/{workflows => scripts}/o1-mini_review.py (100%) rename .github/workflows/{chatgpt-review.yml => ai-review.yml} (84%) diff --git a/.github/workflows/gpt-4o_review.py b/.github/scripts/gpt-4o_review.py similarity index 100% rename from .github/workflows/gpt-4o_review.py rename to .github/scripts/gpt-4o_review.py diff --git a/.github/workflows/o1-mini_review.py b/.github/scripts/o1-mini_review.py similarity index 100% rename from .github/workflows/o1-mini_review.py rename to .github/scripts/o1-mini_review.py diff --git a/.github/workflows/chatgpt-review.yml b/.github/workflows/ai-review.yml similarity index 84% rename from .github/workflows/chatgpt-review.yml rename to .github/workflows/ai-review.yml index e877c2af..a5707f46 100644 --- a/.github/workflows/chatgpt-review.yml +++ b/.github/workflows/ai-review.yml @@ -1,4 +1,4 @@ -name: ChatGPT Code Review +name: AI Code Review # Даем разрешения на чтение кода и запись комментариев к PR​:contentReference[oaicite:1]{index=1} permissions: @@ -19,8 +19,8 @@ jobs: - name: Install dependencies run: pip install openai requests - - name: Run ChatGPT code review script + - name: Run AI code review script env: OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: python3 .github/workflows/o1-mini_review.py + run: python3 .github/scripts/o1-mini_review.py From 1c7d074609a1c875dc5a7a8d91cd81be6c444b2d Mon Sep 17 00:00:00 2001 From: Gleb Alekseev Date: Sat, 15 Mar 2025 16:52:14 +0400 Subject: [PATCH 21/37] refactoring --- .github/scripts/gpt-4o_review.py | 52 ----------------------------- .github/scripts/o1-mini_review.py | 55 +++++++++++++++++++++++++++---- .github/workflows/ai-review.yml | 1 + 3 files changed, 50 insertions(+), 58 deletions(-) delete mode 100644 .github/scripts/gpt-4o_review.py diff --git a/.github/scripts/gpt-4o_review.py b/.github/scripts/gpt-4o_review.py deleted file mode 100644 index d46d1a91..00000000 --- a/.github/scripts/gpt-4o_review.py +++ /dev/null @@ -1,52 +0,0 @@ -import os -import requests -import openai - -# Exctracts PR number from the link like "refs/pull/123/merge" -pr_number = os.environ.get("GITHUB_REF", "").split("/")[-2] - -repo = os.environ.get("GITHUB_REPOSITORY") -openai.api_key = os.environ["OPENAI_API_KEY"] - -pr_url = f"https://api.github.com/repos/{repo}/pulls/{pr_number}" -headers = { - "Authorization": f"Bearer {os.environ['GITHUB_TOKEN']}", - "Accept": "application/vnd.github.v3.diff" -} -diff_response = requests.get(pr_url, headers=headers) -diff_text = diff_response.text - -prompt = ( - "You are acting as an advanced code review assistant. Below is a diff from a Pull Request. " - "Please analyze these changes in detail and provide a constructive critique. Focus on:\n" - "- Potential bugs and security vulnerabilities\n" - "- Conformance to coding style and best practices\n" - "- Opportunities for performance or maintainability improvements\n" - "\n" - f"Diff:\n{diff_text}" -) - -dev_prompt = ( - "You are a highly experienced senior software engineer and code reviewer with deep " - "expertise across various programming languages and frameworks " - "(including Solidity, JavaScript/TypeScript, and Rust). " - "Your role is to thoroughly analyze code changes, focusing on correctness, security, " - "maintainability, and adherence to best practices. Provide clear, actionable, and concise " - "feedback with concrete suggestions for improvement where necessary. Avoid unnecessary elaboration, " - "but ensure that critical details are clearly explained." -) - -model_name = "gpt-4o" -completion = openai.chat.completions.create( - model=model_name, - messages=[ - {"role": "developer", "content": dev_prompt}, - {"role": "user", "content": prompt} - ], - temperature=0.3, - max_completion_tokens=1000 -) -review_text = completion.choices[0].message.content - -comment_url = f"https://api.github.com/repos/{repo}/issues/{pr_number}/comments" -requests.post(comment_url, headers={"Authorization": f"Bearer {os.environ['GITHUB_TOKEN']}"}, json={"body": review_text}) diff --git a/.github/scripts/o1-mini_review.py b/.github/scripts/o1-mini_review.py index 87a2e0a9..89c18b50 100644 --- a/.github/scripts/o1-mini_review.py +++ b/.github/scripts/o1-mini_review.py @@ -10,6 +10,10 @@ ) logger = logging.getLogger('pr_review_bot') +# Define model arrays +REGULAR_MODELS = ["gpt-3.5-turbo", "gpt-4o"] +REASONING_MODELS = ["o1-mini"] + # Extract PR number from github environment def get_pr_number(github_ref): parts = github_ref.split("/") @@ -42,9 +46,8 @@ def fetch_pr_description(pr_url, github_token): pr_body = pr_data.get("body", "(no body)") return pr_title, pr_body -def generate_review(diff_text, pr_title, pr_body): - logger.info("Generating code review") - # OpenAI API call +def generate_review_regular(diff_text, pr_title, pr_body, model_name): + logger.info(f"Generating code review with regular model: {model_name}") prompt = ( "Do code review and analyze code changes " "Provide clear, actionable, and concise feedback with concrete suggestions for improvement where necessary. " @@ -60,7 +63,6 @@ def generate_review(diff_text, pr_title, pr_body): f"Diff:\n{diff_text}" ) - model_name = "o1-mini" try: completion = openai.chat.completions.create( model=model_name, @@ -74,6 +76,46 @@ def generate_review(diff_text, pr_title, pr_body): return completion.choices[0].message.content +def generate_review_reasoning(diff_text, pr_title, pr_body, model_name): + logger.info(f"Generating code review with reasoning model: {model_name}") + prompt = ( + "Do code review and analyze code changes. " + "Step by step:\n" + "1. Understand what the code changes are doing\n" + "2. Identify potential issues or improvements\n" + "3. Provide specific, actionable feedback\n\n" + "Focus on:\n" + "- Potential bugs and security vulnerabilities\n" + "- Conformance to coding style and best practices\n" + "- Opportunities for performance or maintainability improvements\n" + "\n" + f"PR Title:\n{pr_title}\n" + f"PR Description:\n{pr_body}\n" + f"Diff:\n{diff_text}" + ) + + try: + completion = openai.chat.completions.create( + model=model_name, + messages=[ + {"role": "user", "content": prompt} + ] + ) + except Exception as e: + logger.error(f"Failed to generate review: {e}") + raise RuntimeError(f"Failed to generate review: {e}") + + return completion.choices[0].message.content + +def generate_review(diff_text, pr_title, pr_body, model_name="o1-mini"): + if model_name in REGULAR_MODELS: + return generate_review_regular(diff_text, pr_title, pr_body, model_name) + elif model_name in REASONING_MODELS: + return generate_review_reasoning(diff_text, pr_title, pr_body, model_name) + else: + logger.warning(f"Unknown model type: {model_name}, tryinh regular review") + return generate_review_regular(diff_text, pr_title, pr_body, model_name) + # Post review as a comment def post_review_comment(repo, pr_number, review_text, github_token): logger.info(f"Posting review comment for PR #{pr_number}") @@ -95,6 +137,7 @@ def post_review_comment(repo, pr_number, review_text, github_token): github_ref = os.environ.get("GITHUB_REF") github_token = os.environ.get("GITHUB_TOKEN") openai.api_key = os.environ["OPENAI_API_KEY"] +model_name = os.environ.get("OPENAI_MODEL", "o1-mini") # Check if required environment variables exist if not repo or not github_ref or not github_token: @@ -103,7 +146,7 @@ def post_review_comment(repo, pr_number, review_text, github_token): # Get PR ids pr_number = get_pr_number(github_ref) -logger.info(f"Processing PR #{pr_number}") +logger.info(f"Processing PR #{pr_number} with model {model_name}") pr_url = f"https://api.github.com/repos/{repo}/pulls/{pr_number}" # Fetch PR details @@ -113,7 +156,7 @@ def post_review_comment(repo, pr_number, review_text, github_token): pr_title, pr_body = fetch_pr_description(pr_url, github_token) # Generate review with AI -review_text = generate_review(diff_text, pr_title, pr_body) +review_text = generate_review(diff_text, pr_title, pr_body, model_name) # Post the review post_review_comment(repo, pr_number, review_text, github_token) diff --git a/.github/workflows/ai-review.yml b/.github/workflows/ai-review.yml index a5707f46..123f47b0 100644 --- a/.github/workflows/ai-review.yml +++ b/.github/workflows/ai-review.yml @@ -23,4 +23,5 @@ jobs: env: OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + AI_MODEL: o1-mini run: python3 .github/scripts/o1-mini_review.py From 61c6b5a73458bf69f53caa386e52adbbeed76156 Mon Sep 17 00:00:00 2001 From: Gleb Alekseev Date: Sat, 15 Mar 2025 16:56:38 +0400 Subject: [PATCH 22/37] fixes --- .github/scripts/o1-mini_review.py | 2 +- .github/workflows/ai-review.yml | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/scripts/o1-mini_review.py b/.github/scripts/o1-mini_review.py index 89c18b50..4d9222c7 100644 --- a/.github/scripts/o1-mini_review.py +++ b/.github/scripts/o1-mini_review.py @@ -113,7 +113,7 @@ def generate_review(diff_text, pr_title, pr_body, model_name="o1-mini"): elif model_name in REASONING_MODELS: return generate_review_reasoning(diff_text, pr_title, pr_body, model_name) else: - logger.warning(f"Unknown model type: {model_name}, tryinh regular review") + logger.warning(f"Unknown model type: {model_name}, trying regular review") return generate_review_regular(diff_text, pr_title, pr_body, model_name) # Post review as a comment diff --git a/.github/workflows/ai-review.yml b/.github/workflows/ai-review.yml index 123f47b0..b3163d47 100644 --- a/.github/workflows/ai-review.yml +++ b/.github/workflows/ai-review.yml @@ -1,13 +1,12 @@ name: AI Code Review -# Даем разрешения на чтение кода и запись комментариев к PR​:contentReference[oaicite:1]{index=1} permissions: contents: read pull-requests: write on: pull_request: - types: [opened, reopened, synchronize] # Запуск при создании PR и каждом новом коммите​:contentReference[oaicite:2]{index=2} + types: [opened, reopened, synchronize] jobs: code_review: @@ -22,6 +21,6 @@ jobs: - name: Run AI code review script env: OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} + OPENAI_MODEL: o1-mini GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - AI_MODEL: o1-mini run: python3 .github/scripts/o1-mini_review.py From 2e9f85955dbae8df851cdb299d802fd519619dee Mon Sep 17 00:00:00 2001 From: Gleb Alekseev Date: Sat, 15 Mar 2025 17:00:29 +0400 Subject: [PATCH 23/37] fixes --- .github/scripts/o1-mini_review.py | 24 ++++++++++++++++-------- .github/workflows/ai-review.yml | 2 +- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/.github/scripts/o1-mini_review.py b/.github/scripts/o1-mini_review.py index 4d9222c7..302713b8 100644 --- a/.github/scripts/o1-mini_review.py +++ b/.github/scripts/o1-mini_review.py @@ -49,26 +49,34 @@ def fetch_pr_description(pr_url, github_token): def generate_review_regular(diff_text, pr_title, pr_body, model_name): logger.info(f"Generating code review with regular model: {model_name}") prompt = ( - "Do code review and analyze code changes " - "Provide clear, actionable, and concise feedback with concrete suggestions for improvement where necessary. " - "Avoid unnecessary elaboration, be brief, but ensure that critical details are clearly explained. " - "Avoid giving general recommendations, not related to code fixes or improvements. " - "Focus on:\n" + "You are acting as an advanced code review assistant. Below is a diff from a Pull Request. " + "Please analyze these changes in detail and provide a constructive critique. Focus on:\n" "- Potential bugs and security vulnerabilities\n" "- Conformance to coding style and best practices\n" "- Opportunities for performance or maintainability improvements\n" "\n" - f"PR Title:\n{pr_title}\n" - f"PR Description:\n{pr_body}\n" f"Diff:\n{diff_text}" ) + dev_prompt = ( + "You are a highly experienced senior software engineer and code reviewer with deep " + "expertise across various programming languages and frameworks " + "(including Solidity, JavaScript/TypeScript, and Rust). " + "Your role is to thoroughly analyze code changes, focusing on correctness, security, " + "maintainability, and adherence to best practices. Provide clear, actionable, and concise " + "feedback with concrete suggestions for improvement where necessary. Avoid unnecessary elaboration, " + "but ensure that critical details are clearly explained." + ) + try: completion = openai.chat.completions.create( model=model_name, messages=[ + {"role": "developer", "content": dev_prompt}, {"role": "user", "content": prompt} - ] + ], + temperature=0.3, + max_completion_tokens=1000 ) except Exception as e: logger.error(f"Failed to generate review: {e}") diff --git a/.github/workflows/ai-review.yml b/.github/workflows/ai-review.yml index b3163d47..c1b935a1 100644 --- a/.github/workflows/ai-review.yml +++ b/.github/workflows/ai-review.yml @@ -21,6 +21,6 @@ jobs: - name: Run AI code review script env: OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} - OPENAI_MODEL: o1-mini + OPENAI_MODEL: gpt-4o GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: python3 .github/scripts/o1-mini_review.py From b308433200837bd625b6735bc26c8819859aa7ff Mon Sep 17 00:00:00 2001 From: Gleb Alekseev Date: Sat, 15 Mar 2025 17:02:22 +0400 Subject: [PATCH 24/37] change model --- .github/workflows/ai-review.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ai-review.yml b/.github/workflows/ai-review.yml index c1b935a1..b3163d47 100644 --- a/.github/workflows/ai-review.yml +++ b/.github/workflows/ai-review.yml @@ -21,6 +21,6 @@ jobs: - name: Run AI code review script env: OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} - OPENAI_MODEL: gpt-4o + OPENAI_MODEL: o1-mini GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: python3 .github/scripts/o1-mini_review.py From 774595098348d31dd8c983cfb51e9e206a6cec4b Mon Sep 17 00:00:00 2001 From: Gleb Alekseev Date: Sat, 15 Mar 2025 17:06:33 +0400 Subject: [PATCH 25/37] renamings --- .github/scripts/{o1-mini_review.py => ai_review.py} | 0 .github/workflows/ai-review.yml | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename .github/scripts/{o1-mini_review.py => ai_review.py} (100%) diff --git a/.github/scripts/o1-mini_review.py b/.github/scripts/ai_review.py similarity index 100% rename from .github/scripts/o1-mini_review.py rename to .github/scripts/ai_review.py diff --git a/.github/workflows/ai-review.yml b/.github/workflows/ai-review.yml index b3163d47..2c816e0e 100644 --- a/.github/workflows/ai-review.yml +++ b/.github/workflows/ai-review.yml @@ -23,4 +23,4 @@ jobs: OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} OPENAI_MODEL: o1-mini GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: python3 .github/scripts/o1-mini_review.py + run: python3 .github/scripts/ai_review.py From c498fb4887461866dfa6c6f48062967820ec0596 Mon Sep 17 00:00:00 2001 From: Gleb Alekseev Date: Sat, 15 Mar 2025 18:34:28 +0400 Subject: [PATCH 26/37] prompt fix --- .github/scripts/ai_review.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/scripts/ai_review.py b/.github/scripts/ai_review.py index 302713b8..08e78f36 100644 --- a/.github/scripts/ai_review.py +++ b/.github/scripts/ai_review.py @@ -88,20 +88,20 @@ def generate_review_reasoning(diff_text, pr_title, pr_body, model_name): logger.info(f"Generating code review with reasoning model: {model_name}") prompt = ( "Do code review and analyze code changes. " - "Step by step:\n" - "1. Understand what the code changes are doing\n" - "2. Identify potential issues or improvements\n" - "3. Provide specific, actionable feedback\n\n" "Focus on:\n" "- Potential bugs and security vulnerabilities\n" "- Conformance to coding style and best practices\n" "- Opportunities for performance or maintainability improvements\n" "\n" + "Give summary of what the code changes are doing. " + "Then identify potential issues or improvements and provide specific, actionable suggestions " + "how to fix the identified issues if there are any. Avoid giving general recommendations, not related to code fixes or improvements." + "\n\n" f"PR Title:\n{pr_title}\n" f"PR Description:\n{pr_body}\n" f"Diff:\n{diff_text}" ) - + try: completion = openai.chat.completions.create( model=model_name, From e656ab9d87a64c345e666976eba05d2145d6dd3e Mon Sep 17 00:00:00 2001 From: Gleb Alekseev Date: Sat, 15 Mar 2025 19:15:15 +0400 Subject: [PATCH 27/37] Update ai_review.py --- .github/scripts/ai_review.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/scripts/ai_review.py b/.github/scripts/ai_review.py index 08e78f36..d601f98a 100644 --- a/.github/scripts/ai_review.py +++ b/.github/scripts/ai_review.py @@ -94,14 +94,15 @@ def generate_review_reasoning(diff_text, pr_title, pr_body, model_name): "- Opportunities for performance or maintainability improvements\n" "\n" "Give summary of what the code changes are doing. " - "Then identify potential issues or improvements and provide specific, actionable suggestions " - "how to fix the identified issues if there are any. Avoid giving general recommendations, not related to code fixes or improvements." + "Then identify existing issues and provide specific, actionable suggestions " + "how to fix the identified issues if there are any. " + "Avoid giving general recommendations, not related to code fixes or improvements." "\n\n" f"PR Title:\n{pr_title}\n" f"PR Description:\n{pr_body}\n" f"Diff:\n{diff_text}" ) - + try: completion = openai.chat.completions.create( model=model_name, From a52556f8b8fb87d476b00dd957230b79f81e70ee Mon Sep 17 00:00:00 2001 From: Gleb Alekseev Date: Sat, 15 Mar 2025 19:23:33 +0400 Subject: [PATCH 28/37] Update ai_review.py --- .github/scripts/ai_review.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/scripts/ai_review.py b/.github/scripts/ai_review.py index d601f98a..c223addc 100644 --- a/.github/scripts/ai_review.py +++ b/.github/scripts/ai_review.py @@ -96,7 +96,7 @@ def generate_review_reasoning(diff_text, pr_title, pr_body, model_name): "Give summary of what the code changes are doing. " "Then identify existing issues and provide specific, actionable suggestions " "how to fix the identified issues if there are any. " - "Avoid giving general recommendations, not related to code fixes or improvements." + "Be brief, avoid giving general recommendations not related to code fixes" "\n\n" f"PR Title:\n{pr_title}\n" f"PR Description:\n{pr_body}\n" From 17d6da3203382805e39798f38a5949ace6c1bb1e Mon Sep 17 00:00:00 2001 From: Gleb Alekseev Date: Sat, 15 Mar 2025 19:26:21 +0400 Subject: [PATCH 29/37] Update ai_review.py --- .github/scripts/ai_review.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/scripts/ai_review.py b/.github/scripts/ai_review.py index c223addc..15f4e4b2 100644 --- a/.github/scripts/ai_review.py +++ b/.github/scripts/ai_review.py @@ -108,7 +108,8 @@ def generate_review_reasoning(diff_text, pr_title, pr_body, model_name): model=model_name, messages=[ {"role": "user", "content": prompt} - ] + ], + max_completion_tokens=10000 ) except Exception as e: logger.error(f"Failed to generate review: {e}") From c3b2d90870dd6586bbe1ef4e14736705a646871d Mon Sep 17 00:00:00 2001 From: Gleb Alekseev Date: Sat, 15 Mar 2025 19:27:55 +0400 Subject: [PATCH 30/37] Update ai_review.py --- .github/scripts/ai_review.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/scripts/ai_review.py b/.github/scripts/ai_review.py index 15f4e4b2..f38a9a9b 100644 --- a/.github/scripts/ai_review.py +++ b/.github/scripts/ai_review.py @@ -109,7 +109,7 @@ def generate_review_reasoning(diff_text, pr_title, pr_body, model_name): messages=[ {"role": "user", "content": prompt} ], - max_completion_tokens=10000 + max_completion_tokens=5000 ) except Exception as e: logger.error(f"Failed to generate review: {e}") From 1ed47450eeca964ce887a8445356fdd3075260f0 Mon Sep 17 00:00:00 2001 From: Gleb Alekseev Date: Sat, 15 Mar 2025 19:29:05 +0400 Subject: [PATCH 31/37] Update ai_review.py --- .github/scripts/ai_review.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/scripts/ai_review.py b/.github/scripts/ai_review.py index f38a9a9b..6c9cd4d0 100644 --- a/.github/scripts/ai_review.py +++ b/.github/scripts/ai_review.py @@ -109,7 +109,7 @@ def generate_review_reasoning(diff_text, pr_title, pr_body, model_name): messages=[ {"role": "user", "content": prompt} ], - max_completion_tokens=5000 + max_completion_tokens=2000 ) except Exception as e: logger.error(f"Failed to generate review: {e}") From de00676ece9dbeb998013be63c3d50168a2b466b Mon Sep 17 00:00:00 2001 From: Gleb Alekseev Date: Sat, 15 Mar 2025 19:30:14 +0400 Subject: [PATCH 32/37] Update ai_review.py --- .github/scripts/ai_review.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/scripts/ai_review.py b/.github/scripts/ai_review.py index 6c9cd4d0..b83bf6fe 100644 --- a/.github/scripts/ai_review.py +++ b/.github/scripts/ai_review.py @@ -109,7 +109,7 @@ def generate_review_reasoning(diff_text, pr_title, pr_body, model_name): messages=[ {"role": "user", "content": prompt} ], - max_completion_tokens=2000 + max_completion_tokens=2500 ) except Exception as e: logger.error(f"Failed to generate review: {e}") From debf7f7d028fcf4ccbcc1221380b63d4e5267c95 Mon Sep 17 00:00:00 2001 From: Gleb Alekseev Date: Sat, 15 Mar 2025 19:33:03 +0400 Subject: [PATCH 33/37] Update ai_review.py --- .github/scripts/ai_review.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/scripts/ai_review.py b/.github/scripts/ai_review.py index b83bf6fe..15f4e4b2 100644 --- a/.github/scripts/ai_review.py +++ b/.github/scripts/ai_review.py @@ -109,7 +109,7 @@ def generate_review_reasoning(diff_text, pr_title, pr_body, model_name): messages=[ {"role": "user", "content": prompt} ], - max_completion_tokens=2500 + max_completion_tokens=10000 ) except Exception as e: logger.error(f"Failed to generate review: {e}") From 33feff1e3d8128e195eef9904b447cead42f1d36 Mon Sep 17 00:00:00 2001 From: Gleb Alekseev Date: Sat, 15 Mar 2025 20:18:29 +0400 Subject: [PATCH 34/37] Update ai_review.py --- .github/scripts/ai_review.py | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/scripts/ai_review.py b/.github/scripts/ai_review.py index 15f4e4b2..965b2854 100644 --- a/.github/scripts/ai_review.py +++ b/.github/scripts/ai_review.py @@ -97,6 +97,7 @@ def generate_review_reasoning(diff_text, pr_title, pr_body, model_name): "Then identify existing issues and provide specific, actionable suggestions " "how to fix the identified issues if there are any. " "Be brief, avoid giving general recommendations not related to code fixes" + "Do not recommend changes outside of the code changes in the diff." "\n\n" f"PR Title:\n{pr_title}\n" f"PR Description:\n{pr_body}\n" From 74853c9e0aaae9698c9ee31f0d646b26f7a8bb2b Mon Sep 17 00:00:00 2001 From: Gleb Alekseev Date: Sat, 15 Mar 2025 20:23:00 +0400 Subject: [PATCH 35/37] Update ai_review.py --- .github/scripts/ai_review.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/scripts/ai_review.py b/.github/scripts/ai_review.py index 965b2854..66523dbf 100644 --- a/.github/scripts/ai_review.py +++ b/.github/scripts/ai_review.py @@ -96,7 +96,7 @@ def generate_review_reasoning(diff_text, pr_title, pr_body, model_name): "Give summary of what the code changes are doing. " "Then identify existing issues and provide specific, actionable suggestions " "how to fix the identified issues if there are any. " - "Be brief, avoid giving general recommendations not related to code fixes" + "Be brief, avoid giving general recommendations not related to code fixes. " "Do not recommend changes outside of the code changes in the diff." "\n\n" f"PR Title:\n{pr_title}\n" @@ -110,7 +110,7 @@ def generate_review_reasoning(diff_text, pr_title, pr_body, model_name): messages=[ {"role": "user", "content": prompt} ], - max_completion_tokens=10000 + max_completion_tokens=4096 ) except Exception as e: logger.error(f"Failed to generate review: {e}") From 3ae5444528cdfdeefc046131739b97155cb83005 Mon Sep 17 00:00:00 2001 From: Gleb Alekseev Date: Sat, 15 Mar 2025 20:24:56 +0400 Subject: [PATCH 36/37] Update ai_review.py --- .github/scripts/ai_review.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/scripts/ai_review.py b/.github/scripts/ai_review.py index 66523dbf..aaba9512 100644 --- a/.github/scripts/ai_review.py +++ b/.github/scripts/ai_review.py @@ -109,8 +109,7 @@ def generate_review_reasoning(diff_text, pr_title, pr_body, model_name): model=model_name, messages=[ {"role": "user", "content": prompt} - ], - max_completion_tokens=4096 + ] ) except Exception as e: logger.error(f"Failed to generate review: {e}") From 761a9f018493872c3ad54d69938ffc7535567e0e Mon Sep 17 00:00:00 2001 From: Gleb Alekseev Date: Mon, 17 Mar 2025 19:34:30 +0400 Subject: [PATCH 37/37] model change --- .github/scripts/ai_review.py | 2 +- .github/workflows/ai-review.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/scripts/ai_review.py b/.github/scripts/ai_review.py index aaba9512..04da3834 100644 --- a/.github/scripts/ai_review.py +++ b/.github/scripts/ai_review.py @@ -12,7 +12,7 @@ # Define model arrays REGULAR_MODELS = ["gpt-3.5-turbo", "gpt-4o"] -REASONING_MODELS = ["o1-mini"] +REASONING_MODELS = ["o1-mini", "o1-preview"] # Extract PR number from github environment def get_pr_number(github_ref): diff --git a/.github/workflows/ai-review.yml b/.github/workflows/ai-review.yml index 2c816e0e..37a141ab 100644 --- a/.github/workflows/ai-review.yml +++ b/.github/workflows/ai-review.yml @@ -21,6 +21,6 @@ jobs: - name: Run AI code review script env: OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} - OPENAI_MODEL: o1-mini + OPENAI_MODEL: o1-preview GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: python3 .github/scripts/ai_review.py