-
Notifications
You must be signed in to change notification settings - Fork 6
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
16 changed files
with
559 additions
and
31 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
"""Open AI API module.""" | ||
|
||
import logging | ||
|
||
import openai | ||
from django.conf import settings | ||
|
||
logger = logging.getLogger(__name__) | ||
|
||
|
||
class OpenAi: | ||
"""Open AI communication class.""" | ||
|
||
def __init__(self, model="gpt-4o-mini", max_tokens=1000, temperature=0.7, prompt=None): | ||
"""OpenAi constructor.""" | ||
self.client = openai.OpenAI( | ||
api_key=settings.OPEN_AI_SECRET_KEY, | ||
timeout=30, # In seconds. | ||
) | ||
|
||
self.max_tokens = max_tokens | ||
self.model = model | ||
self.temperature = temperature | ||
|
||
if prompt: | ||
self.set_prompt(prompt) | ||
|
||
def set_prompt(self, content): | ||
"""Set system role content.""" | ||
self.prompt = content | ||
|
||
return self | ||
|
||
def set_input(self, content): | ||
"""Set system role content.""" | ||
self.input = content | ||
|
||
return self | ||
|
||
def complete(self): | ||
"""Get API response.""" | ||
try: | ||
response = self.client.chat.completions.create( | ||
max_tokens=self.max_tokens, | ||
messages=[ | ||
{"role": "system", "content": self.prompt}, | ||
{"role": "user", "content": self.input}, | ||
], | ||
model=self.model, | ||
temperature=self.temperature, | ||
) | ||
|
||
return response.choices[0].message.content | ||
except openai.APIConnectionError: | ||
logger.exception("A connection error occurred during OpenAI API request.") | ||
except Exception: | ||
logger.exception("An error occurred during OpenAI API request.") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
48 changes: 48 additions & 0 deletions
48
backend/apps/github/management/commands/github_summarize_issues.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
"""A command to update OWASP entities related repositories data.""" | ||
|
||
import logging | ||
|
||
from django.core.management.base import BaseCommand | ||
|
||
from apps.common.open_ai import OpenAi | ||
from apps.github.models import Issue | ||
|
||
logger = logging.getLogger(__name__) | ||
|
||
|
||
class Command(BaseCommand): | ||
help = "Populated GitHub issue summary." | ||
|
||
def add_arguments(self, parser): | ||
parser.add_argument("--offset", default=0, required=False, type=int) | ||
|
||
def handle(self, *args, **options): | ||
open_ai = OpenAi() | ||
open_issues = Issue.open_issues.without_summary.order_by("-created_at") | ||
open_issues_count = open_issues.count() | ||
|
||
issues = [] | ||
offset = options["offset"] | ||
for idx, issue in enumerate(open_issues[offset:][:10]): | ||
prefix = f"{idx + offset + 1} of {open_issues_count - offset}" | ||
print(f"{prefix:<10} {issue.title}") | ||
|
||
open_ai.set_prompt( | ||
( | ||
"Summarize the following GitHub issue using imperative mood. " | ||
"Add a good amount of technical details." | ||
"Include possible first steps of tackling the problem." | ||
) | ||
if issue.project.is_code_type or issue.project.is_tool_type | ||
else ( | ||
"Summarize the following GitHub issue." | ||
"Avoid mentioning author's name or issue creation date." | ||
"Add a hint of what needs to be done if possible." | ||
) | ||
) | ||
|
||
issue.summary = open_ai.set_input(f"{issue.title}\r\n{issue.body}").complete() | ||
issues.append(issue) | ||
|
||
# Bulk save data. | ||
Issue.bulk_save(issues) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
# Generated by Django 5.1.1 on 2024-09-12 19:39 | ||
|
||
from django.db import migrations, models | ||
|
||
|
||
class Migration(migrations.Migration): | ||
dependencies = [ | ||
("github", "0001_initial"), | ||
] | ||
|
||
operations = [ | ||
migrations.AddField( | ||
model_name="issue", | ||
name="summary", | ||
field=models.TextField(default="", max_length=3000, verbose_name="Summary"), | ||
), | ||
] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
"""GitHub app issue managers.""" | ||
|
||
from django.db import models | ||
|
||
|
||
class OpenIssueManager(models.Manager): | ||
"""Open issues.""" | ||
|
||
def get_queryset(self): | ||
"""Get queryset.""" | ||
return ( | ||
super() | ||
.get_queryset() | ||
.select_related( | ||
"repository", | ||
) | ||
.filter( | ||
repository__project__isnull=False, | ||
state="open", | ||
) | ||
) | ||
|
||
@property | ||
def without_summary(self): | ||
"""Return issues without summary.""" | ||
return self.get_queryset().filter(summary="") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.