diff --git a/README.md b/README.md
index 720277a0..12252194 100644
--- a/README.md
+++ b/README.md
@@ -86,14 +86,12 @@ See the [usage guide](./Usage.md) for instructions how to run the different tool
## Table of Contents
-- [Table of Contents](#table-of-contents)
- [Overview](#overview)
- [Try it now](#try-it-now)
- [Installation](#installation)
- [How it works](#how-it-works)
- [Why use PR-Agent?](#why-use-pr-agent)
- [Roadmap](#roadmap)
-- [Similar Projects](#similar-projects)
diff --git a/pr_agent/tools/pr_code_suggestions.py b/pr_agent/tools/pr_code_suggestions.py
index ba45598e..4ba27dd8 100644
--- a/pr_agent/tools/pr_code_suggestions.py
+++ b/pr_agent/tools/pr_code_suggestions.py
@@ -48,27 +48,33 @@ class PRCodeSuggestions:
get_settings().pr_code_suggestions_prompt.user)
async def run(self):
- logging.info('Generating code suggestions for PR...')
- if get_settings().config.publish_output:
- self.git_provider.publish_comment("Preparing review...", is_temporary=True)
+ try:
+ logging.info('Generating code suggestions for PR...')
+ if get_settings().config.publish_output:
+ self.git_provider.publish_comment("Preparing review...", is_temporary=True)
- logging.info('Preparing PR review...')
- if not self.is_extended:
- await retry_with_fallback_models(self._prepare_prediction)
- data = self._prepare_pr_code_suggestions()
- else:
- data = await retry_with_fallback_models(self._prepare_prediction_extended)
+ logging.info('Preparing PR review...')
+ if not self.is_extended:
+ await retry_with_fallback_models(self._prepare_prediction)
+ data = self._prepare_pr_code_suggestions()
+ else:
+ data = await retry_with_fallback_models(self._prepare_prediction_extended)
+ if (not data) or (not 'Code suggestions' in data):
+ logging.info('No code suggestions found for PR.')
+ return
- if (not self.is_extended and get_settings().pr_code_suggestions.rank_suggestions) or \
- (self.is_extended and get_settings().pr_code_suggestions.rank_extended_suggestions):
- logging.info('Ranking Suggestions...')
- data['Code suggestions'] = await self.rank_suggestions(data['Code suggestions'])
+ if (not self.is_extended and get_settings().pr_code_suggestions.rank_suggestions) or \
+ (self.is_extended and get_settings().pr_code_suggestions.rank_extended_suggestions):
+ logging.info('Ranking Suggestions...')
+ data['Code suggestions'] = await self.rank_suggestions(data['Code suggestions'])
- if get_settings().config.publish_output:
- logging.info('Pushing PR review...')
- self.git_provider.remove_initial_comment()
- logging.info('Pushing inline code suggestions...')
- self.push_inline_code_suggestions(data)
+ if get_settings().config.publish_output:
+ logging.info('Pushing PR review...')
+ self.git_provider.remove_initial_comment()
+ logging.info('Pushing inline code suggestions...')
+ self.push_inline_code_suggestions(data)
+ except Exception as e:
+ logging.error(f"Failed to generate code suggestions for PR, error: {e}")
async def _prepare_prediction(self, model: str):
logging.info('Getting PR diff...')
diff --git a/pr_agent/tools/pr_description.py b/pr_agent/tools/pr_description.py
index 3c388eb4..d9600a2e 100644
--- a/pr_agent/tools/pr_description.py
+++ b/pr_agent/tools/pr_description.py
@@ -63,40 +63,44 @@ class PRDescription:
"""
Generates a PR description using an AI model and publishes it to the PR.
"""
- logging.info(f"Generating a PR description {self.pr_id}")
- if get_settings().config.publish_output:
- self.git_provider.publish_comment("Preparing pr description...", is_temporary=True)
- await retry_with_fallback_models(self._prepare_prediction)
+ try:
+ logging.info(f"Generating a PR description {self.pr_id}")
+ if get_settings().config.publish_output:
+ self.git_provider.publish_comment("Preparing pr description...", is_temporary=True)
- logging.info(f"Preparing answer {self.pr_id}")
- if self.prediction:
- self._prepare_data()
- else:
- return None
+ await retry_with_fallback_models(self._prepare_prediction)
- pr_labels = []
- if get_settings().pr_description.publish_labels:
- pr_labels = self._prepare_labels()
-
- if get_settings().pr_description.use_description_markers:
- pr_title, pr_body = self._prepare_pr_answer_with_markers()
- else:
- pr_title, pr_body, = self._prepare_pr_answer()
- full_markdown_description = f"## Title\n\n{pr_title}\n\n___\n{pr_body}"
-
- if get_settings().config.publish_output:
- logging.info(f"Pushing answer {self.pr_id}")
- if get_settings().pr_description.publish_description_as_comment:
- self.git_provider.publish_comment(full_markdown_description)
+ logging.info(f"Preparing answer {self.pr_id}")
+ if self.prediction:
+ self._prepare_data()
else:
- self.git_provider.publish_description(pr_title, pr_body)
- if get_settings().pr_description.publish_labels and self.git_provider.is_supported("get_labels"):
- current_labels = self.git_provider.get_labels()
- if current_labels is None:
- current_labels = []
- self.git_provider.publish_labels(pr_labels + current_labels)
- self.git_provider.remove_initial_comment()
+ return None
+
+ pr_labels = []
+ if get_settings().pr_description.publish_labels:
+ pr_labels = self._prepare_labels()
+
+ if get_settings().pr_description.use_description_markers:
+ pr_title, pr_body = self._prepare_pr_answer_with_markers()
+ else:
+ pr_title, pr_body, = self._prepare_pr_answer()
+ full_markdown_description = f"## Title\n\n{pr_title}\n\n___\n{pr_body}"
+
+ if get_settings().config.publish_output:
+ logging.info(f"Pushing answer {self.pr_id}")
+ if get_settings().pr_description.publish_description_as_comment:
+ self.git_provider.publish_comment(full_markdown_description)
+ else:
+ self.git_provider.publish_description(pr_title, pr_body)
+ if get_settings().pr_description.publish_labels and self.git_provider.is_supported("get_labels"):
+ current_labels = self.git_provider.get_labels()
+ if current_labels is None:
+ current_labels = []
+ self.git_provider.publish_labels(pr_labels + current_labels)
+ self.git_provider.remove_initial_comment()
+ except Exception as e:
+ logging.error(f"Error generating PR description {self.pr_id}: {e}")
return ""
diff --git a/pr_agent/tools/pr_reviewer.py b/pr_agent/tools/pr_reviewer.py
index b6bca536..01e3f276 100644
--- a/pr_agent/tools/pr_reviewer.py
+++ b/pr_agent/tools/pr_reviewer.py
@@ -95,28 +95,32 @@ class PRReviewer:
"""
Review the pull request and generate feedback.
"""
- if self.is_auto and not get_settings().pr_reviewer.automatic_review:
- logging.info(f'Automatic review is disabled {self.pr_url}')
- return None
- logging.info(f'Reviewing PR: {self.pr_url} ...')
+ try:
+ if self.is_auto and not get_settings().pr_reviewer.automatic_review:
+ logging.info(f'Automatic review is disabled {self.pr_url}')
+ return None
- if get_settings().config.publish_output:
- self.git_provider.publish_comment("Preparing review...", is_temporary=True)
-
- await retry_with_fallback_models(self._prepare_prediction)
-
- logging.info('Preparing PR review...')
- pr_comment = self._prepare_pr_review()
-
- if get_settings().config.publish_output:
- logging.info('Pushing PR review...')
- self.git_provider.publish_comment(pr_comment)
- self.git_provider.remove_initial_comment()
-
- if get_settings().pr_reviewer.inline_code_comments:
- logging.info('Pushing inline code comments...')
- self._publish_inline_code_comments()
+ logging.info(f'Reviewing PR: {self.pr_url} ...')
+
+ if get_settings().config.publish_output:
+ self.git_provider.publish_comment("Preparing review...", is_temporary=True)
+
+ await retry_with_fallback_models(self._prepare_prediction)
+
+ logging.info('Preparing PR review...')
+ pr_comment = self._prepare_pr_review()
+
+ if get_settings().config.publish_output:
+ logging.info('Pushing PR review...')
+ self.git_provider.publish_comment(pr_comment)
+ self.git_provider.remove_initial_comment()
+
+ if get_settings().pr_reviewer.inline_code_comments:
+ logging.info('Pushing inline code comments...')
+ self._publish_inline_code_comments()
+ except Exception as e:
+ logging.error(f"Failed to review PR: {e}")
async def _prepare_prediction(self, model: str) -> None:
"""