Skip to content

Commit

Permalink
Fix copilot env
Browse files Browse the repository at this point in the history
  • Loading branch information
hlohaus committed Jan 21, 2024
1 parent c2878fb commit f25b152
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 33 deletions.
7 changes: 6 additions & 1 deletion .github/workflows/copilot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,11 @@ on:
- opened
- synchronize

env:
COPILOT_REPOSITORY: ${{ github.repository }}
COPILOT_PR: ${{ github.ref_name }}
COPILOT_TOKEN: ${{ secrets.COPILOT_TOKEN }}

jobs:
review:
runs-on: ubuntu-latest
Expand All @@ -25,5 +30,5 @@ jobs:
run: pip install PyGithub
- name: AI Code Review
env:
GITHUB_TOKEN: ${{ secrets.COPILOT_TOKEN }}
COPILOT_TOKEN: ${{ secrets.COPILOT_TOKEN }}
run: python -m etc.tool.copilot
86 changes: 54 additions & 32 deletions etc/tool/copilot.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,85 +15,102 @@
g4f.debug.logging = True
g4f.debug.version_check = False

GITHUB_TOKEN = os.getenv('GITHUB_TOKEN')
G4F_PROVIDER = os.getenv('G4F_PROVIDER')
G4F_MODEL = os.getenv('G4F_MODEL') or g4f.models.gpt_4
GITHUB_TOKEN = os.getenv('COPILOT_TOKEN')
G4F_PROVIDER = os.getenv('COPILOT_PROVIDER')
G4F_MODEL = os.getenv('COPILOT_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)

repo = github.get_repo(f"{data['repository']['owner']['login']}/{data['repository']['name']}")
pull = repo.get_pull(data['number'])
repo = github.get_repo(os.getenv('COPILOT_REPOSITORY'))
pull = repo.get_pull(os.getenv('COPILOT_PR'))

return pull

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")
try:
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,
[{'role': 'user', 'content': prompt}],
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 = []
Expand Down Expand Up @@ -122,13 +139,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.
Expand Down Expand Up @@ -159,16 +177,17 @@ def create_prompt(changed_lines: list, pull: PullRequest, file_path: str):

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.
Expand All @@ -192,7 +211,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)
Expand All @@ -206,7 +225,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)
Expand Down

0 comments on commit f25b152

Please sign in to comment.