Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Patch File Generation to AI Bot #4

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 26 additions & 16 deletions main.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,13 @@
increment_usage_limit,
is_rate_limit_reached,
reset_usage_limits,
run_query,
from utils.github_utils import (
USAGE_LIMIT,
increment_usage_limit,
is_rate_limit_reached,
reset_usage_limits,
run_query,
)
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fix the import inside import

Copy link
Author

@sweep-ai sweep-ai bot Oct 7, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚀 Wrote Changes

fix the import inside import

Hi @vivasvan1,

I decided to make the following changes:

File Path Proposed Changes
main.py Modify main.py with contents:
The user left a comment in this chunk of code:
<review_code_chunk> USAGE_LIMIT,
increment_usage_limit,
is_rate_limit_reached,
reset_usage_limits,
from utils.github_utils import (
USAGE_LIMIT,
increment_usage_limit,
is_rate_limit_reached,
reset_usage_limits,
run_query,
) <<<< COMMENT: fix the import inside import <<<<
)

app = Flask(name)

openai.api_key = OPENAI_API_KEY


# Initialize logging
logging.basicConfig(level=logging.INFO)

</review_code_chunk>.
Resolve their comment.

)

app = Flask(__name__)
Expand Down Expand Up @@ -184,17 +190,22 @@ def solve_problem(mention, issue_number, issue_description):

prompt = generate_gpt_prompt(issue_data)

out = run_query(
ai_response, patch_file = run_query(
prompt,
mention["repository"]["owner"]["login"],
mention["repository"]["name"],
)

# response = generate_response(issue_description)
# print(response)
post_comment_to_issue(
issue_number,
out,
ai_response,
mention["repository"]["owner"]["login"],
mention["repository"]["name"],
)

post_comment_to_issue(
issue_number,
patch_file,
mention["repository"]["owner"]["login"],
mention["repository"]["name"],
)
Expand Down Expand Up @@ -242,16 +253,16 @@ def respond_to_unread_issues():
post_comment_to_issue(
issue_number=issue_number,
comment_text=f"""#### 🛑 **Rate Limit Exceeded!**

⌛ **Limit:** {USAGE_LIMIT} requests / day / repository
🔒 **Refreshes In:** {int(hours)} hours, {int(minutes)} minutes

<!-- To continue using the service, please consider upgrading to our **Pro Plan**.

##### 🚀 **Upgrade to Pro**
Upgrade to the Pro Plan to enjoy enhanced access, faster response times, and priority support. Click [here](Upgrade_Link) to upgrade now! -->

📬 For any inquiries for support or rate limit extension, please contact <a href="https://discord.gg/T6Hz6zpK7D" target="_blank">Support</a>.""",
⌛ **Limit:** {USAGE_LIMIT} requests / day / repository
🔒 **Refreshes In:** {int(hours)} hours, {int(minutes)} minutes
<!-- To continue using the service, please consider upgrading to our **Pro Plan**.
##### 🚀 **Upgrade to Pro**
Upgrade to the Pro Plan to enjoy enhanced access, faster response times, and priority support. Click [here](Upgrade_Link) to upgrade now! -->
📬 For any inquiries for support or rate limit extension, please contact <a href="https://discord.gg/T6Hz6zpK7D" target="_blank">Support</a>.""",
OWNER=mention["repository"]["owner"]["login"],
REPO=mention["repository"]["name"],
)
Expand Down Expand Up @@ -287,7 +298,6 @@ def respond_to_unread_issues():
# response = generate_response(problem_description)

# # Post the response as a comment on the issue
# post_comment_to_issue(issue_number, response)

# return jsonify({"message": "Webhook processed successfully"})

Expand Down
65 changes: 65 additions & 0 deletions utils/github_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,8 @@ def setup_repo(owner, repo_name):
print("Repo already exists")


import difflib

def run_query(query: str, owner: str, repo_name: str):
setup_repo(owner, repo_name)
matched_docs = vector_store.similarity_search(
Expand All @@ -284,6 +286,69 @@ def run_query(query: str, owner: str, repo_name: str):

current_tokens = 0

for doc in matched_docs:
doc_content = doc.page_content + "\n\n"
doc_tokens = num_tokens_from_string(doc_content)
print(matched_docs.index(doc), doc_tokens)
if current_tokens + doc_tokens < MAX_TOKENS:
code_str += doc_content
current_tokens += doc_tokens
else:
break # stop adding more content if it exceeds the max token limit

template = """
You are Codebase AI. You are a super intelligent AI that answers questions about code bases.

You are:
- helpful & friendly
- good at answering complex questions in simple language
- an expert in all programming languages
- able to infer the intent of the user's question

The user will ask a question about their codebase, and you will answer it.

When the user asks their question, you will answer it by searching the codebase for the answer.

Here is the user's question and code file(s) you found to answer the question:

Question:
{query}

Code file(s):
{code}

[END OF CODE FILE(S)]w

Now answer the question using the code file(s) above.
"""

chat = ChatOpenAI(
streaming=True,
callback_manager=CallbackManager([StreamingStdOutCallbackHandler()]),
verbose=True,
temperature=0.5,
)
system_message_prompt = SystemMessagePromptTemplate.from_template(template)
chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt])
chain = LLMChain(llm=chat, prompt=chat_prompt)

print("running chain...")
ai_said = chain.run(code=code_str, query=query)
print("chain output...")

# Generate patch file
original_code = code_str.splitlines()
modified_code = code_str.replace(query, ai_said).splitlines()
diff = difflib.unified_diff(original_code, modified_code)
patch_file = '\n'.join(diff)

return ai_said, patch_file

code_str = ""
MAX_TOKENS = 3500

current_tokens = 0

for doc in matched_docs:
doc_content = doc.page_content + "\n\n"
doc_tokens = num_tokens_from_string(doc_content)
Expand Down