diff options
author | H Lohaus <hlohaus@users.noreply.github.com> | 2024-01-21 16:59:52 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-21 16:59:52 +0100 |
commit | ca6da4c858f8eb319e0b484865d2a58a78552016 (patch) | |
tree | 06f1d365c70b6bad7512743b70b5ff1deecbaecb | |
parent | Merge pull request #1489 from hlohaus/neww (diff) | |
parent | Print env (diff) | |
download | gpt4free-ca6da4c858f8eb319e0b484865d2a58a78552016.tar gpt4free-ca6da4c858f8eb319e0b484865d2a58a78552016.tar.gz gpt4free-ca6da4c858f8eb319e0b484865d2a58a78552016.tar.bz2 gpt4free-ca6da4c858f8eb319e0b484865d2a58a78552016.tar.lz gpt4free-ca6da4c858f8eb319e0b484865d2a58a78552016.tar.xz gpt4free-ca6da4c858f8eb319e0b484865d2a58a78552016.tar.zst gpt4free-ca6da4c858f8eb319e0b484865d2a58a78552016.zip |
Diffstat (limited to '')
-rw-r--r-- | .github/workflows/copilot.yml | 14 | ||||
-rw-r--r-- | etc/tool/copilot.py | 73 |
2 files changed, 57 insertions, 30 deletions
diff --git a/.github/workflows/copilot.yml b/.github/workflows/copilot.yml index 1de81cb6..a43ee19a 100644 --- a/.github/workflows/copilot.yml +++ b/.github/workflows/copilot.yml @@ -1,15 +1,17 @@ name: AI Code Reviewer on: - pull_request: + workflow_run: + workflows: ["Unittest"] types: - - opened - - synchronize + - completed jobs: review: runs-on: ubuntu-latest - permissions: write-all + permissions: + contents: read + pull-requests: write steps: - name: Checkout Repo uses: actions/checkout@v3 @@ -25,5 +27,5 @@ jobs: run: pip install PyGithub - name: AI Code Review env: - GITHUB_TOKEN: ${{ secrets.COPILOT_TOKEN }} - run: python -m etc.tool.copilot + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: env diff --git a/etc/tool/copilot.py b/etc/tool/copilot.py index 9be1291c..e8b91160 100644 --- a/etc/tool/copilot.py +++ b/etc/tool/copilot.py @@ -21,10 +21,13 @@ G4F_MODEL = os.getenv('G4F_MODEL') or g4f.models.gpt_4 def get_pr_details(github: Github) -> PullRequest: """ - Rteurns the details of the pull request from GitHub. + Retrieves the details of the pull request from GitHub. + + Args: + github (Github): The Github object to interact with the GitHub API. Returns: - PullRequest: A PullRequest instance. + PullRequest: An object representing the pull request. """ with open(os.getenv('GITHUB_EVENT_PATH', ''), 'r') as file: data = json.load(file) @@ -36,19 +39,28 @@ def get_pr_details(github: Github) -> PullRequest: def get_diff(diff_url: str) -> str: """ - Fetches the diff of the pull request. + Fetches the diff of the pull request from a given URL. Args: - pull (PullRequest): Pull request. + diff_url (str): URL to the pull request diff. Returns: - str or None: The diff of the pull request or None if not available. + str: The diff of the pull request. """ response = requests.get(diff_url) response.raise_for_status() return response.text def read_json(text: str) -> dict: + """ + Parses JSON code block from a string. + + Args: + text (str): A string containing a JSON code block. + + Returns: + dict: A dictionary parsed from the JSON code block. + """ match = re.search(r"```(json|)\n(?P<code>[\S\s]+?)\n```", text) if match: text = match.group("code") @@ -56,23 +68,33 @@ def read_json(text: str) -> dict: return json.loads(text.strip()) except json.JSONDecodeError: print("No valid json:", text) - return {} + return {} -def read_text(text: str) -> dict: +def read_text(text: str) -> str: + """ + Extracts text from a markdown code block. + + Args: + text (str): A string containing a markdown code block. + + Returns: + str: The extracted text. + """ match = re.search(r"```(markdown|)\n(?P<text>[\S\s]+?)\n```", text) if match: return match.group("text") return text -def get_ai_response(prompt, as_json: bool = True) -> Union[dict, str]: +def get_ai_response(prompt: str, as_json: bool = True) -> Union[dict, str]: """ Gets a response from g4f API based on the prompt. Args: prompt (str): The prompt to send to g4f. + as_json (bool): Whether to parse the response as JSON. Returns: - dict: The parsed response from g4f. + Union[dict, str]: The parsed response from g4f, either as a dictionary or a string. """ response = g4f.ChatCompletion.create( G4F_MODEL, @@ -80,20 +102,18 @@ def get_ai_response(prompt, as_json: bool = True) -> Union[dict, str]: G4F_PROVIDER, ignore_stream_and_auth=True ) - if as_json: - return read_json(response) - return read_text(response) + return read_json(response) if as_json else read_text(response) -def analyze_code(pull: PullRequest, diff: str)-> list: +def analyze_code(pull: PullRequest, diff: str)-> list[dict]: """ Analyzes the code changes in the pull request. Args: + pull (PullRequest): The pull request object. diff (str): The diff of the pull request. - pr_details (dict): Details of the pull request. Returns: - list: List of comments generated by the analysis. + list[dict]: A list of comments generated by the analysis. """ comments = [] changed_lines = [] @@ -122,13 +142,14 @@ def analyze_code(pull: PullRequest, diff: str)-> list: return comments -def create_prompt(changed_lines: list, pull: PullRequest, file_path: str): +def create_prompt(changed_lines: list[str], pull: PullRequest, file_path: str): """ Creates a prompt for the g4f model. Args: - diff (str): The line of code to analyze. - pr_details (dict): Details of the pull request. + changed_lines (list[str]): The lines of code that have changed. + pull (PullRequest): The pull request object. + file_path (str): The path to the file being reviewed. Returns: str: The generated prompt. @@ -159,16 +180,17 @@ Each line is prefixed by its number. Code to review: def create_review_prompt(pull: PullRequest, diff: str): """ - Creates a prompt to create a review. + Creates a prompt to create a review comment. Args: - diff (str): The line of code to analyze. + pull (PullRequest): The pull request object. + diff (str): The diff of the pull request. Returns: - str: The generated prompt. + str: The generated prompt for review. """ return f"""Your task is to review a pull request. Instructions: -- Your name / you are copilot. +- Write in name of you "g4f-copilot". - Write the review in GitHub Markdown format. - Thank the author for contributing to the project. - Point out that you might leave a few comments on the files. @@ -192,7 +214,7 @@ def main(): pull = get_pr_details(github) diff = get_diff(pull.diff_url) except Exception as e: - print(f"Error get details: {e}") + print(f"Error get details: {e.__class__.__name__}: {e}") exit(1) try: review = get_ai_response(create_review_prompt(pull, diff), False) @@ -206,7 +228,10 @@ def main(): exit(1) print("Comments:", comments) try: - pull.create_review(body=review, comments=comments) + if not comments: + pull.create_review(body=review, comments=comments) + else: + pull.create_comment(body=review) except Exception as e: print(f"Error posting review: {e}") exit(1) |